Как лексические анализаторы обрабатывают комментарии и экранирующие последовательности? - PullRequest
5 голосов
/ 06 марта 2011

Комментарий и escape-последовательность (например, строковый литерал) очень исключительны из обычного символического представления.

Мне трудно понять, как их анализируют обычные лексические анализаторы.Как лексические анализаторы типа lex, flex или т. Д. Обрабатывают символы такого типа?Есть ли общий метод?Или просто на индивидуальной основе для каждого языка?

Ответы [ 3 ]

1 голос
/ 06 марта 2011

Я ничего не могу сказать для lex, но в моем лексере для моего языка (используя // комментарии в стиле C ++) я уже разделил ввод по строкам (видя, что это язык, вдохновленный Python), у меня естьрегулярное выражение, соответствующее //, а затем любое количество любых символов.

1 голос
/ 06 марта 2011

Я думаю, что это - для каждого языка отдельно - это правда.
Если стартовый комментарий существует в строковом литерале, лексер должен его игнорировать. Аналогично, в C, если экранированная двойная кавычка \" существует в строковом литерале, Лексер должен игнорировать это.
Для этого у flex есть начальное условие. Это позволяет проводить контекстный анализ.
Например, есть пример для анализа комментариев C (между /* и */) в руководстве flex texinfo:

<INITIAL>"/*"   BEGIN(IN_COMMENT);
<IN_COMMENT>{
"*/"            BEGIN(INITIAL);
[^*\n]+         /* eat comment in chunks */
"*"             /* eat the lone star */
\n              yylineno++;
}

Начальное условие также позволяет анализировать строковые литералы. Есть пример того, как сопоставить строки в кавычках в стиле C, используя start условия в элементе Начальные условия , и есть также пункт FAQ под названием Как развернуть escape-последовательности обратной косой черты в кавычках в стиле C? в гибком руководстве texinfo.
Возможно, это прямо ответит на ваш вопрос о строковом литерале.

1 голос
/ 06 марта 2011

Комментарий и escape-последовательность (например, строковый литерал) очень исключительны из обычного символического представления.

Я не уверен, что вы имеете в виду, но это утверждение, безусловно, неверно. Оба комментария (если они не могут быть вложенными) и строки с escape-последовательностью допускают простое описание на обычном языке.

Например, escape-последовательность, допускающая \\, \", \n и \r, может быть описана следующей регулярной грамматикой (с символом начала E):

E -> \ S
S -> \
S -> "
S -> n
S -> r
…

И строка - это просто повторение нуля или более неэкранированных символов или escape-последовательностей (т. Е. Замыкание Клини над двумя регулярными языками, которое само по себе регулярно).

...