Compiler construction 预期误差;休息前使用bison和flex

Compiler construction 预期误差;休息前使用bison和flex,compiler-construction,g++,bison,lex,Compiler Construction,G++,Bison,Lex,我正在努力学习bison和flex来制作一个编译器。现在我只想在继续之前检查一下语法。 我遇到了这些我无法理解的错误,请给予帮助。 我在使用bison-d时有一些警告,但我现在忽略了它,而且在我能够运行代码之前,我无法修复语法(这可能很糟糕) 我知道bison使用了词法分析器,我想我把它们正确地联系起来了 我得到的错误是: lex.yy.c:710:18:错误:应为“;”在“休息”之前 scanner.lex:53:2:注意:在宏'YY_BREAK'的展开中 我使用的文件是: scanner.l

我正在努力学习bison和flex来制作一个编译器。现在我只想在继续之前检查一下语法。 我遇到了这些我无法理解的错误,请给予帮助。 我在使用bison-d时有一些警告,但我现在忽略了它,而且在我能够运行代码之前,我无法修复语法(这可能很糟糕)

我知道bison使用了词法分析器,我想我把它们正确地联系起来了

我得到的错误是: lex.yy.c:710:18:错误:应为“;”在“休息”之前 scanner.lex:53:2:注意:在宏'YY_BREAK'的展开中

我使用的文件是:

scanner.lex

    %{

/* Declarations section */
#define YYSTYPE int
#include <stdio.h>
#include "bisonbison.tab.hpp"

%}

%option yylineno
%option noyywrap
digit           ([0-9])
letter          ([a-zA-Z])
whitespace      ([\t\n ])

%%

