Сделайте так, чтобы гибкая ручка автоматически вышла из новой строки - PullRequest
0 голосов
/ 12 сентября 2018

Я ищу правило в flex, которое обрабатывает экранированные символы новой строки и дает мне маркер, игнорирующий эту строку.

Например:

У меня есть правило в моей спецификации lex, например:

\"(\.|[^\"])*\"

для захвата всех строковых литералов.Это действительно захватывает строки из кода, подобного:

Printf("This is literal")

, но это не дает мне правильный токен, если код подобен:

printf("This is \
   literal.")

Какую модификацию я могу внести в мою спецификацию lexсправиться с этой ситуацией?

1 Ответ

0 голосов
/ 12 сентября 2018

(F) lex распознает только токены. Интерпретация их содержания зависит от вас.

Если вы просто распознаете строковый литерал, вы можете использовать регулярное выражение, например

["]([^"\n]|\\.)*["]

Но если вам нужна правильная интерпретация строкового литерала - в соответствии с вашим языком - вам понадобится условие запуска с соответствующими действиями.

Обычный подход заключается в инициализации объекта, подобного StringBuffer, когда вы видите отверстие ", и переходе в условие начала строки. Неспециальные символы просто добавляются в StringBuffer; escape-последовательности, такие как \n, добавляют соответствующий символ в StringBuffer, а \\\n ничего не делает. Когда закрывается кавычка, токен фактически отправляется вместе с накопленным текстом.

...