如何匹配ANSI C中的单词(1-n个字符)? (另外:与C源代码中的常量相匹配的模式是什么?)
我尝试读取文件并将其传递给regexec()
(regex.h)。
问题:我正在编写的工具应该能够读取源代码并找到
所有使用的常量(#define)来检查它们是否被定义。
用于测试的模式是:[a-zA-Z_0-9]{1,}
。但这会匹配“test.h”中的“h”等词。
答案 0 :(得分:2)
标识符必须以字母或下划线开头,因此模式为
[A-Za-z_][A-Za-z0-9_]*
我知道C和预处理程序标识符之间没有语法差异。对于预处理器使用大写,对C标识符使用小写,但没有实际要求。除非保证定义使用不同的命名约定,否则您基本上必须找到源文件中的每个标识符和任何包含的文件,并将它们分类为预处理程序标识符,C标识符和未声明的标识符。
从GCC手册:
预处理令牌分为五大类:标识符,预处理数字,字符串文字,标点符号等。标识符与C中的标识符相同:字母,数字或下划线的任何序列,以字母或下划线开头。 C的关键词对预处理器没有意义;它们是普通的标识符。例如,您可以定义名称为关键字的宏。可以将唯一可以视为预处理关键字的标识符定义。
答案 1 :(得分:0)
除了通过C源代码进行正则表达式搜索之外,另一个选择是使用预处理器库,如Boost Wave,或者像Coan这样的东西,而不是从头开始。
答案 2 :(得分:0)
以下是整个c语言的Lexer grammar和Parser grammar(分别采用flex和bison格式)。特别是,与标识符相关的部分是:
D [0-9]
L [a-zA-Z_]
{L}({L}|{D})* { count(); return(check_type()); }
因此id可以以任何大写或小写字母或下划线开头,然后包含更多大写或小写字母,下划线和数字。我认为它与文件名的部分不匹配,因为它们被引用并且它分别处理引号。