[英]How to keep a value taken from a rule in a variable and reuse it in the ANTLR grammar?
我在我的语法, 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");}
我正在尝试解析一个描述具有false值属性的类的表达式。
我已预料到的信息是: “Corriger - L'attribut 座 DE L'entité 汽车 NE对应PAS”。
但是,实际的消息是: “Corriger - L'attribut 空 DE L'entité 空 NE对应PAS”。
如果你有一个像a: bc {action};
以及与该规则匹配的输入,事件将按以下顺序发生:
b
,如果有规则b
则执行其操作。 c
,如果有规则c
则执行其操作。 action
并且能够访问b
和c
规则的结果(包括由其操作设置的任何内容,这就是为什么首先运行它们的重要性)。 如果您有a: b {action} c;
相反,那么动作将在b
之后但在c
之前执行(因此将无法访问c
的结果)。
因此,对于您的代码,这意味着initExpression
的操作在classifierContext
和attributeContext
的操作之前运行,这就是未设置变量的原因。 您可以通过移动操作来解决问题,以便在解析所需的部分(即className
/ attributeName
)之后直接发生。
您也可以完全摆脱变量,而是通过从祖父母的上下文中获取所需的信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.