Соответствующие слова в ANSI C - PullRequest
0 голосов
/ 17 декабря 2011

Как мне сопоставить слово (1-n символов) в ANSI C?(кроме того: Какой шаблон соответствует константе в C-исходном коде?)

Я попытался прочитать файл и передать его в regexec() (regex.h).Проблема: инструмент, который я пишу, должен быть в состоянии прочитать исходный код и найти все используемые константы (#define), чтобы проверить, определены ли они.

Шаблон, используемый для тестирования: [a-zA-Z_0-9]{1,}.Но это будет соответствовать таким словам, как «h» в «test.h».

Ответы [ 3 ]

2 голосов
/ 17 декабря 2011

Идентификаторы должны начинаться с буквы или подчеркивания, поэтому шаблон имеет вид

[A-Za-z_][A-Za-z0-9_]*

Я не знаю синтаксической разницы между идентификаторами C и препроцессора.Существует соглашение использовать верхний регистр для препроцессора и нижний регистр для идентификаторов Си, но фактических требований нет.Если в определениях не гарантировано использование отдельного соглашения об именах, вам в основном придется находить каждый идентификатор в исходном файле и любых включенных файлах и сортировать их по идентификаторам препроцессора, идентификаторам C и необъявленным идентификаторам.

Из руководства GCC:

Токены предварительной обработки делятся на пять широких классов: идентификаторы, числа предварительной обработки, строковые литералы, знаки препинания и другие.Идентификатор такой же, как идентификатор в C: любая последовательность букв, цифр или подчеркиваний, которая начинается с буквы или подчеркивания.Ключевые слова C не имеют значения для препроцессора;они обычные идентификаторы.Например, вы можете определить макрос, именем которого является ключевое слово.Определен единственный идентификатор, который можно считать ключевым словом предварительной обработки.

0 голосов
/ 17 декабря 2011

Вот грамматика Lexer и грамматика Parser (соответственно в формате flex и bison) для всего языка c. В частности, часть, относящаяся к идентификаторам:

D           [0-9]
L           [a-zA-Z_]
{L}({L}|{D})*       { count(); return(check_type()); }

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

0 голосов
/ 17 декабря 2011

Другой вариант, помимо поиска по регулярному выражению по исходному коду C, - использовать библиотеку препроцессора, такую ​​как Boost Wave или, возможно, что-то вроде Coan вместо того, чтобы начинать с нуля.

...