在下面的词法分析器中,
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 ;
答案 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]+ ;