antlr4 - 为什么词法分析器规则名称单词导致解析错误
问题描述
在下面的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 ;
解决方案
词法分析器不是由解析器驱动的。解析器尝试匹配 并不重要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]+ ;
推荐阅读
- python - 为什么 ipywidgets 的小部件没有在 html 文件中定义?
- c++ - 使用 Playsound c++ 在后台运行音乐
- spring-boot - Spring boot oauth2 客户端凭据使用 webflux 动态配置
- python - 切片列表以提取给定索引的最后 k 和下 k 元素
- reactjs - 在 Docker 上运行 CRA 时出现错误(0,_schemaUtils.default)不是函数
- r - 将一个字符添加到 R 中向量列表中的每个向量
- node.js - 如何将数组添加到存在于 mongodb 对象中的另一个数组中
- python - 当除两列之外的所有列的值在熊猫中匹配时,如何替换列的值?
- css - 更改伪元素的比例会稍微移动父元素
- character-encoding - PHPMailer没有正确设置标题中的字符集