Compiler errors Bison解析器未在case语句中报告错误
运行bison解析器后,我得到以下输出: 在上图中,我给出了使用bison生成的compile可执行文件,并提供了syntax5.txt。 如果您看到它在=>2时捕获错误;适当地 它应该类似于当1=>2; 但在它下面还有一个,它也缺少文字。它不是出于某种原因选择的。错误总数应为5,显示为4 这可能是什么原因呢。 这是我正在使用的parser.y文件。这与我定义语法的方式有关Compiler errors Bison解析器未在case语句中报告错误,compiler-errors,compiler-construction,bison,flex-lexer,Compiler Errors,Compiler Construction,Bison,Flex Lexer,运行bison解析器后,我得到以下输出: 在上图中,我给出了使用bison生成的compile可执行文件,并提供了syntax5.txt。 如果您看到它在=>2时捕获错误;适当地 它应该类似于当1=>2; 但在它下面还有一个,它也缺少文字。它不是出于某种原因选择的。错误总数应为5,显示为4 这可能是什么原因呢。 这是我正在使用的parser.y文件。这与我定义语法的方式有关 %{ #include <string> using namespace std; #include
%{
#include <string>
using namespace std;
#include "listing.h"
int yylex();
void yyerror(const char* message);
%}
%define parse.error verbose
%token IDENTIFIER
%token INT_LITERAL
%token ADDOP MULOP RELOP ANDOP
%token IF BOOL_LITERAL ARROW EXPOP REMOP OROP NOTOP CASE
%token ELSE ENDCASE ENDIF OTHERS REAL THEN WHEN REAL_LITERAL
%token BEGIN_ BOOLEAN END ENDREDUCE FUNCTION INTEGER IS REDUCE RETURNS
%%
function:
function_header variable body ;
function_header:
FUNCTION IDENTIFIER RETURNS type ';' |
FUNCTION IDENTIFIER parameters RETURNS type ';' |
error ';';
variable:
IDENTIFIER ':' type IS statement_ variable |
;
parameters: parameter |
parameter ',' parameters |
;
parameter: IDENTIFIER ':' type ;
type:
INTEGER |
REAL |
BOOLEAN ;
body:
BEGIN_ statement_ END ';' ;
statement_:
statement ';' |
error ';' ;
statement:
REDUCE operator reductions ENDREDUCE |
IF expression THEN statement_ ELSE statement_ ENDIF |
expression |
CASE expression IS when OTHERS ARROW statement_ ENDCASE
;
when: WHEN INT_LITERAL ARROW expression ';'|
when WHEN INT_LITERAL ARROW expression ';' |
error ';'|
;
operator:
ADDOP |
MULOP ;
reductions:
reductions statement_ |
;
expression:
expression OROP expression2 |
expression2;
;
expression2:
expression2 ANDOP expression3 |
expression3;
;
expression3: NOTOP expression3 |
expression4
;
expression4: relation;
relation:
relation RELOP term |
term;
term:
term ADDOP factor |
factor ;
factor:
factor MULOP factor2 |
factor REMOP factor2 |
factor2;
factor2:
factor3 EXPOP factor2 |
factor3
;
factor3: primary;
primary:
'(' expression ')' |
INT_LITERAL |
BOOL_LITERAL |
REAL_LITERAL |
IDENTIFIER ;
%%
void yyerror(const char* message)
{
appendError(SYNTAX, message);
}
int main(int argc, char *argv[])
{
firstLine();
yyparse();
lastLine();
return 0;
}
%{
#包括
使用名称空间std;
#包括“listing.h”
int-yylex();
无效错误(常量字符*消息);
%}
%详细定义parse.error
%令牌标识符
%标记整型文字
%令牌ADDOP MULOP RELOP ANDOP
%标记如果布尔_文字箭头EXOP REMOP或NOOP大小写
%标记ELSE ENDCASE ENDIF OTHERS REAL THEN WHEN REAL_LITERAL
%token BEGIN\uuBoolean ENDREDUCE函数整数为REDUCE返回值
%%
功能:
函数_头变量体;
功能单元标题:
函数标识符返回类型“;”|
函数标识符参数返回类型“;”|
错误“;”;
变量:
标识符“:”类型是语句变量|
;
参数:参数|
参数','参数|
;
参数:标识符“:”类型;
类型:
整数|
真实的|
布尔型;
正文:
开始语句结束语句;
声明:
语句“;”|
错误“;”;
声明:
减少操作员减少ENDREDUCE|
IF表达式THEN语句uelse语句uuendif|
表情|
大小写表达式是当其他箭头语句uuCase
;
when:when INT_文字箭头表达式“;”|
当INT_文字箭头表达式“;”时|
错误“;”|
;
接线员:
阿多普|
穆洛普;
减少:
削减声明|
;
表达方式:
表达式OROP表达式2|
表达2;
;
表达方式2:
表达式2和OP表达式3|
表达3;
;
表达式3:NOTP表达式3|
表情4
;
表达4:关系;
关系:
关系重排项|
学期
术语:
术语相加因子|
因素
因素:
因子MULOP因子2|
因子REMOP因子2|
因子2;
因素2:
因子3 EXPOP因子2|
因子3
;
因子3:初级;
主要:
“(“表达式”)”|
内部文字
布尔卢文字|
实数|
标识符;
%%
无效错误(常量字符*消息)
{
追加错误(语法、消息);
}
int main(int argc,char*argv[])
{
第一行();
yyparse();
lastLine();
返回0;
}
Bison与yacc一样,在错误恢复后会抑制前三个令牌的错误消息。这避免了由于恢复不精确而导致的一连串错误
您可以使用yyerrok
宏重新启用错误报告,但只能在操作的上下文中。(因此不能在定义yyerror
时使用它)解析器操作通常是错误恢复操作;也就是说,包含错误
伪标记的生产操作
有关如何编写错误恢复产品的更多信息和示例,请参阅。Bison,如yacc,在错误恢复后抑制前三个令牌的错误消息。这避免了由于恢复不精确而导致的一连串错误 您可以使用
yyerrok
宏重新启用错误报告,但只能在操作的上下文中。(因此不能在定义yyerror
时使用它)解析器操作通常是错误恢复操作;也就是说,包含错误
伪标记的生产操作
有关如何编写错误恢复产品的更多信息和示例,请参阅。我看到的问题仅与case语句有关。我看到的问题仅与case语句有关。此外,如果您不仅看到它,它还将抑制when语句中的下一个错误。如果您不仅看到它,它还将抑制when语句中的错误。但是case语句必须有语法中提到的others语句。它甚至没有输出那个。如果我使这两个when语句都正确,那么它将抛出error for missing others语句。@ronitsharma:它将抑制三个标记的错误。这经常出现在同一条语句中,但并不总是如此。此外,如果您不仅看到它,它还会抑制when语句中的下一个错误。如果您不仅看到它,它还会抑制when语句中的错误。但是case语句必须有语法中提到的others语句。它甚至没有输出那个。如果我使这两个when语句都正确,那么它将抛出error for missing others语句。@ronitsharma:它将抑制三个标记的错误。这经常出现在同一句话中,但并不总是如此。