C源代码标记器
C source code tokenizer
我正在尝试标记一个C源代码文件,我想检测该文件中使用的字符串和字符串常量。所以首先,我需要匹配作为const char("text")传递的任何参数到函数。接下来,我需要找到所有的char * var[] = "text"
、char *var="text"
字符串。我还需要检测,这些变量是在全局范围内声明的,还是在函数内声明的。我发现FLEX&用于windows的BISON解决方案,但对于简单的任务来说,它有点复杂。有没有我可以使用的C源代码的预先编写的标记器?我试着用正则表达式来做这件事,但因为在字符串检测之后,我需要替换值,有时会出错。加上没有括号的单行CCD_ 3 CCD_;替换
有一些刺需要注意:
- 预处理器宏
- C样式注释
- 字符串文字
预处理器宏
根据语言,您将需要执行预处理步骤,处理宏。正如其他人所评论的那样,宏可以产生字符串文字。
您可能不必重写源(执行文本替换),可以将宏名称及其值存储到字典中,并在遇到宏名称时引用该值。
这是容易的部分。所有的条件编译都是困难的部分。由于条件编译设置的原因,某些字符串文字可能不是可执行数据节的一部分。
C样式注释
你不能对双引号进行强力搜索。允许源代码在注释、C或C++样式中使用双引号。
C风格的注释最好使用状态机进行解析。它们可以跨越多条线路。
字符串文字
请记住,字符串文字可能使用ASCII以外的其他表示形式。
字符串文字可以连接在一起,例如:
static const char text[] =
"My Bonnie lies over the ocean,n"
"My Bonnie lies over the sea,n";
字符串文字可能包含双引号(通过转义):
static const char more_text[] =
"What does "MVP" mean?";
所以你不可能暴力地捕捉双引号之间的所有内容;您需要解析文本。
摘要
在C或C++程序中正确而稳健地搜索字符串文字比搜索双引号的简单暴力方法更困难。该语言存在语法规则,使得通过正则表达式进行搜索变得困难。首选方法是根据语法规则解析源文件。
与其从头开始编写自己的解析器或lexer,您可能希望使用现有的开源代码,或者至少使用lexer工具的表。
- 在Linux中哪里可以找到互斥、未来等的源代码
- 如果编译的源代码是特定于它编译的硬件的,我们如何分发它
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- 难以理解某些人解决IOI问题的源代码
- 使用g++编译hdf5源代码
- 如何使用C++读取另一个程序中的源代码输出
- Poco FindMySql.cmake 无法找到 MySQL 源代码
- 更改命令行 qt5 源代码构建配置的正确/快速方法
- C++出现控制台错误.我无法识别源代码的问题
- Qt Quick,如何更改 Ui 源代码?
- 使用 Git 处理 C++ Visual Studio 2019 解决方案的外部依赖项源代码管理的最佳方法是什么?
- 从macOS Catalina上的源代码编译LLVM(如何解决未找到"stdio.h")
- 如何使用QT创建器获取网页源代码?
- 从源代码构建 gRPC C++
- 如何使用我构建的库,而不会从源代码出错,但不为我自己的项目编译?
- 如何在使用 LLVM 编译时获取部分源代码的二进制代码
- 如何在源代码中包含外部库的头文件?
- 如何查找 torch.bmm 的 c++ 源代码 pytorch.
- 是否有可能使用debug_info获取ELF文件的源代码?
- 为什么Qt必须从源代码构建以进行交叉编译?