ansic中的匹配词

ansic中的匹配词,c,word,match,ansi,matching,C,Word,Match,Ansi,Matching,如何匹配ANSI C中的单词(1-n个字符)?(另外:在C-sourcecode中匹配常量的模式是什么?) 我尝试读取文件并将其传递到regexec()(regex.h)。 问题:我正在编写的工具应该能够读取源代码并找到 所有使用的常量(#define)用于检查它们是否已定义 用于测试的模式是:[a-zA-Z_0-9]{1,}。但这将匹配“test.h”中的“h”之类的词。除了在C源代码上执行正则表达式搜索之外,另一个选择是使用预处理器库,比如或者类似的库,而不是从头开始 标识符必须以字母或下划

如何匹配ANSI C中的单词(1-n个字符)?(另外:在C-sourcecode中匹配常量的模式是什么?)

我尝试读取文件并将其传递到
regexec()
(regex.h)。 问题:我正在编写的工具应该能够读取源代码并找到 所有使用的常量(#define)用于检查它们是否已定义


用于测试的模式是:
[a-zA-Z_0-9]{1,}
。但这将匹配“test.h”中的“h”之类的词。

除了在C源代码上执行正则表达式搜索之外,另一个选择是使用预处理器库,比如或者类似的库,而不是从头开始

标识符必须以字母或下划线开头,因此模式为

[A-Za-z_][A-Za-z0-9_]*
我知道C和预处理器标识符之间没有语法上的区别。有一种惯例,即对预处理器使用大写字母,对C标识符使用小写字母,但没有实际要求。除非defines保证使用不同的命名约定,否则您基本上必须找到源文件和任何包含的文件中的每个标识符,并将它们排序为预处理器标识符、C标识符和未声明的标识符

从GCC手册:

预处理标记分为五大类:标识符、预处理数字、字符串文字、标点符号和其他。标识符与C中的标识符相同:任何字母、数字或下划线序列,以字母或下划线开头。C的关键字对预处理器没有意义;它们是普通标识符。例如,可以定义名称为关键字的宏。定义了可被视为预处理关键字的唯一标识符

下面是整个c语言的和(分别采用flex和bison格式)。具体而言,与标识符相关的部分是:

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

因此,id可以以任何大写或小写字母或下划线开头,然后有更多的大写或小写字母、下划线和数字。我认为它与文件名的某些部分不匹配,因为它们被引用,并且它单独处理引号。

你说的“单词”是什么意思?“jkasdf”是一个词吗?“42”怎么样?应该有帮助。正如我所说的:Words=preprocessor constantSorry,链接的问题没有帮助,因为常量可以在任何上下文中使用,例如:(FOO),{FOO},%%FOO%%,还有\t为什么不使用预处理器呢?对于您的编译器来说,这可能有所不同,但例如,gcc为您提供了带有
-e
的预处理源代码(因此您的定义将被替换),并且还可以选择让他吐出所有已定义的宏。(我不认为,
regexp.h
是C语言的一部分)完全同意这一点,但我没有找到适合我需要的库。我去看看。