为什么解析器将命令名称拆分为不同的节点

时间:2013-10-02 07:41:50

标签: antlr antlr3

我有声明:

= MYFUNCTION_NAME(1,2,3)

我的语法是:

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”,“_”,“NAME”?我该如何解决?

1 个答案:

答案 0 :(得分:0)

除法总是基于令牌执行。由于ID标记不能包含_字符,因此结果是3个单独的标记,稍后由funcId语法规则处理。要为函数名创建单个节点,您需要创建一个可以将输入MYFUNCTION_NAME作为单个标记匹配的词法分析器规则。