我有一个使用 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/