C源代码标记器

时间:2014-09-07 14:27:11

标签: c++ c parsing tokenize

我正在尝试对C源代码文件进行标记,我想检测该文件中使用的字符串和字符串constat。首先,我需要匹配作为const char(“text”)传递给函数的任何参数。接下来我需要找到所有char * var[] = "text"char *var="text"字符串。我还需要检测,是那些变量是在全局范围内或函数内声明的。我找到了Windows的FLEX& BISON解决方案,但对于简单的任务来说它有点复杂。我可以使用任何预编写的C源代码标记器吗?尝试用正则表达式来做,但因为在字符串检测后我需要替换值,有时它会出错。加上单行if else没有括号会在我的自定义插入和放大后破坏代码;替换。

1 个答案:

答案 0 :(得分:1)

需要注意一些荆棘:

  • 预处理器宏
  • C-Style评论
  • 字符串文字

预处理器宏

根据语言,您需要执行预处理步骤,处理宏。正如其他人评论的那样,宏可以生成字符串文字。

您可能不必重写源(执行文本替换),您可以将宏名称及其值存储到字典中,并在遇到宏名称时引用该值。

这很容易。所有条件编译都是困难的部分。由于条件编译设置,某些字符串文字可能不是可执行数据部分的一部分。

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 ++程序中正确而强大的字符串文字搜索比搜索双引号的简单强力方法更难。语言的语法规则使得通过正则表达式进行搜索变得困难。首选方法是根据语法规则解析源文件。

您可能需要使用现有的开源代码,或者至少使用词法工具的表格,而不是从头开始编写自己的解析器或词法分析器。