首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ANSI中的匹配词

ANSI中的匹配词
EN

Stack Overflow用户
提问于 2011-12-17 05:06:31
回答 3查看 575关注 0票数 0

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

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-12-17 05:43:07

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

代码语言:javascript
运行
复制
[A-Za-z_][A-Za-z0-9_]*

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

摘自GCC手册:

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

票数 2
EN

Stack Overflow用户

发布于 2011-12-17 05:16:03

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

票数 0
EN

Stack Overflow用户

发布于 2011-12-17 05:57:04

下面是整个c语言的Lexer grammarParser grammar (分别为flex和bison格式)。具体来说,与标识符相关的部分是:

代码语言:javascript
运行
复制
D           [0-9]
L           [a-zA-Z_]
{L}({L}|{D})*       { count(); return(check_type()); }

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8540137

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档