From e63cc89162ec82b24add36b96c5467c8b0a48ca8 Mon Sep 17 00:00:00 2001 From: Bernhard Urban Date: Wed, 17 Mar 2010 23:45:57 +0100 Subject: [PATCH] parser: schaut fertig aus... muss nur noch getestet werden :D --- parser/parser.y | 98 +++++++++++++++++++--------------------------- parser/scanner.lex | 30 ++++++-------- 2 files changed, 54 insertions(+), 74 deletions(-) diff --git a/parser/parser.y b/parser/parser.y index ff86381..2618f19 100644 --- a/parser/parser.y +++ b/parser/parser.y @@ -4,61 +4,58 @@ %} %start Program -%token FUNC END STRUCT VAR IF THEN ELSE WHILE DO RETURN OR NOT -%token ID NUM ASSIGN GREATER +%token STRUCT END METHOD VAR IF THEN ELSE WHILE DO RETURN NOT OR THIS +%token IDENT NUM ASSIGN %% Program: - Funcdef ';' Program + Methoddef ';' Program | Structdef ';' Program | ; -Funcdef: - FUNC ID '(' Pars ')' Stats END - | FUNC ID '(' ')' Stats END - ; - Structdef: - STRUCT Ids END + STRUCT Idents END ; -Ids: - ID Ids - | +Methoddef: + METHOD IDENT '(' Idents ')' Statseq END ; -Pars: - Pars ',' ID - | ID +Idents: + IDENT Idents + | ; -Stats: - Stat ';' Stats +Statseq: + Statement ';' Statseq | ; -Stat: - VAR ID ASSIGN Expr - | Lexpr ASSIGN Expr - | IF Bool THEN Stats END - | IF Bool THEN Stats ELSE Stats END - | WHILE Bool DO Stats END - | Call +Statement: + Lexpr ASSIGN Expr + | VAR IDENT ASSIGN Expr + | Expr + | IF Expr THEN Statseq END + | IF Expr THEN Statseq ELSE Statseq END + | WHILE Expr DO Statseq END | RETURN Expr ; Lexpr: - ID - | Field + IDENT + | Term '.' IDENT ; Expr: - '-' Term - | Term + Term + | NOT Term | Term Plusterm - | Term Malterm + | Term Multerm + | Term Orterm + | Term '<' Term + | Term '=' Term ; Plusterm: @@ -66,43 +63,30 @@ Plusterm: | '+' Term ; -Malterm: - '*' Term Malterm +Multerm: + '*' Term Multerm | '*' Term ; -Term: - '(' Expr ')' - | ID - | NUM - | Call - | Field - ; - -Bool: - Bterm - | Bterm Orterm - | NOT Bterm - ; - Orterm: - OR Bterm Orterm - | OR Bterm + OR Term Orterm + | OR Term ; -Bterm: - Term GREATER Term - | Term '=' Term - | '(' Bool ')' - ; -Field: - Term '.' ID +Term: + '(' Expr ')' + | NUM + | '-' NUM + | THIS + | IDENT + | Term '.' IDENT + | Methcall ; -Call: - ID '(' Exprs ')' - | ID '(' ')' +Methcall: + IDENT '(' Exprs ')' + | Term '.' IDENT '(' Exprs ')' ; Exprs: diff --git a/parser/scanner.lex b/parser/scanner.lex index 8b1f859..6a2de5d 100644 --- a/parser/scanner.lex +++ b/parser/scanner.lex @@ -3,14 +3,14 @@ #include #include "parser.h" -KEYWORD func|end|struct|var|if|then|else|while|do|return|or|not -SPECIAL_CHAR \;|\.|\(|\)|\,|\:=|\-|\+|\*|>=|= -IDENTIFIER [[:alpha:]_][[:alnum:]_]* -NUMBER_HEX [0-9][0-9A-Fa-f]*H +KEYWORD struct|end|method|var|if|then|else|while|do|return|not|or|this +SPECIAL_CHAR \;|\(|\)|\:=|\.|\-|\*|\<|\=|\. +IDENTIFIER [a-zA-Z_][0-9a-zA-Z_]* +NUMBER_HEX 0x[0-9A-Fa-f]+ NUMBER_DEC [0-9]+ WHITESPACE [\t\n\r ] -COMMENT_START \(\* -COMMENT_END \*\) +COMMENT_START \/\* +COMMENT_END \*\/ %x COMMENT %option yylineno @@ -20,20 +20,16 @@ COMMENT_END \*\) {COMMENT_END} BEGIN(INITIAL); -{COMMENT_START} fprintf(stderr, "Possibly nested comment on line %i\n", yylineno); - <> { - fprintf(stderr, "Unterminated comment.\n"); + fprintf(stderr, "Kommentar nicht geschlossen\n"); exit(1); } -{WHITESPACE} /* ignore */ - -. /* ignore everything inside comment */ +(.|\n) /* alles im kommentar wird ignoriert */ -func return(FUNC); -end return(END); struct return(STRUCT); +end return(END); +method return(METHOD); var return(VAR); if return(IF); then return(THEN); @@ -41,16 +37,16 @@ else return(ELSE); while return(WHILE); do return(DO); return return(RETURN); -or return(OR); not return(NOT); +or return(OR); +this return(THIS); -{IDENTIFIER} return(ID); +{IDENTIFIER} return(IDENT); {NUMBER_DEC} return(NUM); {NUMBER_HEX} return(NUM); \:= return(ASSIGN); ->= return(GREATER); {SPECIAL_CHAR} return(yytext[0]); {WHITESPACE} /* ignore */ -- 2.25.1