Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.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++ 使用行号生成Bison错误消息_C++_Bison_Flex Lexer - Fatal编程技术网

C++ 使用行号生成Bison错误消息

C++ 使用行号生成Bison错误消息,c++,bison,flex-lexer,C++,Bison,Flex Lexer,我试图在Flex/Bison设置中生成正确的编译错误。我将代码添加到lexer中,以跟踪行号和字符号,并将其添加到每个匹配的标记中,如下所示: struct yystype { std::string s; DefLocation def; union { ... } }; 这是我的yystype,其中“s”用于任何string-y类型,而union包含任何指针类型(为了更大的类型安全性)。不过,这两种方法中只有一种曾经被使用过 #define TOKEN yylval

我试图在Flex/Bison设置中生成正确的编译错误。我将代码添加到lexer中,以跟踪行号和字符号,并将其添加到每个匹配的标记中,如下所示:

struct yystype {
  std::string s;
  DefLocation def;
  union {
    ...
  }
};
这是我的yystype,其中“s”用于任何string-y类型,而union包含任何指针类型(为了更大的类型安全性)。不过,这两种方法中只有一种曾经被使用过

#define TOKEN yylval.s = yytext; yylval.def = DefLocation {yyfilename, yytokenoffs, (size_t)yylineno }

%option yylineno

out                         { TOKEN; return OUT; }
in                          { TOKEN; return IN; }
这基本上设置了文本&转发一个DefLocation(简单结构),表示定义的位置

现在我的问题是,Bison公开了我的规则或令牌定义的结构的任何字段:

%token <s> IN OUT
%type <e> expression13 expression12 
%令牌输入输出
%类型表达式13表达式12

但我不知道如何到达def位置。是否有方法访问规则给定部分的整个yylval,以提取def位置?另一种选择是将它们包含在每个标记中,但这将非常恼人和难看。

通常在解析过程中会很快检测到错误。因此,作为全局变量访问行号是可以的。我希望行号在代码生成之前可用,因此,如果我在过程中很晚才检测到一个次优的结构,您可以在代码中修复它,我可以告诉您它在哪里。而且,这更通用;在我的目标语言中,代码生成非常晚,并且可以在晚些时候发现错误。还记得没有行号的GCC链接器错误吗?这将防止这种情况发生。那么解析器使用的每个生产类型都需要包含一个行号。