[英]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.