antlr标识符名称与预定义的函数名称相同,原因是MismatchedTokenException

时间:2013-02-14 20:37:51

标签: java antlr antlr3

我已经定义了一个ANTLR语法:

grammar test5;

stats_statement
:   
    STATS IDENT ASSIGN_SYM functions_stats

;

functions_stats 

:   COUNT LPAREN IDENT RPAREN   
;

STATS
:   'STATS'
;   

COUNT
:   'count'
;   

IDENT
:   (LETTER | '_') (LETTER | DIGIT | '_')*
;   

ASSIGN_SYM
: ':='
;

COMMA_SYM
: ','
;

SEMI_SYM
: ';'
;

LPAREN 
: '(' ;

RPAREN 
: ')' ;

fragment 
LETTER : ('a'..'z' | 'A'..'Z') ;

fragment 
DIGIT : '0'..'9';

有一个内置函数“count”。但是,如果我使用以下测试字符串:

STATS count:=count(col1)

解析器将返回错误说明:

mismatched input 'count' expecting IDENT

有关如何解决此问题的任何线索和/或提示?

由于 查尔斯

2 个答案:

答案 0 :(得分:1)

创建与identIDENT匹配的COUNT规则,并在解析器规则中使用该规则(而不是使用IDENT):

stats_statement
 : STATS ident ASSIGN_SYM functions_stats
 ;

functions_stats 
 :   COUNT LPAREN ident RPAREN   
 ;

ident
 : COUNT
 | IDENT
 ;

答案 1 :(得分:0)

你真的需要在词法分析器中识别COUNT吗?考虑定义一种更通用的方法来匹配函数。

function 
  :   fn=IDENT LPAREN IDENT (',' IDENT)* RPAREN   
  ;

然后,您可以添加一个操作来处​​理您的语义,例如在表中查找函数名称并确保它具有正确数量的参数等。

如果这与您需要执行的操作不符,您可以取消COUNT规则并重写functions_stats规则:

functions_stats 
  :   {input.LT(1).getText().equals("count")}? IDENT LPAREN IDENT RPAREN   
  ;

{...}?是一种消除歧义的语义谓词(参见Terence Parr的The Definitive ANTLR Reference第295页)。只有当它的计算结果为真,才会匹配。 ANTLR 3有一个名为“提升的语义谓词”的功能,它基本上意味着将语义谓词放入functions_stats的适当调用者中,以便使用信息来决定要解析的内容。

本书的第296页有一个名为“关键字作为变量”的部分,以下是该章的示例代码:http://media.pragprog.com/titles/tpantlr/code/predicates/keywords/Pred.g,可能会让您更好地理解。

如果您正在进行高级ANTLR工作,本书本身非常有用。在线文档没有很好地介绍这些内容。