Compiler errors Bison解析器未在case语句中报告错误

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

运行bison解析器后,我得到以下输出:

在上图中,我给出了使用bison生成的compile可执行文件,并提供了syntax5.txt。 如果您看到它在=>2时捕获错误;适当地 它应该类似于当1=>2; 但在它下面还有一个,它也缺少文字。它不是出于某种原因选择的。错误总数应为5,显示为4

这可能是什么原因呢。 这是我正在使用的parser.y文件。这与我定义语法的方式有关

%{

#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:它将抑制三个标记的错误。这经常出现在同一句话中,但并不总是如此。