2013-09-23 1 views
0

Я пытаюсь соответствовать ***, но я нахожу, что javacc соответствует *** в любом месте линии. Как я могу убедиться, что он соответствует только ***, если нет других символов, кроме пробелов или вкладок, до ***? Это то, что я в настоящее времяМатч начала линии

< HORIZONTAL_RULE: <ZERO_OR_MORE_OF_TAB_OR_SPACE> ("**")("*")+> 
| <#ZERO_OR_MORE_OF_TAB_OR_SPACE: (" " | "\t")*> 

Но опять же, это соответствует любому *** предваряется ноль или более пробелов.

ответ

1

Использовать лексические состояния. Используйте состояние DEFAULT для начала строки.

// Note that states do not apply to private regular expression definitions. 
TOKEN: <#ZERO_OR_MORE_OF_TAB_OR_SPACE: (" " | "\t")*> 

<DEFAULT> TOKEN: { 
    <HORIZONTAL_RULE: <ZERO_OR_MORE_OF_TAB_OR_SPACE> ("**")("*")+ > : MIDLINE 
} 
<DEFAULT, MIDLINE> SKIP { <OTHERCHAR: ~["\n","\r"]> : MIDLINE } 
<DEFAULT, MIDLINE> SKIP { <NEWLINE: "\n" | "\n\r" | "\r" | "\r\n"> : DEFAULT } 
+0

Быстрый вопрос, это заявление потеряло меня. Не могли бы вы бросить еще немного света, пожалуйста. 'Обратите внимание, что состояния не применяются к частным определениям регулярных выражений.' – ShaggyInjun

+0

Извиняюсь, я забыл сначала поблагодарить вас, SO не позволяет мне редактировать комментарий сейчас. Но спасибо. – ShaggyInjun

+0

Спасибо. Я просто пытался объяснить, почему я не связывал никакого лексического состояния с продуктом ZERO_OR_MORE_OF_TAB_OR_SPACE. –