2012-10-05 51 views
2

对于语法来说,如何保存生产出现的顺序。在ANTLR AST中保留生产订单

class: 'class' ID 
     '{' (fields 
     | methods) * '}'   -> ^(CLASS ID ^(FIELD fields*) ^(METHOD methods) 
     ; 

生产工作如我所料,但如果有像

class abc { 
    field 1 
    field 2 
    method 1 
    method 2 
    field 3 
    method 3 
    field 4 
} 

一类单列表中的所有字段的结束和第二列表中的方法。什么是维持秩序的正确方法?我试着做..

class: 'class' ID 
     '{' (fields    -> ^(FIELD fields) 
     | methods    -> ^(METHOD methods) 
     )* '}'     -> ^(CLASS ID $class) 
     ; 

我甚至试过,没有运气之间插入一个假人头部。

class: 'class' ID 
     '{' (fields 
     | methods) * '}'   -> ^(CLASS ID ^(FIELD fields*) ^NODE ^(METHOD methods) 
     ; 

但这没有奏效。

回答

2

在该第一情况下,CLASS节点包含一系列后面是一系列METHOD节点(METHOD methods*)的FIELD节点(FIELD fields*)的,因为生产明确指出field表达式一起处理,然后method表达式一起处理:

-> ^(CLASS ID ^(FIELD fields*) ^(METHOD methods) 

你没有提到的第二和第三种方法生产的,但它比第一个可能不太理想。

尝试用body表达,而不是下面的办法:

grammar temp; 
options {output=AST;} 
tokens { KLASS; FIELD; METHOD; } 

klass : 'class' ID body -> ^(KLASS ID body) 
     ; 

body : '{'! 
       (field | method) * 
      '}'! 
     ; 

field : 'field' INT -> ^(FIELD INT) 
     ; 

method : 'method' INT -> ^(METHOD INT) 
     ; 

ID  : ('a'..'z')+; 
INT  : ('0'..'9')+; 
WS  : (' '|'\r'|'\n')+ {$channel = HIDDEN;} ; 

,你会得到以下结果AST:

-KLASS 
    -abc 
    -FIELD 
     -1 
    -FIELD 
     -2 
    -METHOD 
     -1 
    -METHOD 
     -2 
    -FIELD 
     -3 
    -METHOD 
     -3 
    -FIELD 
     -4 

如果你想测试与ANTLRWorks语法,开(或创建)语法:

enter image description here

并按CTRL + d启动调试器(不使用的解释,这是越野车!):

enter image description here

将输入内容贴在弹出的窗口中,并确保你选择正确的起始生产规则(在这种情况下为klass)。然后按确定

当调试器启动时,按结束箭头按钮> |解析输入,然后点击AST按钮,看看AST创建解析器的样子:

enter image description here

+0

没有注意到你还张贴解答...我会删除我的自你的是正确的,并张贴在我的编辑:) –

+0

@BartKiers这是非常慷慨的,谢谢。我浪费了至少30分钟试图让ANTLRWorks工作,然后放弃并编写了我自己的测试应用程序,因此我的漂亮的ASCII输出。 :P – user1201210

+0

没问题。让我在关于如何使用ANTLRWorks进行测试的答案中添加一些额外的信息。 –