1

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

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

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

一个最小的例子是在这里,我的一个非工作试验让它工作:

grammar foo;

tokens {
    A;
    B;
}

start
    :   a
    |   b
    ;

a
    :   foo
    ;

b   :   foo
    ;

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

谢谢,约斯特

4

1 回答 1

2

从那个 wiki 条目中并不太清楚,但大多数语法都是无效的:它们是一些想法,其中一些进入了 ANTLR,但其中一些没有(...没有)。

要确定调用了哪个规则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:

在此处输入图像描述

于 2012-08-23T17:41:57.640 回答