Bison中的错误报告和令牌别名
Error reporting and token aliases in Bison
好的,所以我正在试验令牌别名并面临一些问题。
让我们以我的(超简化)Bison语法的这一部分为例:
/****************************************
Definitions
****************************************/
%union
{
char* str;
}
/****************************************
Tokens & Types
****************************************/
%token <str> ID "identifier"
%token <str> NUMBER_DEC "number"
%token <str> NUMBER_HEX "number"
%token <str> NUMBER_BIN "number"
%token <str> NUMBER_FLOAT "number"
%type <str> identifier number
%type <str> assignment_st
%type <str> statements statement
%type <str> program
/****************************************
Directives
****************************************/
%glr-parser
%locations
%start program
%define parse.error verbose
%%
/****************************************
Grammar Rules
****************************************/
identifier : ID
;
number : NUMBER_DEC
| NUMBER_HEX
| NUMBER_BIN
| NUMBER_FLOAT
;
assignment_st : identifier '=' number ';' { printf("assignment : %s = %sn",$identifier,$number); }
;
statement : assignment_st
;
statements : statement
| statements statement
;
program : statements
;
%%
现在,如果我尝试a = 2;
,这显然是好的语法。如果我尝试a = b;
,这是一个错误,因为它期望一个数字。在这种情况下,解析器报告:
syntax error, unexpected identifier, expecting number or NUMBER_HEX or NUMBER_BIN or NUMBER_FLOAT
(好吧,"数字"别名是的重复,因为它在4个令牌中使用)。
然而,我会寻找更像unexpected identifier, expected number
的东西。
你会怎么做呢?
还有,我是否有可能在消息中也包含错误行?
注:我已经研究了最新的Bison文档好几个小时了,但我觉得好像我最终要构建一个…火箭,而不是修复错误信息…lol
你会怎么做呢?
我将使用单个NUMBER
令牌。我看不出有任何理由让解析器关心它所查找的是哪种类型的数字字面值。
当然,有可能你的完整语法确实涉及到只允许某些格式的数字字面量的地方,尽管我对这类事情的总体倾向是"讨厌"。最可能的情况是,在某些规则中,整型常量是可以的,而浮点常量则不行。在这种情况下,除非您为浮点数提供与整数不同的别名,否则您将无法为特定的产品获得良好的错误消息。不过,总的来说,我还是坚持用"yuk"。
如果你有一个单一的数字标记类型,别名为"number",那么错误应该很好地解决。
相关文章:
- 如何在C++中使用X509证书模在令牌中查找私钥
- holeMenuProgram.cpp:38:1 错误:'}'令牌之前的预期主表达式
- C++:"("令牌"之前有预期的非限定 id 指向类中成员函数的指针
- Arduino 用于语句错误。令牌之前的预期')' ';'。如何解决这个问题?
- 错误:令牌 { '{' 之前应存在非限定 ID
- 允许哪些令牌作为 #include 的参数?
- "错误 C0000:语法错误,令牌"<EOF>"处出现意外$end,并且不确定
- 它在 { 令牌之前给了我预期的标识符
- (错误:令牌之前'<<'预期的主表达式)
- 为什么 ## aka 令牌粘贴运算符不适用于 C 和 C++ 中的注释?
- 错误:"->"令牌之前的预期初始值设定项
- LINUX 操作系统上的错误:令牌之前预期的构造函数、析构函数或类型转换'('?
- 丢失读入的每一行输入中的最后一个令牌
- 如何使用 libCurl 将访问令牌发送到服务器 API
- C++令牌定义成员
- 宏定义中的预处理器令牌两边有两个双引号
- 错误:C++中']'令牌之前的预期主表达式
- 错误:令牌之前的预期主表达式'&&'
- 令牌之前']'预期的主表达式?
- Bison中的错误报告和令牌别名