为什么词法分析器规则名称单词会导致解析错误

时间:2020-10-28 12:32:38

标签: antlr4

在下面的词法分析器中,
SELECT AAA FROM TAB
可以解析,但是
SELECT ROLE FROM TAB
无法解析,并且发生错误。
line 1:7 mismatched input 'ROLE' expecting ID

'ROLE'与词法分析器规则的名称相同的事实似乎正在引起错误。
但是我想将'ROLE'与
匹配 ID: [A-Z]+ ;
不想出错。
有什么办法可以解决这个问题?

lexer grammar TSqlLexer;

FROM:               'FROM' ;
ROLE:               'ROLE' ;
SELECT:             'SELECT' ;
SPACE:              [ \t\r\n]+    -> skip;
ID:                 [A-Z]+ ;
parser grammar TSqlParser;

options { tokenVocab=TSqlLexer; }

sql_clause       : select_statement EOF ;
select_statement : SELECT column_name FROM table_name  ;
column_name      : ID ;
table_name       : ID ;

1 个答案:

答案 0 :(得分:1)

语法分析器不驱动词法分析器。解析器尝试匹配ID都没关系,输入"ROLE"将始终成为ROLE令牌。

如果您的关键字也可以用作标识符,请改为执行以下操作:

select_statement : SELECT column_name FROM table_name  ;
column_name      : id ;
table_name       : id ;
id               : ID | ROLE ; // add more keywords if needed

FROM             : 'FROM' ;
ROLE             : 'ROLE' ;
SELECT           : 'SELECT' ;
SPACE            : [ \t\r\n]+ -> skip;
ID               : [A-Z]+ ;