亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何保留從變量中的規則獲取的值并在 ANTLR 語法中重用它?

如何保留從變量中的規則獲取的值并在 ANTLR 語法中重用它?

回首憶惘然 2022-12-15 10:58:46
我在語法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};和匹配該規則的輸入,事件將按以下順序發生:

  1. 應用規則b并執行其操作(如果有)。

  2. 應用規則c并執行其操作(如果有)。

  3. 該操作action已執行并能夠訪問bc規則的結果(包括由它們的操作設置的任何內容,這就是為什么那些先運行很重要的原因)。

如果您有a: b {action} c;,則操作將在 之后b但之前執行c(因此將無法訪問c的結果)。

因此,對于您的代碼,這意味著 的操作先于和的操作initExpression運行,這就是未設置變量的原因。您可以通過移動操作來解決問題,以便在解析所需部分(即/ )后直接發生。classifierContextattributeContextclassNameattributeName

您也可以完全擺脫變量,而是通過從祖父母上下文中獲取所需信息來獲取所需信息。


查看完整回答
反對 回復 2022-12-15
  • 1 回答
  • 0 關注
  • 86 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號