2015-04-18 16 views
0

我想以某種方式在匹配的規則中存儲一個預定義類型的變量(甚至是一個對象),就像在GNU Bison中一樣,您可以在其中定義每個規則所具有的類型,並因此將關聯的構造函數和字段跟他們。ANTLR4 - 在匹配的規則中是否可以存儲特定數據類型的變量?

例如(在GNU野牛),如果我預定該varAssign規則的實例將是TokenVarAssign類型,其具有一個構造函數和兩個字段(可變標識符和賦值表達式)的,我可以做以下:

varAssign: id '=' expr {$$ = new TokenVarAssign(); $$.id = $1; $$.expr = $3;} 

$$表示當前令牌相匹配(在這種情況下,一個varAssign)和$ N代表了規則的第n個令牌。

它是否完全可以與ANTLR4實現相同(或類似)。 到目前爲止,我已經遍歷了ParserRuleContext對象的樹,解析文件並構造了我的令牌對象,結果表明它的多態性和動態性要低得多。

編輯迴應回答:用下面的語法文件,我得到的錯誤如下:

grammar Test ; 

INT: '0' .. '9' ; 
add [int x] returns [int result] : '+=' INT {$result = $x + $INT.int;} ; 

錯誤:

$ antlr4 Test.g4 
error(50): Test.g4:4:4: syntax error: '[int x]' came as a complete surprise to me while matching rule preamble 

回答

1

您可以定義和分配attributes on parse tree nodes。您可以訪問訪問者和語法文件中的屬性。

+0

謝謝!我查看了您附加的鏈接,但Antler未識別該屬性。我甚至複製了提供的示例規則,但我仍然收到以下錯誤:**語法錯誤:'[int x]'在匹配規則前導碼時完全令我驚訝** – SamTebbs33

+0

您是否可以在您的在上面張貼? – CoronA

+0

我不再能夠編輯評論,但這裏是規則:** add [int x] returns [int result]:'+ ='INT {$ result = $ x + $ INT.int;}; * * 我直接從文檔中的示例中獲得了它,並且我有一個稱爲INT的有效規則。 – SamTebbs33

相關問題