如何匹配ANSI C中的单词(1-n个字符)?(另外:C源码中匹配常量的模式是什么?)
我尝试读取该文件并将其传递给regexec() (regex.h)。问题:我正在编写的工具应该能够读取源码并找到所有使用的常量(#define),以检查它们是否已定义。
用于测试的模式是:[a-zA-Z_0-9]{1,}。但是这将匹配诸如"test.h“中的"h”之类的单词。
发布于 2011-12-17 05:43:07
标识符必须以字母或下划线开头,因此模式为
[A-Za-z_][A-Za-z0-9_]*我知道C和预处理器标识符在语法上没有区别。有一个约定,即预处理器使用大写,C标识符使用小写,但没有实际要求。除非定义保证使用不同的命名约定,否则基本上必须在源文件和任何包含的文件中找到每个标识符,并将它们分类为预处理器标识符、C标识符和未声明的标识符。
摘自GCC手册:
预处理标记分为五大类:标识符、预处理数字、字符串文字、标点符号和其他。标识符与C中的标识符相同:以字母或下划线开头的任何字母、数字或下划线序列。关键字C对预处理器没有意义;它们是普通的标识符。例如,您可以定义名称为关键字的宏。定义了可以被认为是预处理关键字的唯一标识符。
发布于 2011-12-17 05:16:03
除了在C源代码上执行正则表达式搜索之外,另一个选择是使用Boost Wave或Coan之类的预处理器库,而不是从头开始。
发布于 2011-12-17 05:57:04
下面是整个c语言的Lexer grammar和Parser grammar (分别为flex和bison格式)。具体来说,与标识符相关的部分是:
D [0-9]
L [a-zA-Z_]
{L}({L}|{D})* { count(); return(check_type()); }因此,id可以以任何大写或小写字母或下划线开头,然后包含更多的大写或小写字母、下划线和数字。我认为它不匹配文件名的一部分,因为它们是被引用的,并且它单独处理引用。
https://stackoverflow.com/questions/8540137
复制相似问题