LINUX.ORG.RU

Gnu Flex


0

1

%{ #include <stdio.h> #include «main.tab.h» %}

%% [=]+ yylval.int_value=strlen(yytext); return BEGINHEADERTOKEN;

.+ yylval.string_value=strdup(yytext); return STRINGTOKEN;

%% Вот такой кусок кода. Проблема в том, что, не смотря на то, что правило со знаками равенства первое, строка вида «==this» целиком загоняется под второе правило, что есть не то, что мне нужно. Можно, конечно, написать что-то вроде [a-z] но в идеале не хотелось бы привязываться к ASCII.



Последнее исправление: illusionoflife (всего исправлений: 1)

Знак равенства, кажется, тоже спецсимвол в lex.

Попробуй:

%%
["="]+ yylval.int_value=strlen(yytext); return BEGINHEADERTOKEN;
...

или вообще

%%
"="+ yylval.int_value=strlen(yytext); return BEGINHEADERTOKEN;
...

Зачем тебе класс из одного символа?

OldFatMan
()

И ещё...

Больше одной инструкции, емнип, в фигурные скобки брать надо, как блок:

%%
["="]+ {yylval.int_value=strlen(yytext); return BEGINHEADERTOKEN;}
...
OldFatMan
()
Ответ на: комментарий от OldFatMan

Где-то на просторах рунета был пример имеено так. И он, бтв, работает. Да по барабану, класс - не класс. Проблема в том, что второе правило включает в себя первое ( ну правда, знаки равенства - это частный случай произвольной строки. Вот он и под второе правило все и загоняет. Я понимаю, что так совпадение длиннее, а делать то что?

illusionoflife
() автор топика

Документацию смотрел? Там всё написано:

info flex FAQ 'Flex is not matching my patterns in the same order that I defined them.'

Там же предложены варианты решения. Самый простой вариант это убрать пересечение правил:

[=]+ yylval.int_value=strlen(yytext); return BEGINHEADERTOKEN;
[^=]+ yylval.string_value=strdup(yytext); return STRINGTOKEN;
kim-roader ★★
()
Ответ на: комментарий от kim-roader

Спасибо, извините за глупый вопрос. Не посмотрел.

illusionoflife
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.