2015-03-11 3 views
1

Я пытаюсь соответствовать такие строки в Antlr4:Matching [STRING] или [STRING]

John or apple и John Smith or apple sauce.

Я использую следующие правила:

conjunction : WORDS OR WORDS ; 
WORDS: [A-Za-z ]+ ; 
OR: ' or ' ; 

Но первый WORDS ANTLR находит также включает в себя 'или'. Таким образом, он не видит Джона и яблока в виде двух разных слов, разделенных или.

Как это исправить?

+0

Удалите пробел из регулярного выражения WORDS ('СЛОВА: [A-Za-z] +;'). – Phylogenesis

+0

Но я хочу, чтобы он мог сопоставлять пробелы. См. Мой отредактированный пост. – RaptorDotCpp

+0

Работает ли использование неживого оператора? ('СЛОВА: [A-Za-z] +?;') – Phylogenesis

ответ

2

В случае, если 2 или более правила лексера совпадают с одинаковым количеством символов, первое правило будет побеждать. Другими словами, для ввода or, bot могут быть сопоставлены правила WORDS и OR. А так как WORDS определяется первым, он выигрывает.

Своп заказ:

conjunction : WORDS OR WORDS ; 
OR: ' or ' ; 
WORDS: [A-Za-z ]+ ; 

Однако лексический Antlr совпадает как можно больше. Таким образом, вышесказанное будет работать, только если вы отметите or. Если вы попытаетесь tokenize John Smith or apple sauce, правило WORDS будет соответствовать всем!

Вы не должны включать в себя пространство:

conjunction : WORDS+ OR WORDS+ ; 
OR: 'or' ; 
WORDS: [A-Za-z]+ ; 
SPACES: [ \t\r\n] -> skip ; 

Когда я проверить ввод John or apple с анализатором генерируемого из приведенных выше грамматиков, я получаю это:

enter image description here

и для ввода John Smith or apple sauce это:

enter image description here

+0

Таким образом, вышесказанное будет работать, только если вы tokenize или. Если вы попытаетесь символизировать Джона Смита или яблочный соус, то правило WORDS будет соответствовать всем! Что это значит? Как я могу сопоставить то, что хочу? Когда я удаляю пробел из 'WORDS', он не работает, потому что он расширяет конец строки. – RaptorDotCpp

+0

@RaptorDotCpp с первой грамматикой, которую я опубликовал, если вы позволите лексеру токенизировать вход '' или '', он создаст один маркер OR. Если вы разрешите тому же лексеру токенизировать вход '' Джон или яблоко'', он создаст единственный токен 'WORDS'. –

+0

* Как я могу сопоставить то, что хочу? *, Делая, как я предложил в своей второй грамматике. –