我正在尝试为现有的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)任何帮助都将受到赞赏。谢谢!
答案 0 :(得分:0)
使Identifier
成为解析器规则而不是词法分析器规则。这样,词法分析器始终将x
与Rep
匹配,即使它包含在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