Получение строки, которая заканчивается строкой "lngt" в Lex - PullRequest
1 голос
/ 21 января 2012

Я пишу лекс-скрипт для токенизации C AST.Я хочу написать регулярное выражение в lex, чтобы получить строку, которая заканчивается конкретной строкой «lngt», но не включает «lngt» в окончательную строку, возвращаемую lex.Так что в основном строковая форма будет (. * Lngt) , но я не смог понять, как это сделать в lex.Любой совет / направление было бы очень полезно

Пример: у меня есть эта строка в моем файле

@65  string_cst  type: @71  strg: Reverse order of the given number is : %d  lngt: 42

Я хочу получить строку после strg: и перед lngt: т.е. "Обратный порядокзаданное число:% d "(ПРИМЕЧАНИЕ: эта строка может состоять из любых возможных символов)

Спасибо.

1 Ответ

0 голосов
/ 28 апреля 2015

Ответ на этот вопрос похож на тот, который я написал здесь . Это можно сделать написав свой конечный автомат в lex. Это также можно сделать, написав некоторый код C , как показано в цитируемом ответе или в других текстах, цитируемых ниже.

Если мы предполагаем, что требуемая строка всегда находится между "strg" и "lngt", то это то же самое, что и любые другие несимметричные разделители строк.

%x STRG LETTERL LN LNG LNGT
ws [ \t\r\n]+
%%
<INITIAL>"strg: " {
            BEGIN(STRG);
            }
<STRG>[^l]*l {
            yymore();
            BEGIN(LETTERL);
            }
<LETTERL>n {
           yymore();
           BEGIN(LN);
          }
<LN>g {
           yymore();
           BEGIN(LNG);
           }
<LNG>t {
           yymore();
           BEGIN(LNGT);
            }
<LNGT>":" {
           printf("String is '%s'\n", yytext);
           BEGIN(INITIAL);
            }
<LETTERL>[^n] {
            BEGIN(STRG);
            yymore();
            }
<LN>[^g] {
            BEGIN(STRG);
            yymore();
             }
<LNG>[^t] {
           BEGIN(STRG);
            yymore();
              }
<LNGT>[^:] {
            BEGIN(STRG);
            yymore();
               }
<INITIAL>{ws}  /* skip */ ;
<INITIAL>.   /* skip anything not in the string */
%%

Процитирую другой мой ответ:

Предлагаются решения по нескольким университетским курсам по компиляции. Тот, кто хорошо это объясняет, - здесь (в Манчестере) . Который цитирует пару хороших книг, которые также охватывают проблемы:

  • Дж. Левин, Т. Мейсон и Д. Браун: Лекс и Як (2-е изд.)
  • M.E.Lesk & E.Schmidt: Lex - Генератор лексического анализатора

Описаны два метода: Начальные условия для подробного определения конечного автомата или ручной ввод для непосредственного чтения символов.

...