2013-02-21 91 views
7

我正在擴展baseClass Listener,並試圖讀取一些值,但似乎沒有順序中的任何層次結構。ANTLR4:樹構建

一個砍下我的語法的版本如下:

start: config_options+ 
config_options: (KEY) EQUALS^ (PATH | ALPHANUM) (' '|'\r'|'\n')* ; 

KEY: 'key' ; 
EQUALS: '=' ; 
ALPHANUM: [0-9a-zA-Z]+ ; 

但是這種實現的解析樹平在config_options水平(終端層面)iethe規則的開始具有config_options的很多孩子,但EQUALS不是config_options的子樹的根,所有的TOKENS都有規則config_options作爲根節點。我怎樣才能讓其中一個終端成爲根節點呢?

在這個特定的規則中,我不希望任何空格被捕獲,我知道有 - > skip指示詞法分析器,但有些情況下我確實需要空間。即字符串 '「(ALPHANUM |' ')''

(注:^似乎不工作)

一個例子輸入:

鍵= ABCDEFG

鍵= 90weata

鍵= acbefg9

所有我想要做的就是提取鍵和值對。我期望'='是根,兩個孩子將是關鍵和價值。

回答

7

當生成你的語法,您應在使用^運營商,這是在ANTLR ANTLR 4.取出4中得到一個語法錯誤產生解析樹的這些隱含規則定義的根在你的語法中。換句話說,對於您在解析樹節點之上給出的語法將是startconfig_options

生成config_options規則將返回一個實例的Config_optionsContext,它包含以下方法:

  • KEY()返回該KEY令牌TerminalNode
  • EQUALS()(同爲EQUALS令牌)
  • PATH()(同爲PATH令牌)
  • ALPHANUM()(同爲ALPHANUM令牌)

您可以撥打getSymbol()TerminalNode得到Token實例。

+0

您將如何定義終端之間的關係?即得到等號的孩子。或者這在ANTLR4中不是一個有效的想法? 有沒有辦法創建一個AST而不是一個分析樹? – Har 2013-02-22 09:42:54

+1

@ user1932405,創建一個額外的規則,例如'value':'config_options:KEY EQUALS value;值:(PATH | ALPHANUM)('''''''''''n')*;' – 2013-02-22 11:04:49

+0

噢好吧,謝謝你,所以我不得不根據分析規則創建AST而不是令牌。 – Har 2013-02-22 15:11:25