Warum "Vorzeitiges EOF" beim Lexer?



  • Hey,

    ich muss ein Lexer für eine C-Sprache in Flex schreiben und habe auch den fast fertig. Nur komme ich nicht weiter, da ich beim Testen auf der Konsole in UNIX immer ein "vorzeitiges EOF" bekomme. Egal was ich mache, ich komme nicht weiter. Wenn ich Quellcode lösche, passiert nix, genauso wenn ich alles lösche, es kommt immer ein "vorzeitiges EOF".
    Weiß einer vielleicht Rat?

    Vielen Dank Michel



  • Message: premature eof in prototype
    Cause: LEX encountered an end of file character in the proto-
    type file when it was not expecting it, probably due to
    a badly formatted prototype file.
    Action: Ensure that the prototype file is not corrupted. If
    using a private prototype file, ensure that it the same

    aus:http://invent3k.external.hp.com/~MGR.LROM3K/man3k/lex.html

    erste überlegungen:
    schau, was mit deiner datei los, wie ist sie abgespeichert? format (was macht der editor als einstellung)? welche zeilenumbrüche? passend zu unix?
    welchen editor nutzt du? gabs eine übergabe über eine anders formatierte datei?... (nur erste ideen)
    ps: was heißt: alles löschen?



  • hey, die datei heißt minako-lexic.l , wie meinst du das, was der editor als einstellung macht(format)?
    in unix nutze ich den gedit und unter windows jetzt den einfachen text-editor. vorher hatte ich am anderen windowsrechner notepad++ als editor benutzt.
    wie das mit den zeilenumbrüchen, passend zu unix oder nicht steht, weiß ich nicht ...
    also ich teste das ganze mit "make", in dem pfadordner sind das makefile, die minako.h, welche in die l-datei eingelesen wird.

    Meine Fehlermeldung auf der Konsole:

    rabe manthey 1 ( ~ ) $ cd praktikum/PI3/aufgabe3+4/c0-scanner
    rabe manthey 2 ( c0-scanner ) $ ls
    demorgan.c0 makefile minako.h
    demorgan.sol minako-lexic.l testscanner.c
    rabe manthey 3 ( c0-scanner ) $ make
    flex -t minako-lexic.l > minako-lexic.c
    "minako-lexic.l", line 87: premature EOF
    make: *** [minako-lexic.c] Error 1
    rm minako-lexic.c
    rabe manthey 4 ( c0-scanner ) $

    Meine minakoe-lexic.l:

    %option yylineno
    %option noyywrap
    
    %{ /*Deklarationen*/
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "minako.h"
    }%
    
    /*Regulaere Definitionen*/
    ws				[ \t\n]
    
    DIGIT				[0-9]
    INTEGER			{DIGIT}+
    FLOAT				{INTEGER} "." {INTEGER} | "." {INTEGER}
    LETTER				[a-ZA-Z]
    
    %x COMMENT_C COMMENT_CPP
    
    %%
    /*Regulaere Ausdruecke*/
    "/*"					{BEGIN (COMMENT_C);}
    
    "//"					{BEGIN (COMMENT_CPP);}
    <COMMENT_CPP>\n			{BEGIN (INITIAL);}
    <COMMENT_CPP>.			{;}
    
    {ws}+				{;/*keine Aktion*/}
    [\+\-\*\=\,\;\(\)\{\}\/]	{;/*keine Aktion*/}
    "&&"				{return (AND);}
    "||"				{return (OR);}
    "=="				{return (EQ);}
    "!="				{return (NEQ);}
    "<="				{return (LEQ);}
    ">="				{return (GEQ);}
    "<"				{return (LSS);}
    ">"				{return (GRT);}
    "bool"				{return (KW_BOOLEAN);}
    "do"				{return (KW_DO);}
    "else"				{return (KW_ELSE);}
    "float"			{return (KW_FLOAT);}
    "for"				{return (KW_FOR);}
    "if"				{return (KW_IF);}
    "int"				{return (KW_INT);}
    "printf"			{return (KW_PRINTF);}
    "return"			{return (KW_RETURN);}
    "void"				{return (KW_VOID);}
    "while"			{return (KW_WHILE);}
    
    {INTEGER}				{ yylval.intValue = atoi(yytext); return CONST_INT; }
    {FLOAT}([eE]([\-+])?{INTEGER})?	{ yylval.floatValue = atof(yytext); return CONST_FLOAT; }
    {INTEGER}([eE]([\-+])?{INTEGER})	{ yylval.floatValue = atof(yytext); return CONST_FLOAT; }
    {"true"}				{ yylval.intValue = 1; return CONST_BOOLEAN; }
    {"false"}				{ yylval.intValue = 0; return CONST_BOOLEAN; }
    {LETTER}+({LETTER}|{DIGIT})*	{ yylval.string = strdup(yytext); return ID; }
    
    <<EOF>>				{return (EOF);}
    
    <COMMENT_C>"*/"			{BEGIN (INITIAL);}  /*Automatenrueckschaltung*/
    <COMMENT_C>.				{;}  /*Kommentar wird ueberlesen*/
    
    %%
    


  • mit datei löschen meinte ich, den Inhalt ändern, und auchden ganzen Inhalt löschen. so dass die datei leer ist. trotzdem bekomme ich das premature EOF!



  • Wenn die Datei leer ist, hat sie nicht das benötigte Format, also ist es klar, dass lex damit nicht klarkommt. Es muss m.W. mindestens einmal %% drinstehen. Aber das nur am Rande. Du hast in Zeile 10 ein Leerzeichen zuviel. lex sucht die Zeichenfolge %} als Gegenstück zu %{ , kann sie aber nicht finden und erreicht irgendwann das Dateiende.



  • Hey, also in Zeile 10 habe ich kein Leerzeichen zu viel, ich beginne direkt am Zeilenanfang! Aber du hast mir trotzdem geholfen, denn ich Trottel habbe anstatt %} }% geschrieben. Das ist mir überhaupt nicht aufgefallen.
    Vielen Dank 🙂



  • Oh, Betriebsblindheit meinerseits 🙂



  • Hey, Der Fehler liegt an dem Deklarationsbereich.
    Er wird mit einem '%{' eingeleitet und mit '%{' geschlossen.

    %{ /*Deklarationen*/
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "minako.h"
    }%

    -->

    %{ /*Deklarationen*/
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "minako.h"
    %}

    LG



  • Sag das nächste mal doch bitte gleich im ersten Posting, dass du von deiner Eingabe für Flex, also deiner .l Datei sprichst und nicht von der Eingabe die der generierte Lexer bekommt. Ich wette, dass alle bis zu deinem zweiten Posting das falsch verstanden haben (und ich glaube einige sogar danach noch).


Anmelden zum Antworten