无法弄清楚语法调整

时间:2014-09-18 07:48:14

标签: antlr4

我正在尝试为现有的DSL构建v4语法,并且有点超出我的深度。我已经尝试过所有我想不到的运气。我们可以使用foo(param1, param2);这样的函数调用,我已经工作了。有一个像foo(y, z) x 100;这样的可选构造,意味着调用fx 100次(x是文字标记,很棒的选择呃!)这就是我无法工作的东西。

我的func_call现在看起来像这样:func_call: Identifier '(' arg_list ')';

添加(('x'|'X') expr)?及其变体不起作用。它开始被名为x的变量搞糊涂。

如果有帮助,这种语言的旧yacc语法有:rep: func_call REP expr;(其中REP是x)任何帮助都将受到赞赏。谢谢!

1 个答案:

答案 0 :(得分:0)

使Identifier成为解析器规则而不是词法分析器规则。这样,词法分析器始终将xRep匹配,即使它包含在identifier中也是如此。这是一个解决方案:

grammar Foo;

func_call : identifier '(' arg_list? ')' (Rep expr)? ;
arg_list : identifier (',' identifier)* ;
expr : //TODO implement
     ;

identifier :  idFront (idFront | Digit)* ;
idFront : Rep | OtherThanRep | '_' ;

Digit : [0-9] ;
Rep : 'x' | 'X';
OtherThanRep : [a-wA-W] | 'y' | 'z' | 'Y' | 'Z' ;

WS : [ \t\f\r\n] ->skip;

生成的解析器成功解析x(x,x) x 100

enter image description here