我需要解析可以使用网络协议(例如MySQL协议)提交或存储在日志文件中的SQL查询。
我构建了一个基于ANTLRv4 Tsql grammar的解析器。
以下文字在此语法中有效:
select 1
select 2
select 3
select 1 select 2 select 3
同时,它们不应对网络协议有效,因为xSQL-server将删除\n
,最终查询将等于select 1 select 2 select 3
。
是否可以创建一个可以处理这两种情况的语法?或者我应该创建和支持两个语法:第一个解析日志的语法,第二个解析网络查询? 我可以使用语义谓词来解决这个问题吗?
答案 0 :(得分:0)
我提出了两种方法:
textMode
部分的Delcare @lexer::members
旗帜。SPACE
令牌替换为以下内容:
ANTLR
Whitespace: [ \t] -> channel(HIDDEN);
Linebreak: '\r'? '\n'
{ if (textMode)
channel(HIDDEN);
else
AddParseError();
}
SELECT WS( ) NUMBER(1) WS(\n) SELECT WS( ) NUMBER(2) WS(\n) SELECT WS( ) NUMBER(2) WS(\n)
SELECT NUMBER(1) SELECT NUMBER(2) SELECT NUMBER(2)
传递给解析器。WS
或\r
在\n
令牌上添加自定义错误。答案 1 :(得分:0)
你在帖子的最后提出三个问题,但我只提供一个对我有用的答案:只需创建两个语法。它没有听起来那么糟糕,可以澄清事情。
您可以使两个语法中的所有内容相同,然后仅包含import <mysegment>
构造的不同部分。我已将此方法用于医疗HL7文件,该文件使用并重用了许多常见的段。