我在語法vAttributeName和vClassName中聲明了 String 變量,并為它們分配了標(biāo)記的文本值:className和attributeName。當(dāng)我使用一個(gè)通常應(yīng)該在錯(cuò)誤替代項(xiàng)中包含值的變量時(shí),在另一個(gè)規(guī)則中,它在消息中返回 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");}我正在嘗試解析一個(gè)表達(dá)式,該表達(dá)式描述了一個(gè)具有假值屬性的類。我預(yù)期的消息是:“修復(fù) -汽車實(shí)體的座位屬性不匹配”。但實(shí)際消息是:“修復(fù) -空實(shí)體的空屬性不匹配”。
1 回答

藍(lán)山帝景
TA貢獻(xiàn)1843條經(jīng)驗(yàn) 獲得超7個(gè)贊
如果您有類似的規(guī)則a: b c {action};
和匹配該規(guī)則的輸入,事件將按以下順序發(fā)生:
應(yīng)用規(guī)則
b
并執(zhí)行其操作(如果有)。應(yīng)用規(guī)則
c
并執(zhí)行其操作(如果有)。該操作
action
已執(zhí)行并能夠訪問b
和c
規(guī)則的結(jié)果(包括由它們的操作設(shè)置的任何內(nèi)容,這就是為什么那些先運(yùn)行很重要的原因)。
如果您有a: b {action} c;
,則操作將在 之后b
但之前執(zhí)行c
(因此將無法訪問c
的結(jié)果)。
因此,對(duì)于您的代碼,這意味著 的操作先于和的操作initExpression
運(yùn)行,這就是未設(shè)置變量的原因。您可以通過移動(dòng)操作來解決問題,以便在解析所需部分(即/ )后直接發(fā)生。classifierContext
attributeContext
className
attributeName
您也可以完全擺脫變量,而是通過從祖父母上下文中獲取所需信息來獲取所需信息。
添加回答
舉報(bào)
0/150
提交
取消