parser: schaut fertig aus... muss nur noch getestet werden :D
authorBernhard Urban <lewurm@gmail.com>
Wed, 17 Mar 2010 22:45:57 +0000 (23:45 +0100)
committerBernhard Urban <lewurm@gmail.com>
Wed, 17 Mar 2010 22:46:33 +0000 (23:46 +0100)
parser/parser.y
parser/scanner.lex

index ff863819717629e6728f633a36b900aed38c0333..2618f192e6ebdc24314272949f0042e53d2400f1 100644 (file)
@@ -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:
index 8b1f859dfb2e4e41ecedbf7d66723056da012e03..6a2de5d61508b3d82fd97131c81ccf349f1b608a 100644 (file)
@@ -3,14 +3,14 @@
        #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
@@ -20,20 +20,16 @@ COMMENT_END \*\)
 
 <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);
@@ -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 */