ожидается ошибка;до перерыва с помощью зубров и гибких - PullRequest
0 голосов
/ 01 декабря 2019

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

1 Ответ

0 голосов
/ 01 декабря 2019

решено, пропало;в этой строке [//] [^ \ r \ n] * [\ r | \ n | \ r \ n]? возвращение КОММЕНТАРИЙ не могу поверить, что мне понадобилось так много времени, чтобы найти это ...

...