All pastes #1745420 Raw Edit

...

public c v1 · immutable
#1745420 ·published 2010-01-10 12:56 UTC
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 program%%/* Grammatik */program : epsilon	 | program_wbs_rs	 ;program_wbs : declassignment ';'	     | functiondefinition	     ;program_wbs_rs : program_wbs		| program_wbs program_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);}