регулярные выражения токенов javacc and_symbol_in - PullRequest
1 голос
/ 31 января 2012

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

Похоже, мне нужна операция AND_SYMBOL_IN или что-то еще, но я нене могу найти его в документации по javacc. Мне нужно поведение, подобное этому:

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

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

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

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

1 Ответ

2 голосов
/ 19 марта 2012

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

Например:

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

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

...