Нужно регулярное выражение Lex для соответствия строки до новой строки - PullRequest
0 голосов
/ 27 декабря 2018

Я хочу разобрать строки типа:

a=some value
b=some other value

Вокруг '=' нет пробелов, и значения расширяются до новой строки.Могут быть начальные пробелы.

Моя лексическая спецификация (соответствующая часть):

%%  
a=  { printf("Found attr %s\n", yytext); return aATTR; }
^[ \r\t]+   { printf("Found space at the start %s\n", yytext); }
([^a-z]=).*$  { printf("Found value %s\n", yytext); }
\n  { return NEWLINE; }
%%  

Я пробовал .*$ [^\n]* и несколько других регулярных выражений, но безрезультатно.Это выглядит довольно просто.Какие-либо предложения?Я также знаю, что lex возвращает самое длинное совпадение, что еще больше усложняет его.Я получаю соответствие всей строки для некоторых регулярных выражений, которые я пробовал.

1 Ответ

0 голосов
/ 17 января 2019

Возможно, вы хотите включить отдельные начальные состояния.Это позволяет вам кодировать простые контексты.Простой пример ниже фиксирует ваш идентификатор, оператор и значение при каждом вызове yylex ().

%{
char id;
char op;
char *value;
%}

%x VAL OP
%%
<INITIAL>[a-z]+ {
    id = yytext[0];
    yyleng = 0;
    BEGIN OP;
}
<INITIAL,OP>[ \t]*
<OP>=[ \t]* {
    op = yytext[0];
    yyleng = 0;
    BEGIN VAL;
}
<VAL>.*\n {
    value = yytext;
    BEGIN INITIAL;
    return 1;
}
%%
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...