Antlr4 Can';我搞不懂语法调整

Antlr4 Can';我搞不懂语法调整,antlr4,Antlr4,我正试图为现有的DSL构建v4语法,但我有点不知所措。我想尽一切办法都试过了,但运气不好。我们可以有一个函数调用,比如foo(param1,param2),我一直在工作。有一个可选的构造,比如foo(y,z)x100这意味着要调用fx 100次(x是文字标记,很好的选择,嗯!)这是我无法实现的 我的func_调用现在看起来像这样:func_调用:标识符'('arg_list') 添加(('x'|'x')expr)及其变体无效。它开始被名为x的变量所迷惑 如果有帮助的话,这种语言的旧yacc语法有

我正试图为现有的DSL构建v4语法,但我有点不知所措。我想尽一切办法都试过了,但运气不好。我们可以有一个函数调用,比如
foo(param1,param2),我一直在工作。有一个可选的构造,比如
foo(y,z)x100这意味着要调用fx 100次(x是文字标记,很好的选择,嗯!)这是我无法实现的

我的func_调用现在看起来像这样:
func_调用:标识符'('arg_list')

添加
(('x'|'x')expr)
及其变体无效。它开始被名为x的变量所迷惑


如果有帮助的话,这种语言的旧yacc语法有这样的内容:
rep:func_call rep expr(其中代表为x)如有任何帮助,将不胜感激。谢谢

使
标识符
成为解析器规则而不是词法规则。这样,lexer始终将
x
作为
Rep
匹配,即使它包含在
标识符中。这里有一个解决方案:

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)x100


变量的lexer规则是什么样的?在您的DSL中,
x
是一个有效变量吗?@hendryau:以下是我的标识符的定义:
Identifier:('a'..'z''a'..'z'.'a'.'z'.'a'.'z'.'z'.'0'.'9')*太棒了!非常感谢,这似乎奏效了