yacc/bison/(f)lex Tutorial gesucht

Aiju

Gesperrt
Ich suche ein yacc/bison & (f)lex Tutorial (KEIN Buch) auf Deutsch (NICHT auf englisch, japanisch, französisch, spanisch, portugiesisch, italienisch, ...)
Ich verwende SuSE 10 und gcc 4
 
P.S. Falls du für später ne Aufgabe suchen solltest oder Bsp Code für einen
Parser brauchst kannst du auch hier mal schauen:

Hier die Grammatik zur Sprache:
http://if-portal.fh-landshut.de/fbi...ik/5.Semester/Compiler/Praktikum/Aufgabe1.pdf

Hier die Aufgabe:
http://people.fh-landshut.de/~skreyer/compiler/Aufgabe2_stud/aufgabe2.pdf

Den Beispielcode zur Lösung findest du hier:
http://people.fh-landshut.de/~skreyer/compiler/Aufgabe2_stud/
(wichtig sind dabei halt die Dateien pla.l und pla.y)

Gruß

RedWing
 
Zuletzt bearbeitet:
Wie gefällt dir das Online Ausprobieren? ;)
Ich habe nur Flex nicht integriert gekriegt, der Parser aus TexInfo gefiel mir besser...
 
Wie gefällt dir das Online Ausprobieren?
Nicht schlecht, hab ihn bis jetzt zumindest nicht sprengen koennen :)

Ich habe nur Flex nicht integriert gekriegt, der Parser aus TexInfo gefiel mir besser...
flex is ja auch n Scanner ;)
Aber die Sache zu integrieren is eigentlich relativ einfach. Folgendes Bsp:

calc.y:

Code:
%{
#include <stdio.h>
int yylex(void);
void yyerror(char*);
%}

%token NUMBER
%token FULLSTOP 280 "."
%token KLAUF 281 "("
%token KLZU  282 ")"
%token PLUS 283 "+"
%token MINUS 284 "-"
%token MULT 285 "*"
%token DIV 286 "/"

%start PROG

%%
PROG: EXP FULLSTOP {printf("Erg: %d\n", $1); }
EXP: TERM       {$$ = $1;}
| TERM "+" EXP  {$$ = $1 + $3}
| TERM "-" EXP  {$$ = $1 - $3}
;
TERM: FAKT      {$$ = $1}
| FAKT "*" TERM {$$ = $1 * $3;}
| FAKT "/" TERM {$$ = $1 / $3}
;
FAKT: NUMBER  {$$ = yylval}
| "(" EXP ")"   {$$ = $2;}
;
%%

int main(int argc, char* argv[]){
    printf("Das Programm berechnet einen Ausdruck der Form a+b*c\n");
    printf("Ausdruck mit . abschließen\n");
    return yyparse();
}

void yyerror (char* s){
    printf ("%s\n", s);
}

Zu übersetzen mit:
Code:
bison -d calc.y

calc.l:

Code:
%{
    #include "calc.tab.h"
%}

DIGIT   [0-9]

%%
"("     return KLAUF;
")"     return KLZU;
"+"     return PLUS;
"-"     return MINUS;
"*"     return MULT;
"/"     return DIV;
"."     return FULLSTOP;

{DIGIT}+    {
                yylval = atoi(yytext);
                return NUMBER;
            }

[ \t\n\r]       /* Whitespaces ignorieren */
.       {   /* alle anderen Zeichen sind Fehler */
            fprintf(stderr, "%s is no valid character\n", yytext);
            exit(1);
        }
%%
zu übersetzen mit:

Code:
flex calc.l

Dann noch das Programm via:
Code:
g++ lex.yy.c calc.tab.c -lfl
backen, ausführen fertig :)

Gruß

RedWing
 
Zurück