我已经定义了一个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
有关如何解决此问题的任何线索和/或提示?
由于 查尔斯
答案 0 :(得分:1)
创建与ident
和IDENT
匹配的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工作,本书本身非常有用。在线文档没有很好地介绍这些内容。