rendered paste body%{#include <stdio.h>#include <string.h>#include <stdlib.h>#define YYERROR_VERBOSE yes#define YYDEBUG 1extern int yylex();extern int yylineno;extern FILE *yyin;void yyerror(const char*);%}/* Token (KW steht fuer Keyword) */%token AND%token OR%token EQ%token NEQ%token LEQ%token GEQ%token LSS%token GRT%token KW_BEGIN%token KW_BOOLEAN%token KW_DO%token KW_ELSE%token KW_END%token KW_FLOAT%token KW_FOR%token KW_IF%token KW_INT%token KW_PRINTF%token KW_RETURN%token KW_VOID%token KW_WHILE%token CONST_INT%token CONST_FLOAT%token CONST_BOOLEAN/* ID = identifier */%token ID/* * Hier koennte noch was eingefuegt werden */%start programm%%/* Grammatik */programm : epsilon | programm_wbs_rs ;programm_wbs : declassignment ";" | functiondefinition ;programm_wbs_rs : programm_wbs | programm_wbs programm_wbs_rs ;functiondefinition : type id "(" functiondefinition_wq ")" functiondefinition_wb1 statementlist functiondefinition_wb2 ;functiondefinition_wq : epsilon | parameterlist ;functiondefinition_wb1 : "{" | KW_BEGIN ;functiondefinition_wb2 : "}" | KW_END ;parameterlist : type id parameterlist_wbs_wqs_rs ;parameterlist_wbs : "," type id ;parameterlist_wbs_rs : parameterlist_wbs | parameterlist_wbs parameterlist_wbs_rs ;parameterlist_wbs_wqs_rs : epsilon | parameterlist_wbs_rs ;functioncall : id "(" functioncall_wq ")" ;functioncall_wbs : "," assignment ;functioncall_wbs_rs : functioncall_wbs | functioncall_wbs functioncall_wbs_rs ;functioncall_wbs_wqs_rs : epsilon | functioncall_wbs_rs ;functioncall_wq : epsilon | assignment functioncall_wbs_wqs_rs ;statementlist : statementlist_wbs_wqs_rs ;statementlist_wbs : block ;statementlist_wbs_rs : statementlist_wbs | statementlist_wbs statementlist_wbs_rs ;statementlist_wbs_wqs_rs : epsilon | statementlist_wbs_rs ;block : block_wb1 statementlist block_wb2 | statement ;block_wb1 : "{" | KW_BEGIN ;block_wb2 : "}" | KW_END ;block2 : block2_wb1 statementlist block2_wb2 | statement ;block2_wb1 : "{" | KW_BEGIN ;block2_wb2 : "}" | KW_END ;statement : ifstatement | forstatement | whilestatement | returnstatement ";" | dowhilestatement ";" | printf ";" | declassignment ";" | statassignment ";" | functioncall ";" ;ifstatement : KW_IF "(" assignment ")" block2 ifstatement_wq ;ifstatement_wq : epsilon | KW_ELSE block2 ;forstatement : KW_FOR "(" forstatement_wb ";" expr ";" statassignment ")" block2 ;forstatement_wb : statassignment | declassignment ;dowhilestatement : KW_DO block2 KW_WHILE "(" assignment ")" ;whilestatement : KW_WHILE "(" assignment ")" block2 ;returnstatement : KW_RETURN returnstatement_wq ;returnstatement_wq : epsilon | assignment ;printf : KW_PRINTF "(" assignment ")" ;declassignment : type id declassignment_wq ;declassignment_wq : epsilon | "=" assignment ;type : KW_BOOLEAN | KW_FLOAT | KW_INT | KW_VOID ;statassignment : id "=" assignment ;assignment : id "=" assignment | expr ;expr : simpexpr expr_wb_wq ;expr_wb : EQ simpexpr | NEQ simpexpr | LEQ simpexpr | GEQ simpexpr | LSS simpexpr | GRT simpexpr ;expr_wb_wq : epsilon | expr_wb ;simpexpr : simpexpr_wb simpexpr_wbs_wqs_rs ;simpexpr_wb : "-" term | term ;simpexpr_wbs : "+" term | "-" term | OR term ;simpexpr_wbs_rs : simpexpr_wbs | simpexpr_wbs simpexpr_wbs_rs ;simpexpr_wbs_wqs_rs : epsilon | simpexpr_wbs_rs ;term : factor term_wbs_wqs_rsterm_wbs : "*" factor | "/" factor | AND factor ;term_wbs_rs : term_wbs | term_wbs term_wbs_rs ;term_wbs_wqs_rs : epsilon | term_wbs_rs ;factor : CONST_INT | CONST_FLOAT | CONST_BOOLEAN | functioncall | id | "(" assignment ")" ;id : ID ;epsilon : /* leer */ ;%%int main(int argc, char* argv[]) { /* Hier fehlt natuerlich auch noch was */ if (argc == 1) { yyin = stdin; printf("Lese von stdin\n"); } else { yyin = fopen(argv[1], "r"); if (yyin==NULL) { fprintf(stderr, "ERROR: %s existiert nicht!\n", argv[1]); return(-1); } } yydebug = 0; return yyparse();}void yyerror(const char* msg) { /* Hier fehlt natuerlich auch noch was */ fprintf(stderr, "Error: line %i, %s\n",yylineno, msg); exit(-1);}