保留标签之间的空白

时间:2015-12-24 18:28:00

标签: antlr antlr4

我不确定下面的语法有什么问题,不会感谢任何帮助。我已经简化了查询的答案目的,但是尝试获取具有完整空格的搜索关键字,作为回报我确实得到了字符串,但是所有的空格都被删除了。例如,如果我将我的搜索查询作为Best Buy传递,那么我得到BestBuy作为回报。

下面是简化的语法,我想提取包含关键字块中指定的空格,逗号等的确切单词/短语

搜索语法

KEYWORD = [Best Buy] //想要保持[和]

之间的空格
identlit : RESKEYWORD OPERATOR keywordidentifier  ;  
keywordidentifier : '[' (~']') * ']';
RESKEYWORD: K E Y W O R D;
OPERATOR: [=] ;
WS : [ \t\r\n]+ -> skip ; // skip spaces, tabs, newlines

尝试了其他版本的语法但同样的问题

identlit : RESKEYWORD OPERATOR '[' keywordidentifier  ']';
keywordidentifier : KEYWORDID*;         
KEYWORDID : [a-zA-Z0-9]+ ;      // match identifiers
RESKEYWORD: K E Y W O R D;
OPERATOR: [=] ;
WS : [ \t\r\n]+ -> skip ; // skip spaces, tabs, newlines

2 个答案:

答案 0 :(得分:1)

要把一切都弄清楚真的不是那么难。您可以使用语法来解析输入。根据您的WS词法分析器规则跳过空格。但是,为了重建原始输入,您可以使用生成的标记,其中包含输入标记流的索引。使用它们将输入流搜索到正确的位置,然后迭代所有后续标记(无论通道如何),直到找到最终标记(例如'['和']')。通过这种方式,您可以得到完全正确的信息。

答案 1 :(得分:-1)

我不确定你究竟要求的是什么,但是在你写正则表达式的时候我已经理解了#39; \ s'在正则表达式。 \ s用于空格,例如:[a-za-Z0-9 \ s]