2012-01-31 1 views
1

Мне нужно описать токен, содержащий какое-то слово. Слово может содержать английские буквы и некоторые другие специальные символы, но не должно начинаться с некоторых определенных английских букв (например, «O»).javacc токены регулярные выражения and_symbol_in

Похоже, мне нужна операция AND_SYMBOL_IN или что-то в этом роде, но я не знаю найти в документации JavaCC мне нужно поведение что-то вроде этого:.?

TOKEN : { < LETTERS: (
    (~["O", "-"] AND_SYMBOL_IN ["a"-"z","A"-"Z","-",".","&","|","0"-"9"])? (["a"-"z","A"-"Z","-",".","&","|","0"-"9"])+ 
) > } 

Я могу создать специальный маркер (как показано ниже), но я считаю, есть более красивое решение, ISN `нем

TOKEN : { < #LETTEREX: (
["a"-"z","A"-"N","P"-"Z",".","&","|","0"-"9","-"]) > } 

TOKEN : { < LETTERS: (
(<LETTEREX>) (<LETTEREX> | ["O"])+ 
) > } 
+0

Интернет, похоже, не имеет документа, описывающего 'AND_SYMBOL_IN', поэтому без личного знания JavaCC мы не можем вам помочь. – Borodin

+0

Я сомневаюсь, что есть более приятное решение (то есть более сжатое) - то, что вы хотите, равно количеству повторенных регулярных выражений в распознавании токенов. я не верю, что кто-то перешел на проблему реализации этой функции в общем случае для генератора лексеров. это может быть желательно для некоторых специфических потребностей в контексте unicode, но для вашей задачи я предлагаю придерживаться вашего решения. другим вариантом может быть установка TOKEN_FACTORY и настройка «newToken» на возврат разных токенов при совпадении «слова» - см. документы javacc. надеюсь, что это поможет, – collapsar

ответ

2

JavaCC разрешает ambigu итераций между равными по размеру совпадениями с использованием порядка, в котором соответствующие маркеры объявлены в грамматике. Поэтому одна возможность заключается в том, чтобы соответствовать фишку вы не хотите, прежде лексемы вы делаете:

Например:

TOKEN : { < #LETTER : ["a"-"z","A"-"Z","-",".","&","|","0"-"9"] > } 
TOKEN : { < WORDS_STARTING_WITH_O : "O" (<LETTER>)+ > } 
TOKEN : { < WORDS_NOT_STARTING_WITH_O : (<LETTER>)+ > } 

Как подходит это зависит от того, сколько особых случаев у вас есть и насколько сложны они ,