Antlr4 Can';我搞不懂语法调整
我正试图为现有的DSL构建v4语法,但我有点不知所措。我想尽一切办法都试过了,但运气不好。我们可以有一个函数调用,比如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语法有
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')*代码>太棒了!非常感谢,这似乎奏效了