ANTLR3,上下文敏感的重写规则

时间:2012-08-23 12:29:58

标签: antlr antlr3

我已经编写了一个ANTLR语法,现在正在从中构建一个AST。手头的问题是,应根据上下文从规则生成不同的子树。 Googeling给了我这个:

http://www.antlr.org/wiki/display/~admin/2008/04/11/Rewrite+rules#Rewriterules-Grammaticalcontext

但我无法从这些示例中获得正确的语法。所以问题是:在ANTRL3.4中使用上下文敏感的重写的正确语法是什么(使用C-target,如果这些信息有用)?

这里有一个最小的例子,我的一个非工作试验让它发挥作用:

grammar foo;

tokens {
    A;
    B;
}

start
    :   a
    |   b
    ;

a
    :   foo
    ;

b   :   foo
    ;

foo
    :
    [... a foo]: 'x' -> ^(A 'x')
    [... b foo]: 'x' -> ^(B 'x')
    ;

谢谢, 斯特

1 个答案:

答案 0 :(得分:2)

这个wiki-entry并不是很清楚,但是大多数语法都是无效的:他们的想法是有些人进入ANTLR,但其中一些没有(...没有“T)。

要确定哪个foo ,您可以在foo添加一个参数并在重写规则中检查该参数:

grammar T;

options {
  // tested with Java, not C, but C should also work "as is"
  //language=C; 
  output=AST;
}

tokens {
  A;
  B;
}

parse
 : (a | b)+ EOF!
 ;

a
 : 'a' foo[1] -> foo
 ;

b
 : 'b' foo[2] -> foo
 ;

foo[int param]
 : 'x' -> {param==1}? ^(A 'x')
       ->             ^(B 'x')
 ;

SPACE : ' ' {$channel=HIDDEN;};

解析输入"a x b x"将导致以下AST:

enter image description here