Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
flex/bison第25行:'处的语法错误'。文件的最后一行_Bison_Flex Lexer_Bisonc++ - Fatal编程技术网

flex/bison第25行:'处的语法错误'。文件的最后一行

flex/bison第25行:'处的语法错误'。文件的最后一行,bison,flex-lexer,bisonc++,Bison,Flex Lexer,Bisonc++,我正试图编译一个flex项目,但我总是遇到同样的错误,我搜索了所有这些,并尝试了大多数解决方案,比如使用令牌并返回1或0,或者调用yywrap()。。。但是没有运气 我不知道错误在哪里,我有84个轮班/减少冲突的警告,但我认为这可能是问题所在 这是代币。l: %option yylineno %{ #include <string> #include <iostream> #include <vector> using namespace std ;

我正试图编译一个flex项目,但我总是遇到同样的错误,我搜索了所有这些,并尝试了大多数解决方案,比如使用令牌并返回1或0,或者调用yywrap()。。。但是没有运气

我不知道错误在哪里,我有84个轮班/减少冲突的警告,但我认为这可能是问题所在

这是代币。l:

%option yylineno

%{
 #include <string>
 #include <iostream>
 #include <vector>
 using namespace std ;
 #include "parser.hpp" 

 extern "C" int yywrap() { return(1); }
 #define TOKEN(t) processtoken(t, string(yytext, yyleng))

 void processtoken (int t, string id) {
   cout << t << " <" << id << ">" << endl ;
 }

%}

%option nounput

%%

programa                                TOKEN(RPROGRAM);
procedimiento                           TOKEN(RPROC);
variables                               TOKEN(RVAR);
si                                      TOKEN(RIF);
entonces                                TOKEN(RTHEN);
repetir                                 TOKEN(RREPEAT);
hasta                                   TOKEN(RUNTIL);
siempre                                 TOKEN(RALWAYS);
salir                                   TOKEN(RSALIR);
leer                                    TOKEN(RREAD);
escribir_linea                          TOKEN(RWRITE);
in                                      TOKEN(RIN);
out                                     TOKEN(ROUT);
entero                                  TOKEN(RENTERO);
real                                    TOKEN(RREAL);


[a-zA-Z](_?[a-zA-Z0-9])*                TOKEN(TID); 
\$[a-zA-Z](\-{0,1}[a-zA-Z0-9])*\-?      TOKEN(TID);
\$[a-zA-Z](\_{0,2}[a-zA-Z0-9])*         TOKEN(TID);
\(\*([^*]|\*+[^*)])*\*+\)               ; 

[ \t\n]                                 ;
[0-9]+\.[0-9]*                          TOKEN(TDOUBLE);
[0-9]+                                  TOKEN(TINTEGER); 
[0-9]+\.[0-9]+([eE][-+]?[0-9]+)?        TOKEN(TREAL);

"="                                     TOKEN(TASSIG);
"=="                                    TOKEN(TEQUAL);
">"                                     TOKEN(TCGT);
">="                                    TOKEN(TCGE);
"<"                                     TOKEN(TCLT);
"<="                                    TOKEN(TCLE);
"+"                                     TOKEN(TPLUS);
"-"                                     TOKEN(TMINUS);
"*"                                     TOKEN(TMUL);
"/"                                     TOKEN(TDIV);
"/="                                    TOKEN(TCNE);
"("                                     TOKEN(TLPAREN);
")"                                     TOKEN(TRPAREN);
"{"                                     TOKEN(TLBRACE);
"}"                                     TOKEN(TRBRACE);
","                                     TOKEN(TCOMMA);
":"                                     TOKEN(TCOLON);
";"                                     TOKEN(TSEMIC);

.                                       { cout << "Token desconocido: " << yytext << endl; yyterminate();}

%%

我总是在最后一行得到错误:第25行:在“”处的语法错误,但我不知道这意味着什么,因为我有一个空格的标记,EOF的标记不起作用,我尝试了>{yywrap();},但没有完成。

在扫描程序定义中,没有任何地方可以将标记返回到解析器。因此,解析器将看到的唯一标记是flex在看到EOF时自动返回的结束标记

但是你的语法不接受空输入;它坚持输入中的第一个标记是
programa
(例如)。因此,当它看到EOF时,自然会报告语法错误


当检测到EOF时,没有令牌文本,因此
yytext
将无效。(它甚至可能是空的,所以绝对不应该使用。)总的来说,在lexer操作之外使用
yytext
并不是一个好主意,在
yyerror
中使用它会调用未定义的行为(尽管你会不时在bison示例中看到它)。

