Antlr 为什么解析器将命令名拆分为不同的节点
我有以下声明: =MYFUNCTION_名称(1,2,3) 我的语法是:Antlr 为什么解析器将命令名拆分为不同的节点,antlr,antlr3,Antlr,Antlr3,我有以下声明: =MYFUNCTION_名称(1,2,3) 我的语法是: grammar Expression; options { language=CSharp3; output=AST; backtrack=true; } tokens { FUNC; PARAMS; } @parser::namespace { Expression } @lexer::namespace { Expression } public parse :
grammar Expression;
options
{
language=CSharp3;
output=AST;
backtrack=true;
}
tokens
{
FUNC;
PARAMS;
}
@parser::namespace { Expression }
@lexer::namespace { Expression }
public
parse : ('=' func )*;
func : funcId '(' formalPar* ')' -> ^(FUNC funcId formalPar);
formalPar : (par ',')* par -> ^(PARAMS par+);
par : INT;
funcId : complexId+ ('_'? complexId+)*;
complexId
: ID+
| ID+DIGIT+ ;
ID : ('a'..'z'|'A'..'Z'|'а'..'я'|'А'..'Я')+;
DIGIT : ('0'..'9')+;
INT : '-'? ('0'..'9')+;
在一棵树上,我得到:
[**FUNC**]
|
[MYFUNCTION] [_] [NAME] [**PARAMS**]
为什么解析器将函数名拆分为3个节点:“MYFUNCTION”、“名称”" ? 如何修复它?分割始终基于令牌执行。由于
ID
标记不能包含
字符,因此结果是3个单独的标记,稍后由funcId
语法规则处理。要为函数名创建单个节点,您需要创建一个lexer规则,该规则可以匹配输入MYFUNCTION\u name
作为单个标记。我发现我可以使用“fragment”一词,如fragment DIGIT、fragment ID