3

我已经定义了一个 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

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

谢谢查尔斯

4

2 回答 2

1

创建一个与andident匹配的规则,并在解析器规则中使用该规则(而不是使用):IDENTCOUNTIDENT

stats_statement
 : STATS ident ASSIGN_SYM functions_stats
 ;

functions_stats 
 :   COUNT LPAREN ident RPAREN   
 ;

ident
 : COUNT
 | IDENT
 ;
于 2013-02-14T20:52:49.770 回答
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 工作,这本书本身就非常有用。在线文档并没有很好地涵盖这些内容。

于 2013-02-22T19:28:48.873 回答