繁体   English   中英

如何保持变量中的规则值并在ANTLR语法中重用它?

[英]How to keep a value taken from a rule in a variable and reuse it in the ANTLR grammar?

我在我的语法, vAttributeNamevClassName中声明了String变量,并为它们分配了标记的文本值: classNameattributeName 当我使用其中一个通常应该在错误替代中包含值的变量时,在另一个规则中,它会在消息中返回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");}

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

我已预料到的信息是: “Corriger - L'attribut DE L'entité 汽车 NE对应PAS”。

但是,实际的消息是: “Corriger - L'attribut DE L'entité NE对应PAS”。

如果你有一个像a: bc {action}; 以及与该规则匹配的输入,事件将按以下顺序发生:

  1. 应用规则b ,如果有规则b则执行其操作。
  2. 应用规则c ,如果有规则c则执行其操作。
  3. 执行操作action并且能够访问bc规则的结果(包括由其操作设置的任何内容,这就是为什么首先运行它们的重要性)。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM