2015-08-21 3 views
4

Я работаю на синтаксическом анализаторе для языка, который имеетконтекстного лексический анализ кода

  • идентификаторов (например, в письме следует ряд буквенно-цифровых символов или подчеркивание),

  • целых (любое число цифр и, возможно, CARETS ^),

  • некоторые операторы,

  • имя файла (количество алфавитно-цифровых символов и, возможно, косой черты и точек)

Видимо имя файла перекрывается целые и идентификаторы, так что в целом я не могу решить, если у меня есть имя файла или, скажем, идентификатор, если имя файла не содержит косой чертой или точкой.

Но имя файла может следовать только за конкретным оператором.

Мой вопрос в том, как эта ситуация обычно обрабатывается во время токенизации? У меня есть токенизатор с таблицей (lexer), но я не уверен, как указать имя файла из целого или идентификатора. Как это делается?

Если имя файла было подмножеством целых чисел и идентификаторов, то я, вероятно, мог бы грамматику производств, которые могли бы справиться с этим, но маркеры перекрывают ...

+0

Лично я бы не использовал токенизатор. – melpomene

ответ

2

Flex и других лексеры имеют понятие start conditions. По сути, лексер - это машина состояний, и ее точное поведение будет зависеть от его текущего состояния.

В вашем примере, когда ваш лексер встречает оператора, предшествующего имени файла, он должен переключиться на состояние FilenameMode (или что-то еще), а затем переключиться обратно, как только он выдает токен имени файла, который он ожидал.

EDIT:

Просто чтобы дать какой-то конкретный код этой стороне гиперссылке:

Вы бы вызвать ваш FILENAME_MODE, когда вы сталкиваетесь с оператором ...

{FILENAME_PREFIX} { BEGIN(FILENAME_MODE); } 

Вы бы определить свой правило для анализа имени файла:

<FILENAME_MODE>{FILENAME_CHARS}+ { BEGIN(INITIAL); } 

... переключательi ng обратно в состояние INITIAL в действии.

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