2016-02-29 2 views
0

Я хотел бы написать регулярное выражение, соответствующее любому слову. Я использую [a-zA-Z]*, за исключением некоторых слов, например WORD1 и WORD2.Регулярное выражение соответствует любому слову, кроме некоторых слов в flex

So somethingsomething совпадений, но слова WORD1 и WORD2 не будут. Возможно ли это в flex?

Я попытался:

[a-zA-Z]*|[^"WORD1""WORD2] и [a-zA-Z]*{-}["WORD1""WORD2"], но ни работы.

(Теперь я знаю, почему они не работают, но я до сих пор не знаю решения.)

+1

[Lookaheads] (HTTP: // WWW .regular-expressions.info/lookaround.html) недоступны в flex regex? –

+1

@bobblebubble: [Это не выглядит хорошо.] (Http://stackoverflow.com/q/22326399/20670) –

+1

Я действительно не понимаю, что вы здесь просите. '[a-zA-Z] *' не будет соответствовать 'WORD1', хотя он будет соответствовать' WORD'. Что вы хотели, чтобы произошло, когда WORD1 встретился? Ошибка? Другой тип токена? Два жетона? Только если мы знаем, что вы хотите, чтобы результат сканирования 'WORD1' был, мы можем предложить предложение о том, как его реализовать. – rici

ответ

1

Обычный подход в ЛЕКС/Flex является использование комбинации шаблонов и правил для выбора желаемого поведения :

  • Вы можете сделать лексер, который соответствует (и игнорирует) эти слова, а затем опуская к выражению для других идентификаторов, или
  • Просто сопрягать все идентификаторы и отфильтровать результаты с таблицей перекодировки.
0

Можно написать регулярное выражение для ситуации, которую вы представили.

Для того, чтобы соответствовать все слова, кроме слова вы можете написать:

w|wo|wor|word[a-z]+|([^w]|w[^o]|wo[^r]|wor[^d])[a-z]* 

Но @Thomas и @rici указал, у вас есть гораздо лучшие решения (особенно при определении конкретной проблемы) ,

Пример: "сосчитать все слова, кроме слова слова", на самом деле очень просто (используя предложение Thomas):

%% 
    int i; 

word  { } 
[a-z]+  {i++;} 

.|\n  { } 
<<EOF>>  { printf("%d\n",i); return 0; } 
%% 

(непроверенный)

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