{whitespace}                ;
void                        return VOID;
int     return INT;
byte    return BYTE;
b   return B;
bool    return BOOL;
enum    return ENUM;
and return AND;
or  return OR;
not return NOT;
true    return TRUE;
false   return FALSE;
return  return RETURN;
if return IF;
else    return ELSE;
while   return WHILE;
break   return BREAK;
continue    return CONTINUE;
;   return SC;
,   return COMMA;
[(] return LPAREN;
[)] return RPAREN;
{   return LBRACE;
}   return RBRACE;
=   return ASSIGN;
[+] return PLUS;
-   return MINUS;
[*] return MULT;
[/] return DIV;
[<]|[>]|[<=]|[>=]   return RELATION;
!=|==   return EQUALITY;
[a-zA-Z][a-zA-Z0-9]*    return ID;
0 | [1-9][0-9]* return NUM;
["]([^\n\r\"\\]|\\[rnt"\\])+["] return STRING;
[//][^\r\n]*[ \r|\n|\r\n]? return COMMENT
.   return ILLEGAL;

{
    /* code */
}

%%
%{
/*声明科*/
#定义YYSTYPE int
#包括
#包括“bisonbison.tab.hpp”
%}
%选项yylineno
%选项No yywrap
数字([0-9])
字母([a-zA-Z])
空白([\t\n])
%%
{空白};
无效返回无效;
int返回int;
字节返回字节;
b返回b;
bool返回bool;
枚举返回枚举;
以及返回和返回;
或返回或返回;
不归不归;
真返回真;
假返回假;
返回;
如果返回如果;
否则返回其他;
当返回时;
断开-回断;
继续返回继续;
;   返回SC;
,返回逗号;
[(]返回LPAREN;
[)]返回RPAREN;
{返回LBRACE;
}返回RBRACE;
=返回分配;
[+]返回加;
-返回负;
[*]返回MULT;
[/]返回DIV;
[]返回关系;
!=|==   回报平等;
[a-zA-Z][a-zA-Z0-9]*返回ID;
0 |[1-9][0-9]*返回数;
[“]([^\n\r\“\\]\\[rnt”\\])+[“]返回字符串;
[//][^\r\n]*[\r\n\r\n]?回复评论
.   退货不合法;
{
/*代码*/
}
%%
和bisonbison.ypp

    %{
#define YYSTYPE int
    #include <iostream>
    #include <stdlib.h>
    extern int yylex();
    int yyerror(const char * message);
%}

    %token VOID
    %token INT
    %token BYTE
    %token B
    %token BOOL
    %token ENUM
    %left NOT
    %token TRUE
    %token FALSE
    %token RETURN
    %token IF
    %token ELSE
    %token WHILE
    %token BREAK
    %token CONTINUE
    %token SC
    %token COMMA
    %token LBRACE
    %token RBRACE
    %token ID
    %token NUM
    %token STRING
    %token ILLEGAL
    %token COMMENT
    %right ASSIGN
    %left OR
    %left AND
    %left EQUALITY
    %nonassoc RELATION
    %left PLUS
    %left MINUS
    %left MULT
    %left DIV
    %token LPAREN
    %token RPAREN


%type<program> Program
%type<func> Funcs
%type<func_dec> FuncDecl
%type<enum_dec> EnumsDecl
%type<formal_dec> FormalDecl
%type<ret_type> RetType
%type<formal> Formals
%type<formal_list> FormalsList
%type<enum_list> EnumeratorList
%type<statements> Statements
%type<statement> Statement
%type<call> Call
%type<exp> ExpList
%type<exp> Exp
%type<type> Type
%type<enum_type> EnumType
%type<enumerator> Enumerator
%type<enums> Enums

%%

Program : ENUM Funcs 
        | 
        ;

Exp :   Exp AND Exp 
    |   Exp OR Exp 
    |   Exp NOT Exp 
    |   LPAREN Exp RPAREN
    |   Exp EQUALITY Exp 
    |   Exp RELATION Exp
    |   Exp PLUS Exp
    |   Exp MINUS Exp
    |   Exp MULT Exp
    |   Exp DIV Exp 
    |   LPAREN Type RPAREN Exp 
    ;


Funcs   : FuncDecl Funcs 
        | 
        ;

FuncDecl : RetType ID LPAREN Formals RPAREN LBRACE Statements RBRACE 
         ;

Enums    : EnumsDecl ENUM
         | 
         ;

RetType : Type 
        | VOID 
        ;

Formals : FormalsList 
        ;

FormalsList : FormalDecl COMMA FormalsList 
            | FormalDecl 
            ;

FormalDecl : Type ID 
           | EnumType ID 
           ; 

EnumeratorList : Enumerator 
               | EnumeratorList COMMA Enumerator 
               ;
Enumerator : ID 
          ;
Statements : Statements Statement 
            | Statement 
           ;

EnumType : ENUM ID
            ;
Statement : LBRACE Statements RBRACE 
          | Type ID ASSIGN Exp SC 
          | Type ID SC 
          | EnumType ID SC 
          | EnumsDecl 
          | ID ASSIGN Exp SC 
          | Call SC 
          | RETURN Exp SC 
          | RETURN SC 
          | IF LPAREN Exp RPAREN Statement ELSE Statement 
          | IF LPAREN Exp RPAREN Statement 
          | WHILE LPAREN Exp RPAREN Statement 
          | BREAK SC 
          | CONTINUE SC 
          ;
Call : ID LPAREN ExpList RPAREN 
     | ID LPAREN RPAREN 
     ;
EnumsDecl : ENUM ID LBRACE EnumeratorList RBRACE SC
            ;
ExpList : Exp COMMA ExpList 
        | Exp 
        ;
Type : INT 
     | BYTE 
     | BOOL 
     ;
%%

int main()
{
    yyparse();
}

int yyerror(const char * message)
{
    printf("Parse error: %s\n",message);
    exit(0);
}
#include "lex.yy.c"
%{
#定义YYSTYPE int
#包括
#包括
extern int yylex();
int yyerror(常量字符*消息);
%}
%代币无效
%标记整数
%令牌字节
%令牌B
%令牌布尔
%令牌枚举
%不离开
%象征性真实
%标记错误
%代币返还
%代币如果
%其他代币
%代币
%代币中断
%代币继续
%令牌SC
%标记逗号
%代币赛跑
%令牌RBRACE
%令牌ID
%令牌数
%令牌串
%非法代币
%象征性评论
%权利转让
%左或右
%左和
%左等式
%非对称关系
%左加
%左减
%左骡子
%左DIV
%令牌LPAREN
%令牌RPAREN
%类型程序
%类型函数
%类型FuncDecl
%类型EnumsDecl
%型甲醛
%类型RetType
%类型形式
%类型格式列表
%类型枚举列表
%类型语句
%类型语句
%打字
%类型解释程序
%类型Exp
%类型类型
%类型枚举类型
%类型枚举器
%类型枚举
%%
程序:枚举函数
| 
;
Exp:Exp和Exp
|Exp或Exp
|Exp不Exp
|LPAREN Exp RPAREN
|Exp相等Exp
|Exp关系Exp
|经验加经验
|Exp减Exp
|综合实验
|出口部出口
|LPAREN类型RPAREN Exp
;
Funcs:FuncDecl Funcs
| 
;
FuncDecl:RetType ID LPAREN Formals RPAREN LBRACE语句RBRACE
;
枚举:EnumsDecl枚举
| 
;
RetType:Type
|空虚
;
形式:形式列表
;
格式列表:格式逗号格式列表
|甲醛
;
FormalDecl:类型ID
|枚举类型ID
; 
枚举器列表:枚举器
|枚举器列表逗号枚举器
;
枚举器:ID
;
声明:声明声明
|声明
;
枚举类型:枚举ID
;
语句:LBRACE语句RBRACE
|类型ID分配Exp SC
|类型ID SC
|枚举类型ID SC
|EnumsDecl
|ID分配Exp SC
|呼叫SC
|返回Exp SC
|返回SC
|IF LPAREN Exp RPAREN语句ELSE语句
|IF LPAREN Exp RPAREN语句
|而LPAREN Exp RPAREN语句
|中断SC
|继续SC
;
调用:ID LPAREN解释程序RPAREN
|ID LPAREN RPAREN
;
EnumsDecl:枚举ID LBRACE枚举器列表RBRACE SC
;
ExpList:Exp逗号ExpList
|经验
;
类型:INT
|字节
|布尔
;
%%
int main()
{
yyparse();
}
int yyerror(常量字符*消息)
{
printf(“分析错误:%s\n”,消息);
出口(0);
}
#包括“lex.yy.c”

解决了它,丢失了;在这一行 [//][^\r\n]*[\r\n\r\n]?回复评论
真不敢相信我花了这么长时间才找到这个…

最后的
%%
前面的三行在大括号之间引入了代码也是不正确的。如果要在扫描仪的末尾添加代码,请将代码(不带其他大括号)放在
%%
后面。