ANTLR - 处理标识符中的空格

时间:2015-12-11 21:34:22

标签: antlr4

我正在尝试构建简单的搜索表达式,并且无法正确回答下面的语法。

Here are my sample search text 
LOB WHERE 
Line of Business WHERE 
Line of     Business WHERE 

正如您在上面的搜索中看到的,前几个单词反映搜索关键字后跟where条件,我想捕获可包含空格的搜索关键字。共享以下示例语法但似乎没有正确解析

sqlsyntax : identifierws 'WHERE';  
identifierws :  (WSID)+;
WSID: [a-zA-Z0-9 ] ;      // match identifiers with space
WS : [ \t\r\n]+ -> skip ; // skip spaces, tabs, newlines

对此方面的任何帮助表示赞赏。

这是我尝试解析时发生的事情 业务线WHERE

我收到以下错误 第1:0行没有可行的选择在输入'线' 我找回了LineofBusiness文本,但是空白被修剪了,我想要精确的文本业务线,这是我在苦苦挣扎的地方。

2 个答案:

答案 0 :(得分:1)

identeriferws规则正在使用所有文字。最好在词法分析器中确定关键字的识别优先级:

sqlsyntax : identifierws WHERE identifierws EQ STRING EOF ;  
identifierws :  (WSID)+;
WHERE: 'WHERE';
EQ : '=' ;
STRING : '\'' .? '\'' ;
WSID: [a-zA-Z0-9 ] ;      
WS : [ \t\r\n]+ -> skip ;

答案 1 :(得分:0)

对于这种简单的情况,我不会使用解析器。这太过分了。您需要做的就是获取输入中的当前位置,然后搜索WHERE(简单的boyer-moore搜索)。然后将起始位置和WHERE位置之间的文本作为输入。跳过WHERE并将开始位置设置为您所在的位置。之后再进行相同的搜索等。