Я пытаюсь выучить бизонов и флекс, чтобы создать компилятор. сейчас я просто хотел проверить грамматику, прежде чем продолжить. Я сталкиваюсь с этими ошибками, которые я не могу понять, помощь будет оценена. У меня есть некоторые предупреждения, использующие 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 */
}
%%
и 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"