Какое регулярное выражение в LEX соответствует строке, НЕ начинающейся с новой строки - PullRequest
0 голосов
/ 28 декабря 2018

Я хочу знать, что регулярное выражение в lex совпадает со строкой, которая не совпадает (начинайте строку и за которой следуют необязательные пробелы, за которыми следует "a =").Я пытаюсь проанализировать язык со следующими типами строк:

     a=some value
     b=some value

Строки "a =" (b = и т. Д.) Могут начинаться с пробелов, после которых следует другая строка без каких-либо белыхпробелы после = и до новой строки.Например:

     a=123 abcde

Здесь «123 abcde» - это значение.Проблема в том, что я могу столкнуться, по крайней мере в теории, со следующим

     a=123 a= 

или еще хуже:

     a=a=

Где первый a = является ключом, а второй a = теперьчасть значения, а не ключевой атрибут.Как отличить первый токен a = от второго?

Я могу сопоставить ключ "a =" со следующим, который обрабатывает начальные пробелы:

    ^[ \r\t]*"a="  

Но как мне сопоставитьвторая строка?Мне нужно регулярное выражение того типа, который говорит, что соответствует строке, которая НЕ (начинается строка и сопровождается необязательными пробелами, за которыми следует символ =) и продолжается до символа новой строки.Основная хитрость заключается в том, чтобы избежать выражения, соответствующего атрибуту a = также.

1 Ответ

0 голосов
/ 29 декабря 2018

Используйте условие запуска для создания другого лексического контекста для ввода после =.

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

См. руководство для подробностей и примеров.

Простой пример:

%x RHS
%%
[[:space:]]+  ; /* Ignore leading white space and blank lines */
a=            { BEGIN(RHS); return TOKEN_A; }
b=            { BEGIN(RHS); return TOKEN_B; }
.*            ; /* Ignore other input. Should do something else */
<RHS>.+       { yylval = strdup(yytext); return VALUE; }
<RHS>\n       { BEGIN(INITIAL); }

Примечание: правила RHS не отправляют ничего, если нет значения.Это не должно быть проблемой для парсера, но если это так, вы можете легко это исправить.

...