Идентификатор ключевого слова C в lex

Я новичок в написании файлов lex, и я не уверен, правильно ли форматирую свой файл. Я пытаюсь захватить ключевые слова C из исходного файла C и распечатать их обратно с префиксом строки формата.

Моя попытка (показывает неполный список ключевых слов):

%%

auto|do|goto|short    printf("%s%s", "formatting", yytext);

В некоторых примерах, которые я рассматривал, слова в первом столбце заключены в двойные кавычки. Это необходимо, или я правильно отформатировал свой файл lex, чтобы зафиксировать ключевые слова, которые я перечислил?

То есть я должен был вместо этого написать:

"auto"|"do"|"goto"|"short"    printf("%s%s", "formatting", yytext);

Когда необходимы двойные кавычки?


person Victor Brunell    schedule 17.01.2016    source источник


Ответы (1)


Двойные кавычки необходимы, когда текст шаблона включает оператор регулярного выражения или пробел. Вероятно, это хорошая идея использовать их всякий раз, когда текст шаблона состоит не только из букв и цифр.

В случае простого буквенного ключевого слова они явно не нужны. Также нет необходимости использовать их, если текст шаблона уже экранирован с помощью \, поэтому вы можете писать \n без кавычек.


На самом деле двойные кавычки не необходимы. Существует несколько способов экранирования символов, но преимущество двойных кавычек заключается в том, что они позволяют заключать в кавычки несколько последовательных символов. Тем не менее, следующее также будет хорошо:

[a][u][t][o]|[d][o]...

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

[aA][uU][tT][oO]|[dD][oO]...

Flex позволяет указать нечувствительность к регистру для сегмента шаблона, используя синтаксис флага — (?i:auto|do|goto|short) — но это расширение flex, поэтому вы все равно будете видеть шаблоны, подобные приведенным выше.

person rici    schedule 17.01.2016
comment
Когда я запускаю свою скомпилированную программу lex в терминале без использования двойных кавычек, ввод auto делает префикс текста форматирования. Если это так, то зачем нужны двойные кавычки? Извините, я все еще немного запутался, когда они полезны. - person Victor Brunell; 17.01.2016
comment
@victorBrunell: Предположим, вы хотите распознать токен auto*. В этом случае вам нужно будет избежать *, потому что это оператор регулярного выражения. Вы могли бы использовать auto\* или auto[*], но большинство из нас использовали бы "auto*" - person rici; 17.01.2016
comment
@ Ричи А, понял. Итак, двойные кавычки удаляют эффект специальных символов регулярных выражений? Есть ли такие, на которые не влияют двойные кавычки? - person Victor Brunell; 17.01.2016
comment
@victorBrunell: да. Символы кавычек :) Также обратные косые черты. Все остальное внутри двойных кавычек — это просто символ. - person rici; 17.01.2016