我已经编写了一个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')
;
谢谢, 斯特
答案 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: