我在语法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");}我正在尝试解析一个表达式,该表达式描述了一个具有假值属性的类。我预期的消息是:“修复 -汽车实体的座位属性不匹配”。但实际消息是:“修复 -空实体的空属性不匹配”。
1 回答
蓝山帝景
TA贡献1843条经验 获得超7个赞
如果您有类似的规则a: b c {action};和匹配该规则的输入,事件将按以下顺序发生:
应用规则
b并执行其操作(如果有)。应用规则
c并执行其操作(如果有)。该操作
action已执行并能够访问b和c规则的结果(包括由它们的操作设置的任何内容,这就是为什么那些先运行很重要的原因)。
如果您有a: b {action} c;,则操作将在 之后b但之前执行c(因此将无法访问c的结果)。
因此,对于您的代码,这意味着 的操作先于和的操作initExpression运行,这就是未设置变量的原因。您可以通过移动操作来解决问题,以便在解析所需部分(即/ )后直接发生。classifierContextattributeContextclassNameattributeName
您也可以完全摆脱变量,而是通过从祖父母上下文中获取所需信息来获取所需信息。
添加回答
举报
0/150
提交
取消
