parser: 'gescheide formatierung, sunst werd i a noar'
authorBernhard Urban <lewurm@gmail.com>
Wed, 17 Mar 2010 22:21:01 +0000 (23:21 +0100)
committerBernhard Urban <lewurm@gmail.com>
Wed, 17 Mar 2010 22:21:01 +0000 (23:21 +0100)
parser/parser.y
parser/scanner.lex

index 1789efe3df37f7dfc2ad4d91e656a480184e6a67..ff863819717629e6728f633a36b900aed38c0333 100644 (file)
        #include <stdlib.h>
 %}
 
-%start         Program
-%token         FUNC END STRUCT VAR IF THEN ELSE WHILE DO RETURN OR NOT
-%token         ID NUM ASSIGN GREATER
+%start Program
+%token FUNC END STRUCT VAR IF THEN ELSE WHILE DO RETURN OR NOT
+%token ID NUM ASSIGN GREATER
 
 %%
 
-Program:         Funcdef ';' Program
-               | Structdef ';' Program
-               |
-               ;
-Funcdef:         FUNC ID '(' Pars ')' Stats END
-               | FUNC ID '(' ')' Stats END
-               ;  
-Structdef:       STRUCT Ids END
-               ;  
-
-Ids:             ID Ids
-               | 
-               ;
-
-Pars:            Pars ',' ID
-               | ID
-               ; 
-Stats:           Stat ';' Stats  
-               |
-               ;  
-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
-               | RETURN Expr
-               ;
-Lexpr:           ID
-               | Field
-               ;
-Expr:            '-' Term
-               | Term
-               | Term Plusterm
-               | Term Malterm
-               ;
-
-Plusterm:        '+' Term Plusterm
-               | '+' Term
-               ;
-
-Malterm:         '*' Term Malterm
-                       | '*' Term
-               ;
-Term:            '(' Expr ')'
-               | ID
-               | NUM
-               | Call
-               | Field
-               ;
-
-Bool:            Bterm
-               | Bterm Orterm
-               | NOT Bterm
-               ;
-
-Orterm:                  OR Bterm Orterm
-               | OR Bterm
-               ;
-
-Bterm:           Term GREATER Term
-               | Term '=' Term
-               | '(' Bool ')'
-               ;
-
-Field:           Term '.' ID
-               ;
-
-Call:            ID '(' Exprs ')'
-               | ID '(' ')'
-               ;
-
-Exprs:           Expr
-               | Exprs ',' Expr
-               ;
+Program:
+         Funcdef ';' Program
+       | Structdef ';' Program
+       |
+       ;
+
+Funcdef:
+         FUNC ID '(' Pars ')' Stats END
+       | FUNC ID '(' ')' Stats END
+       ;
+
+Structdef:
+         STRUCT Ids END
+       ;
+
+Ids:
+         ID Ids
+       |
+       ;
+
+Pars:
+         Pars ',' ID
+       | ID
+       ;
+
+Stats:
+         Stat ';' Stats
+       |
+       ;
+
+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
+       | RETURN Expr
+       ;
+
+Lexpr:
+         ID
+       | Field
+       ;
+
+Expr:
+         '-' Term
+       | Term
+       | Term Plusterm
+       | Term Malterm
+       ;
+
+Plusterm:
+         '+' Term Plusterm
+       | '+' Term
+       ;
+
+Malterm:
+         '*' Term Malterm
+       | '*' Term
+       ;
+
+Term:
+         '(' Expr ')'
+       | ID
+       | NUM
+       | Call
+       | Field
+       ;
+
+Bool:
+         Bterm
+       | Bterm Orterm
+       | NOT Bterm
+       ;
+
+Orterm:
+         OR Bterm Orterm
+       | OR Bterm
+       ;
+
+Bterm:
+         Term GREATER Term
+       | Term '=' Term
+       | '(' Bool ')'
+       ;
+
+Field:
+         Term '.' ID
+       ;
+
+Call:
+         ID '(' Exprs ')'
+       | ID '(' ')'
+       ;
+
+Exprs:
+         Expr
+       | Exprs ',' Expr
+       ;
 
 %%
 
 extern int yylex();
 extern int yylineno;
 
-int yyerror(char *error_text) {
-       fprintf(stderr,"Line %i: %s\n",yylineno, error_text);
+int yyerror(char *error_text)
+{
+       fprintf(stderr,"Line %i: %s\n", yylineno, error_text);
        exit(2);
 }
 
-int main(int argc, char **argv) {
-/*     yydebug=1; */
+int main(int argc, char **argv)
+{
+       #if 0
+       yydebug=1;
+       #endif
        yyparse();
        return 0;
 }
index 043db069aaaa740940eae885a5f4e4f3606604c0..8b1f859dfb2e4e41ecedbf7d66723056da012e03 100644 (file)
@@ -3,57 +3,62 @@
        #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
-NUMBER_DEC     [0-9]+
-WHITESPACE     [\t\n\r ]
-COMMENT_START  \(\*
-COMMENT_END    \*\)
+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
+NUMBER_DEC [0-9]+
+WHITESPACE [\t\n\r ]
+COMMENT_START \(\*
+COMMENT_END \*\)
 
 %x COMMENT
 %option yylineno
 %%
 
-{COMMENT_START}                        BEGIN(COMMENT);
+{COMMENT_START} BEGIN(COMMENT);
 
-<COMMENT>{COMMENT_END}         BEGIN(INITIAL);
+<COMMENT>{COMMENT_END} BEGIN(INITIAL);
 
-<COMMENT>{COMMENT_START}       fprintf(stderr, "Possibly nested comment on line %i\n", yylineno);
+<COMMENT>{COMMENT_START} fprintf(stderr, "Possibly nested comment on line %i\n", yylineno);
 
-<COMMENT><<EOF>>               { fprintf(stderr, "Unterminated comment.\n"); exit(1); }
+<COMMENT><<EOF>> {
+       fprintf(stderr, "Unterminated comment.\n");
+       exit(1);
+}
 
-<COMMENT>{WHITESPACE}          /* ignore */
+<COMMENT>{WHITESPACE} /* ignore */
 
-<COMMENT>.                     /* ignore everything inside comment */
+<COMMENT>. /* ignore everything inside comment */
 
-func                           return(FUNC);
-end                            return(END);
-struct                         return(STRUCT);
-var                            return(VAR);
-if                             return(IF);
-then                           return(THEN);
-else                           return(ELSE);
-while                          return(WHILE);
-do                             return(DO);
-return                         return(RETURN);
-or                             return(OR);
-not                            return(NOT);
+func return(FUNC);
+end return(END);
+struct return(STRUCT);
+var return(VAR);
+if return(IF);
+then return(THEN);
+else return(ELSE);
+while return(WHILE);
+do return(DO);
+return return(RETURN);
+or return(OR);
+not return(NOT);
 
-{IDENTIFIER}                   return(ID);
+{IDENTIFIER} return(ID);
 
-{NUMBER_DEC}                   return(NUM);
-{NUMBER_HEX}                   return(NUM);
-                               
-\:=                            return(ASSIGN);
->=                             return(GREATER);
-{SPECIAL_CHAR}                 return(yytext[0]);
+{NUMBER_DEC} return(NUM);
+{NUMBER_HEX} return(NUM);
 
-{WHITESPACE}                   /* ignore */
+\:= return(ASSIGN);
+>= return(GREATER);
+{SPECIAL_CHAR} return(yytext[0]);
 
-.                              { fprintf(stderr, "Lexical error on line %i\n", yylineno); exit(1); }
+{WHITESPACE} /* ignore */
 
-%%
+. {
+               fprintf(stderr, "Lexical error on line %i\n", yylineno);
+               exit(1);
+}
 
+%%