Непризнанное правило Flex / Lex для paranthesis’

#bison #flex-lexer #lex

#bison #flex-lexer #lex

Вопрос:

 %{

%}

%%
'*'     {return 0;}
'('     {return 1;}
')'     {return 2;}
%%

int yywrap(){}
 

Пример кода, подобный приведенному выше. Оно выдает сообщение об ошибке в виде:

 zort.l:7: unrecognized rule
zort.l:8: unrecognized rule
zort.l:8: unrecognized rule
zort.l:8: unrecognized rule
 

Оно выдает ошибку только для символов paranthesis. Не выдает никаких ошибок для других символов. В чем причина? Являются ли исключения paranthesis’? Как это решить?

Ответ №1:

Для flex шаблонов одинарные и двойные кавычки не совпадают. В настоящее время ваше первое правило гласит, что вы хотите сопоставить одинарную кавычку ( ' ), ноль или более раз ( * ), за которыми следует другая одинарная кавычка ' . Другие правила не имеют никакого значения.

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

 %%
"*"     {return 0;}
"("     {return 1;}
")"     {return 2;}
%%
 

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