C源代码标记器

C source code tokenizer

本文关键字:源代码      更新时间:2023-10-16

我正在尝试标记一个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工具的表。