2013-02-21 194 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