簡體   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