lex & yacc



  • Hallo,

    ich arbeite zur Zeit an einem kleinen Kalkulator, den ich mit Hilfe von "lex & yacc" realisieren möchte. Nun habe ich aber das Problem, dass eine Eingabe immer nur EINMAL beachtet wird. Wenn ich z.B. "5+4;" (das Semikolon ist wichtig, doch dass werdet ihr später aus dem "grammar file" erkennen) eingebe, dann wird auch 9 zurückgegeben, doch gegen neue Eingaben wehrt sich das Programm irgendwie. 🙂

    Was mache ich falsch? Falls jemand Zeit und Lust hat, kann er sich das ja mal anschauen. Die Datein sind noch rudimentär, doch werden noch erweitert. Funktional ist zur Zeit nur die Addition implementiert....

    Hier das "Scanner - Modul":

    %{
    #include <stdlib.h>
    %}
    %%
    [+] return('+'); /* Bei Erkennen der verschiedenen /

    Operatoren, werden die jeweiligen*/
    [] return(''); /* Literale an "yacc" uebergeben. */
    [/] return('/');
    [0-9]+ {yylval = atoi(yytext); return(ZAHL);}
    [a-z,A-Z]? return(NAME);
    [==] return(COMP);
    [!=] return(COMP);
    [<] return(COMP);
    [>] return(COMP);
    (sin)+ return(FUNKTION);
    (cos)+ return(FUNKTION);
    (exp)+ return(FUNKTION);
    (pow)+ return(FUNKTION);
    [(] return('(');
    [)] return(')');
    [:] return(':');
    [;] return(';');
    \n |
    . ;
    %%

    Und nun die yacc-Datei:

    %token NAME ZAHL FUNKTION /* FUNKTION steht für die einzelnen math. Funktionen /
    %right '?' ':'
    %left COMP /
    Vergleichsoperatoren sind “== != < >“ /
    %left '-' '+'
    %left '
    ' '/'
    %nonassoc UMINUS
    %%
    block: statement {printf("%d\n",1);}| block statement ; statement: NAME '=' expression ';' | expression ';' {$=1;} | '{' block '}' ; expression: expression '?' expression ':' expression | expression COMP expression | expression '+' expression {$=$1+3;} | expression '-' expression {$=$1-3;} | expression '*' expression {$=$1*3;} | expression '/' expression {$=$1/$3;}
    | '+' expression %prec UMINUS
    | '-' expression %prec UMINUS
    | FUNKTION '(' expression ')'
    | '(' expression ')'
    | ZAHL {}
    | NAME ;
    %%
    #include "lex.yy.c"

    int yyerror(){ /* Für das bekanntgeben von Fehlern....*/

    printf("Syntaxfehler erkannt...\n");

    } /* Ende der Funktion "yyerror()" */

    int main(int argc, char *argv[]){

    yyparse();
    return(0);

    } /* Ende der Funktion "main()" */

    Bitte bitte helft mir....
    Also, falls ihr es mal ausprobiert: Es muss erst ein "Syntax Fehler" erzwungen werden, bevor es weiter geht.... Und ich weiß nicht warum.
    Danke im vorraus.... CU



  • Dieser Thread wurde von Moderator/in CMatt aus dem Forum C# und .NET in das Forum Rund um die Programmierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Anmelden zum Antworten