2015-12-24 4 views
0

Я не уверен, что не так в грамматике ниже, был бы признателен за любую помощь. Я упростил запрос для цели ответа, но попытался получить ключевое слово поиска без пробелов, в свою очередь, я вернул строку, но все пробелы удалены. Например, если я передаю свой поисковый запрос как «Лучшая покупка», я получаю BestBuy взамен.Сохранять пробелы между тегами

Ниже упрощенной грамматикой, я хочу, чтобы извлечь точные слова/фразы, которая включает пробелы, запятая и т.д., указанный в блоке ключевых слов

Поиск Синтаксис

СЛОВО = [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 

ответ

-1

Я не уверен, что именно вы просите, но до того, как я понял, при написании вашего регулярного выражения '\ s' в regex. \ s для белого пространства, например: [a-za-Z0-9 \ s]

+0

Спасибо Притам за ваш ответ. Я попытался использовать подход с регулярным выражением, но это не решает мою проблему. Проблема заключается в том, что при автоматическом анализе пространство автоматически уменьшается, например, когда я передаю этот ввод «Pritam Narkhede» во время разбора, я получаю «PritamNarkhede», поэтому ANTLR-парсер пропускает пробелы даже хотя в моем идентификаторе правила я специально упомянул о захвате WS. Надеюсь, это прояснится. В очередной раз благодарим за помощь. – GammaVega

1

Это действительно не так сложно все вытащить. Вы можете использовать свою грамматику для анализа ввода. Пробелы пропускаются в соответствии с вашим правилом lexer WS. Однако, чтобы восстановить исходный вход, вы можете использовать сгенерированные токены, которые содержат индекс в поток входных токенов. Используйте их для поиска входного потока в нужное положение, а затем итерации по всем следующим маркерам (независимо от канала), пока не найдете окончательный токен (например, «['и']»). Таким образом, вы получаете именно то, что было подано.

Смежные вопросы