我不明白,你说我必须明确EOF的标记?我用>{yywrap();}试过了,但还是失败了。我尝试不使用yyerror函数,但它没有显示错误,但仍然存在。@set92不,rici是说您应该让lexer返回标记(而不是EOF)而不是将它们打印到屏幕上。我修复了它,我更改了#定义标记(t)。。。对于#define TOKEN(t)yylval.str=new std::string(yytext,yyleng)。另一个问题是我没有调用函数的语法,在测试程序中我有sumar(a,b,c),所以我删除了它,现在它可以正常工作了。谢谢你的帮助help@set92刘易斯·德?阿卡诺·普埃多在卡斯特拉诺作出回应。
%{
   #include <stdio.h>
   #include <iostream>
   #include <vector>
   #include <string>
   using namespace std; 

   extern int yylex();
   extern int yylineno;
   extern char *yytext;
   string tab = "\t" ;
   void yyerror (const char *msg) {
     printf("line %d: %s at '%s'\n", yylineno, msg, yytext) ;
   }


%}

%union {
    string  *str ; 
}

%token <str> RPROGRAM RPROC RVAR RIF RTHEN RREPEAT RUNTIL
%token <str> RALWAYS RSALIR RREAD RWRITE RENTERO RREAL
%token <str> RIN ROUT

%token <str> TID TDOUBLE TREAL TINTEGER

%token <str> TASSIG TEQUAL TCGT TCGE TCLT TCLE TCNE
%token <str> TPLUS TMINUS TMUL TDIV
%token <str> TLPAREN TRPAREN TLBRACE TRBRACE TCOMMA TCOLON TSEMIC

%type <str> programa
%type <str> declaraciones
%type <str> lista_de_ident
%type <str> resto_lista_id
%type <str> tipo
%type <str> decl_de_subprogs
%type <str> decl_de_subprograma
%type <str> argumentos
%type <str> lista_de_param
%type <str> clase_par
%type <str> resto_lis_de_param
%type <str> lista_de_sentencias
%type <str> sentencia
%type <str> variable
%type <str> expresion

%left TPLUS TMINUS TMUL TDIV

%start programa 

%%

programa :  RPROGRAM TID
        declaraciones
        decl_de_subprogs
        TLBRACE lista_de_sentencias TRBRACE
        ;


declaraciones : RVAR lista_de_ident TCOLON tipo TSEMIC declaraciones
        | {}
        ;

lista_de_ident : TID resto_lista_id
        ;

resto_lista_id : TCOMMA TID resto_lista_id
        | {}
        ;

tipo : RENTERO | RREAL
        ;

decl_de_subprogs : decl_de_subprograma decl_de_subprogs
        | {}
        ;

decl_de_subprograma : RPROC TID argumentos declaraciones
                    TLBRACE lista_de_sentencias TRBRACE
        ;

argumentos : TLPAREN lista_de_param TRPAREN
        | {}
        ;

lista_de_param : lista_de_ident TCOLON clase_par tipo resto_lis_de_param
        ;

clase_par : RIN | ROUT | RIN ROUT
        ;

resto_lis_de_param : TSEMIC lista_de_ident TCOLON clase_par tipo resto_lis_de_param
        | {}
        ;

lista_de_sentencias : sentencia lista_de_sentencias
        | {}
        ;

sentencia : variable TASSIG expresion TSEMIC
        | RIF expresion RTHEN TLBRACE lista_de_sentencias TRBRACE
        | RREPEAT TLBRACE lista_de_sentencias TRBRACE RUNTIL expresion TSEMIC
        | RREPEAT RALWAYS TLBRACE lista_de_sentencias TRBRACE
        | RSALIR RIF expresion
        | RREAD TLPAREN variable TRPAREN TSEMIC
        | RWRITE TLPAREN expresion TRPAREN TSEMIC
        ;

variable : TID
        ;

expresion : expresion TEQUAL expresion
        | expresion TCGT expresion
        | expresion TCLT expresion
        | expresion TCGE expresion
        | expresion TCLE expresion
        | expresion TCNE expresion
        | expresion TPLUS expresion
        | expresion TMINUS expresion
        | expresion TMUL expresion
        | expresion TDIV expresion
        | TID 
        | TINTEGER
        | TREAL
        | TLPAREN expresion TRPAREN
        ;
programa ejemplo
    variables a,b,c : entero;
    variables d,e : real;
(* esto es un comentario *)

procedimiento sumar (x,y: in entero; resul: in out entero) 
    variables aux:entero;
    {
        repetir {
            aux=x; 
            resul=y;
            aux = aux - 1;
            resul = resul+1;
        } hasta aux /= 0;
    }

{
    leer(a); leer(b);
    d= 1/b;
    e= 1/a;
    sumar(a,b,c); (* los que hagan llamadas a procedimientos *)
    c= c*(c*d)+e;
    escribir_linea(c*c);
}