Lex не распознает двойные операторы -! =,: =, << и т. Д. Могу ли я дать приоритет выражению Lex? - PullRequest
0 голосов
/ 21 октября 2018

Пытается разобрать операторы (+, -, =, <<,! =), Используя такие состояния, как </p>

%{
%}
OP  ["+"|";"|":"|","|"*"|"/"|"="|"("|")"|"{"|"}"|"*"|"@"|"$"|
"<"|">"|"&"|"|"|"!"|]
DOUBOP [":="|".."|"<<"|">>"|"<>"|"<="|">="|"=>"|"**"|"!="|"{:"|"}:"|"\-"]

и позже

{DOUBOP} { printf("%s (operator)\n", yytext); }
{OP} { printf("%s (operator)\n", yytext); }

, но Лекс идентифицирует операторыкак "<<" как "<" и "<".Я думал, так как это было в двойных кавычках, это будет работать, но я вижу, что это не так.</p>

Могу ли я в любом случае дать приоритет регулярному выражению, то есть сначала выполнить проверку lex для двойного оператора, а затем для одного оператора?

Заранее спасибо.

1 Ответ

0 голосов
/ 21 октября 2018

[...] - это класс символов, а не эксцентричный тип скобок.Если вы хотите заключить в скобки подвыражение в шаблоне, используйте обычные скобки.Однако в этом случае скобки не нужны.(Действительно, большинство цитат также не являются необходимыми, но они не причиняют вреда, и некоторые из них были бы полезны.)

"==" распознает две последовательности символов, состоящие из двух знаков равенства."=="|"++" распознает либо два знака равенства, либо два знака плюс.

В отличие от этого, ["=="] распознает один символ, который может быть либо кавычкой, либо знаком равенства.Поскольку класс символов является набором, тот факт, что каждый из них появляется дважды, не имеет значения (хотя я думаю, что если бы Flex выпустил предупреждение, это сэкономило бы много горя).Точно так же ["=="|"<<"] распознает один символ, если это кавычка, знак равенства, вертикальная черта или знак «меньше».

Синтаксис шаблона Flex задокументирован в руководстве flex .Он несколько отличается от регулярных выражений в других системах, поэтому стоит прочитать краткий документ.Однако классы символов в большинстве случаев одинаковы во всех синтаксисах регулярных выражений, особенно при использовании квадратных скобок для разграничения набора.

...