首页 > 解决方案 > 为什么词法分析器规则名称单词导致解析错误

问题描述

在下面的lexer,parser中,
SELECT AAA FROM TAB
可以解析,但是
SELECT ROLE FROM TAB
不能解析,出现错误。
line 1:7 mismatched input 'ROLE' expecting ID

'ROLE' 与词法分析器规则的名称相同的事实似乎导致了错误。
但是我想将'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 ;

标签: antlr4

解决方案


词法分析器不是由解析器驱动的。解析器尝试匹配 并不重要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]+ ;

推荐阅读