Начальные состояния в Lex / Flex - PullRequest
5 голосов
/ 15 июля 2009

Я использую Flex и Bison для генератора парсера, но у меня проблемы со стартовыми состояниями в моем сканере.

Я использую исключительные правила для комментариев, но эта грамматика не соответствует указанным токенам:

%x COMMENT

//                    { BEGIN(COMMENT); }
<COMMENT>[^\n]        ;
<COMMENT>\n           { BEGIN(INITIAL); }

"=="                  { return EQUALEQUAL; }

.                     ;

В этом простом примере строка:

// a == b

не соответствует полностью как комментарий, если я не включил это правило:

<COMMENT>"=="             ;

Как мне обойти это без необходимости добавлять все эти токены в мои эксклюзивные правила?

Ответы [ 3 ]

9 голосов
/ 15 июля 2009

Соответствие комментариям в стиле C в Lex / Flex или чем-либо, что хорошо задокументировано:

в документации , а также различные вариации в интернете.

Вот вариант, который можно найти в документации Flex:

   <INITIAL>{
     "//"              BEGIN(IN_COMMENT);
     }
     <IN_COMMENT>{
     \n      BEGIN(INITIAL);
     [^\n]+    // eat comment
     "/"       // eat the lone /
     }
2 голосов
/ 19 июля 2009

Попробуйте добавить «+» после правила [^ n]. Я не знаю, почему исключительное состояние все еще получает '==' даже в исключительном состоянии, но, очевидно, это так. Flex обычно соответствует правилу, которое соответствует большинству текста, и добавление «+», по крайней мере, сделает два правила связанными по длине. Если сначала поставить правило COMMENT, оно будет использоваться в случае ничьей.

0 голосов
/ 20 июля 2009

Подсказка:

Проблема в том, что это «есть комментарий» правило не соответствует токенам с более одного символа

, поэтому добавьте *, чтобы соответствовать нулю или большему количеству не-новых строк. Вы хотите ноль, иначе пустой комментарий не будет совпадать.

%x COMMENT

//                    { BEGIN(COMMENT); }
<COMMENT>[^\n]*        ;
<COMMENT>\n           { BEGIN(INITIAL); }

"=="                  { return EQUALEQUAL; }

.                     ;
...