2011-12-16 53 views
0

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

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

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

+0

你是什么意思的一个“单词”? “jkasdf”是一个词吗?那么“42”呢? –

+0

[此问题](http://stackoverflow.com/q/8368681/968261)应该有所帮助。 –

+0

正如我所说:单词=预处理器常量 – fuzzy

回答

2

标识符必须以字母或下划线开始,所以该模式是

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

我知道C和预处理标识符之间没有语法区别。对于C标识符,预处理器和小写使用大写,但没有实际的要求。除非定义保证使用独特的命名约定,否则基本上必须找到源文件中的每个标识符以及任何包含的文件,并将它们分类为预处理器标识符,C标识符和未声明的标识符。

从GCC手册:

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

0

除了对C源代码进行正则表达式搜索之外,另一个选择是使用预处理器库,如Boost Wave或者类似Coan的东西,而不是从头开始。

+0

绝对同意,但我没有找到符合我需求的图书馆。我会检查他们。 – fuzzy

0

这里是(分别在弯曲和野牛格式,)对于整个c语言的Lexer grammarParser grammar。特别是有关标识的部分是:

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

所以ID可以与任何大写或小写字母或下划线开始,然后有更多的大写或小写字母,下划线和数字。我相信它不匹配部分文件名,因为它们被引用,并且它分别处理引号。