c++ - 解析 C 头文件

标签 c++ c yacc lex

我有一个使用 gcc -E 标志预编译的 C 头文件,现在正尝试使用 Lex 和 Yacc 进行解析;但是,它会卡在 typedef 变量上。

例如:

typedef unsigned long ULONG;
ULONG i = 5;

将在第二行的 ULONG 处抛出语法错误。

我试图重新定义部分语法(在此处找到)http://www.quut.com/c/ANSI-C-grammar-y.html ,特别是在 type_specifer 下,将 TYPE_NAME 替换为 IDENTIFIER,但这会造成多个我无法修复的 s/r 和 r/r 错误。

您是否推荐其他方法? 还是一起预编译的不同方法?

最佳答案

在您链接的代码中:
http://www.quut.com/c/ANSI-C-grammar-y.html ,

看底部:
你会看到这个功能

int check_type(void)
{
 /*
  * pseudo code --- this is what it should check
  *
  * if (yytext == type_name)
  *     return TYPE_NAME;
  *
  * return IDENTIFIER;
  */

/*
 *  it actually will only return IDENTIFIER
 */

    return IDENTIFIER;
}

您实际上需要编写标识天气序列的代码(yytest,yytext+yylength] 是标识符或 TYPE_NAME。这意味着在解析器中您需要在解析代码时构建一些结构,以便此函数可以在结构中查找标识符。

使用默认类型 char/int/short/long/float/double 等预填充结构。您需要在解析输入时添加其他类型。

关于c++ - 解析 C 头文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6655883/

相关文章:

c++ - 使用另一个类的单个实例的类的多个实例

c++ - 为什么没有选择模板特化?

c - fclose(in) 段错误

c - 如何使用 C 使两个文件具有相同的访问时间?

c - 如何使用 Bison/Yacc 和递归规则构建数组

c++ - 实例化时为 NULL

c++ - 使用 libusb win32 列出 USB 设备

函数返回字符数组的 C 问题

c++ - Bison :轮类减少冲突

c - YACC 中的语法规则结束