我在語法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};
和匹配該規則的輸入,事件將按以下順序發生:
應用規則
b
并執行其操作(如果有)。應用規則
c
并執行其操作(如果有)。該操作
action
已執行并能夠訪問b
和c
規則的結果(包括由它們的操作設置的任何內容,這就是為什么那些先運行很重要的原因)。
如果您有a: b {action} c;
,則操作將在 之后b
但之前執行c
(因此將無法訪問c
的結果)。
因此,對于您的代碼,這意味著 的操作先于和的操作initExpression
運行,這就是未設置變量的原因。您可以通過移動操作來解決問題,以便在解析所需部分(即/ )后直接發生。classifierContext
attributeContext
className
attributeName
您也可以完全擺脫變量,而是通過從祖父母上下文中獲取所需信息來獲取所需信息。
添加回答
舉報
0/150
提交
取消