2013-02-19 3 views
0

Все,закона | прогибается действие правил игнорируется

У меня есть заданный тип шаблона в моем ЛЕКСЕ файла:

"#"[ \\t]*"ifdef".*    { action_ifdef_manager(yytext);} 

если текст, как это encoutred #ifdef GLOBALVAR действия action_ifdef_manager не называется

Спасибо за любую помощь.

+2

Почти невозможно ответить на ваш вопрос без какого-либо контекста. Очевидно, что если это было единственным правилом в вашем лексере, нужно вызвать action_if_def_manager, но это, вероятно, не так. Попробуйте упростить источники лексера, чтобы сделать минимальный пример, где вы все еще наблюдаете проблему. –

+0

@ArthurReutenauer Я думаю, что проблема не вытекает из двусмысленности правил в моем лексере, действительно, «. *» В конце шаблона нажимает лексер, пока поиск «\ n» ведьмы не является шаблоном в моем лексере поэтому вызывается действие \ n ''. – Aymanadou

+0

Я не уверен, что понимаю вас правильно, но разве это не двусмысленность в вашем лексере? Вернее, способ, которым вы его проектировали, неоднозначен, и Flex разрешает это так, как вы этого не ожидали. В любом случае, если символ новой строки является проблемой здесь, этого может быть достаточно, чтобы исключить его из правила, например, используя '[^ \ n] *' вместо '. *' –

ответ

1

Единственная проблема заключается в двусмысленности шаблонов. Вы должны иметь такой же рисунок, как '#ifdef'

  a  | 
      ab  | 
      abc  | 
      abcd  ECHO; REJECT; 

Лексер здесь возвращается в "ABCD" поток все четыре проверенные модели A, AB, азбука, ABCD

Посмотрите на the Flex manual