%}
%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:
| '+' 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:
#include <string.h>
#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
<COMMENT>{COMMENT_END} BEGIN(INITIAL);
-<COMMENT>{COMMENT_START} fprintf(stderr, "Possibly nested comment on line %i\n", yylineno);
-
<COMMENT><<EOF>> {
- fprintf(stderr, "Unterminated comment.\n");
+ fprintf(stderr, "Kommentar nicht geschlossen\n");
exit(1);
}
-<COMMENT>{WHITESPACE} /* ignore */
-
-<COMMENT>. /* ignore everything inside comment */
+<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);
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 */