为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

回首忆惘然 2022-12-15 10:58:46
我在语法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};和匹配该规则的输入,事件将按以下顺序发生:

  1. 应用规则b并执行其操作(如果有)。

  2. 应用规则c并执行其操作(如果有)。

  3. 该操作action已执行并能够访问bc规则的结果(包括由它们的操作设置的任何内容,这就是为什么那些先运行很重要的原因)。

如果您有a: b {action} c;,则操作将在 之后b但之前执行c(因此将无法访问c的结果)。

因此,对于您的代码,这意味着 的操作先于和的操作initExpression运行,这就是未设置变量的原因。您可以通过移动操作来解决问题,以便在解析所需部分(即/ )后直接发生。classifierContextattributeContextclassNameattributeName

您也可以完全摆脱变量,而是通过从祖父母上下文中获取所需信息来获取所需信息。


查看完整回答
反对 回复 2022-12-15
  • 1 回答
  • 0 关注
  • 117 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号