匹配ANSI C中的单词

时间:2011-12-16 21:06:31

标签: c word match ansi matching

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

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

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

3 个答案:

答案 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 grammarParser grammar(分别采用flex和bison格式)。特别是,与标识符相关的部分是:

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

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