如何保留从变量中的规则获取的值并在 ANTLR 语法中重用它?

我在语法vAttributeName和vClassName中声明了 String 变量,并为它们分配了标记的文本值:className和attributeName。当我使用一个通常应该在错误替代项中包含值的变量时,在另一个规则中,它在消息中返回 null ... 为什么我的变量不保留这些值?我该如何解决?


grammar TestExpression;


@parser::members {

            String vAttributeName;

            String vClassName;

            }


/* SYNTAX RULES */

textInput               : classifierContext ;

classifierContext       : 'context' c=className attributeContext {vClassName = $c.text;};

attributeContext        : '::' a=attributeName ':' dataType initDefinition {vAttributeName = $a.text;};

initDefinition          : 'init' ':' initExpression ;


initExpression          : boolExpression

                        | decimalExpression

                        | dateTimeExpression

                        | .+? {notifyErrorListeners("Corriger - "l'attribut "+vAttributeName+" de l'entité "+vClassName+" ne correspond pas");}

我正在尝试解析一个表达式,该表达式描述了一个具有假值属性的类。


我预期的消息是:“修复 -汽车实体的座位属性不匹配”。


但实际消息是:“修复 -空实体的空属性不匹配”。


回首忆惘然
浏览 119回答 1
1回答

蓝山帝景

如果您有类似的规则a: b c {action};和匹配该规则的输入,事件将按以下顺序发生:应用规则b并执行其操作(如果有)。应用规则c并执行其操作(如果有)。该操作action已执行并能够访问b和c规则的结果(包括由它们的操作设置的任何内容,这就是为什么那些先运行很重要的原因)。如果您有a: b {action} c;,则操作将在 之后b但之前执行c(因此将无法访问c的结果)。因此,对于您的代码,这意味着 的操作先于和的操作initExpression运行,这就是未设置变量的原因。您可以通过移动操作来解决问题,以便在解析所需部分(即/ )后直接发生。classifierContextattributeContextclassNameattributeName您也可以完全摆脱变量,而是通过从祖父母上下文中获取所需信息来获取所需信息。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java