Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 解析C头文件_C++_C_Yacc_Lex - Fatal编程技术网

C++ 解析C头文件

C++ 解析C头文件,c++,c,yacc,lex,C++,C,Yacc,Lex,我有一个C头文件,我已经使用gcc-E标志预先编译过,现在正试图使用Lex和Yacc进行解析;然而,它被typedef的变量挂起了 例如: typedef unsigned long ULONG; ULONG i = 5; 将在第二行的ULONG处抛出语法错误 我试图重新定义语法的一部分(在这里找到),特别是在type\u specifier下,用IDENTIFIER替换type\u NAME,但是这会产生我无法修复的多个s/r和r/r错误 您还有其他推荐的方法吗? 还是一种不同的预编译方法?

我有一个C头文件,我已经使用
gcc-E
标志预先编译过,现在正试图使用Lex和Yacc进行解析;然而,它被typedef的变量挂起了

例如:

typedef unsigned long ULONG;
ULONG i = 5;
将在第二行的ULONG处抛出语法错误

我试图重新定义语法的一部分(在这里找到),特别是在
type\u specifier
下,用
IDENTIFIER
替换
type\u NAME
,但是这会产生我无法修复的多个s/r和r/r错误

您还有其他推荐的方法吗?
还是一种不同的预编译方法?

在您链接的代码中:
,

看看底部:
您将看到这个函数

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)是标识符还是类型名称。这意味着在解析器中,您需要在解析代码时构建一些结构,以便此函数可以在结构中查找标识符


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

在链接的代码中:
,

看看底部:
您将看到这个函数

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)是标识符还是类型名称。这意味着在解析器中,您需要在解析代码时构建一些结构,以便此函数可以在结构中查找标识符


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

您必须能够区分lexer中的类型/变量标识符。因此,在解析文件时,您需要在解析器中以可供用户访问的方式建立类型列表在lexer中进一步处理。我不是你想做的。在大多数情况下,我必须从代码中提取数据,我已经用数据创建了一个特殊的表,并将其包含在代码中。你必须能够区分lexer中的类型/变量标识符。因此,当你解析文件时,你需要建立你的类型列表在解析器中以一种可以在lexer中进行进一步处理的方式进行。我不是你想做的。在大多数情况下,我必须从代码中提取数据,我已经用数据创建了一个特殊的表,并将其包含在代码中。Lex和yacc在运行时来回通信?我假设Lex标记化了之前的一切e yacc做了任何事。否。yacc调用lex并一次获取一个令牌。lex和yacc在运行时来回通信?我假设lex-token在yacc做任何事之前将所有事情都化了。否。yacc调用lex并一次获取一个令牌。