Created
June 10, 2010 08:12
-
-
Save LTe/432695 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| %{ | |
| /* Deklaracje dla C */ | |
| #include <stdio.h> | |
| #include <stdlib.h> | |
| #include <string.h> | |
| #define YYDEBUG 1 | |
| #include "deklaracje.h" | |
| #include "code_generator.h" | |
| /* Ilość błędów */ | |
| int errors; | |
| /* Struktura dla etykiet do petli IF, WHILE */ | |
| struct lbs | |
| { | |
| int for_goto; | |
| int for_jmp_false; | |
| }; | |
| /* Inicjalizacja nowej struktury */ | |
| struct lbs * newlblrec() | |
| { | |
| /* malloc zwraca *void więc należy rzutować na strukturę ponownie */ | |
| return (struct lbs *) malloc(sizeof(struct lbs)); | |
| } | |
| /* Deklaracja zmiennej */ | |
| declare(char *name) | |
| { | |
| zmienne *identifier; | |
| identifier = czyZadeklarowane(name); //check if prevoiusly declared | |
| if (identifier == 0) | |
| { | |
| identifier = dodajDeklaracje(name); | |
| } | |
| else | |
| { | |
| errors++; | |
| printf("%s jest zdeklarowany\n", name); | |
| } | |
| } | |
| /* Sprawdzenie zadeklarowania */ | |
| context_check(char *command, char *name) | |
| { | |
| zmienne *identifier; | |
| identifier = czyZadeklarowane(name); | |
| if(identifier == 0) | |
| { | |
| errors++; | |
| printf("%s nie jest zdeklarowany\n", name); | |
| } | |
| else | |
| { | |
| generujKod(command, identifier->numerRejestru); | |
| } | |
| } | |
| %} | |
| %union semrec | |
| { | |
| int intval; | |
| char *id; | |
| struct lbs *lbls; | |
| } | |
| %start program | |
| %token <intval> NUMBER | |
| %token <id> IDENTIFIER | |
| %token <lbls> IF WHILE | |
| %token THEN ELSE DO END | |
| %token READ PRINT VAR START | |
| %token ASSIGN | |
| %left EQ NEQ LT GT LTEQ GTEQ | |
| %left '-' '+' | |
| %left '*' '/' | |
| %% | |
| program : VAR | |
| declarations | |
| START | |
| commands | |
| END { generujKod("HALT", -1); YYACCEPT; } | |
| ; | |
| declarations : /* empty */ | |
| | id_seq IDENTIFIER { declare($2); } | |
| ; | |
| id_seq : /* empty */ | |
| | id_seq IDENTIFIER { declare($2); } | |
| ; | |
| commands : commands command | |
| | | |
| ; | |
| command : IDENTIFIER ASSIGN exp ';' { context_check("STORE", $1); } | |
| | READ IDENTIFIER ';' { context_check("READ", $2); } | |
| | PRINT IDENTIFIER ';' { context_check("PRINT", $2); } | |
| | PRINT NUMBER ';' { | |
| generujKod("ZERO", -1); | |
| generujKod("ADDC", $2); | |
| context_check("STORE", "#print0"); | |
| context_check("PRINT", "#print0") | |
| } | |
| | IF condition { | |
| $1 = (struct lbs *) newlblrec(); | |
| $1->for_jmp_false = rezerwujMiejsce(); | |
| } | |
| THEN commands { | |
| $1->for_goto = rezerwujMiejsce(); } | |
| ELSE { | |
| back_patch($1->for_jmp_false, "JGE", generujEtykiete()); } | |
| commands | |
| END { | |
| back_patch($1->for_goto, "JUMP", generujEtykiete()); } | |
| | WHILE { | |
| $1 = (struct lbs *) newlblrec(); | |
| $1->for_goto = generujEtykiete(); | |
| } | |
| condition { $1->for_jmp_false = rezerwujMiejsce(); } | |
| DO | |
| commands | |
| END { | |
| generujKod("JUMP", $1->for_goto ); | |
| back_patch( $1->for_jmp_false, "JGE", generujEtykiete()); | |
| } | |
| ; | |
| exp : NUMBER { generujKod("ZERO", -1); | |
| generujKod("ADDC", $1); | |
| } | |
| | IDENTIFIER { context_check("LOAD", $1); } | |
| | NUMBER '+' NUMBER { generujKod("ZERO", -1); | |
| generujKod("ADDC", $1); | |
| generujKod("ADDC", $3); | |
| } | |
| | IDENTIFIER '+' IDENTIFIER { context_check("LOAD", $1); | |
| context_check("ADD", $3); | |
| } | |
| | IDENTIFIER '+' NUMBER { context_check("LOAD", $1); | |
| generujKod("ADDC", $3); | |
| } | |
| | NUMBER '+' IDENTIFIER { generujKod("ZERO", -1); | |
| generujKod("ADDC", $1); | |
| context_check("ADD", $3); | |
| } | |
| | NUMBER '-' NUMBER { generujKod("ZERO", -1); | |
| generujKod("ADDC", $1); | |
| generujKod("SUBC", $3); | |
| } | |
| | IDENTIFIER '-' IDENTIFIER { context_check("LOAD", $1); | |
| context_check("SUB", $3); | |
| } | |
| | IDENTIFIER '-' NUMBER { context_check("LOAD", $1); | |
| generujKod("SUBC", $3); | |
| } | |
| | NUMBER '-' IDENTIFIER { generujKod("ZERO", -1); | |
| generujKod("ADDC", $1); | |
| context_check("SUB", $3); | |
| } | |
| | NUMBER '*' NUMBER { generujKod("ZERO",-1); | |
| generujKod("ADDC", ($1*$3));} | |
| | NUMBER '*' IDENTIFIER { | |
| if($1==0) | |
| generujKod("ZERO",-1); | |
| else if ($1==1) | |
| context_check("LOAD",$3); | |
| else | |
| { | |
| } | |
| } | |
| | IDENTIFIER '*' NUMBER { | |
| if($3==0) | |
| { | |
| generujKod("ZERO",-1); | |
| } | |
| else if ($3==1) | |
| { | |
| context_check("LOAD",$1); | |
| } | |
| else | |
| { | |
| } | |
| } | |
| | IDENTIFIER '*' IDENTIFIER { | |
| generujKod("ZERO", -1); | |
| context_check("STORE", "xA"); | |
| context_check("LOAD", $1); | |
| context_check("STORE", "xB"); | |
| context_check("LOAD", $3); | |
| context_check("STORE", "xC"); | |
| context_check("LOAD", "#jeden"); | |
| context_check("STORE", "xD"); | |
| context_check("ADD", "xD"); | |
| context_check("SUB", "xB"); | |
| generujKod("JGE", generujEtykiete()+10); | |
| context_check("LOAD", "xC"); | |
| context_check("ADD", "xC"); | |
| context_check("STORE", "xC"); | |
| context_check("LOAD", "xD"); | |
| context_check("ADD", "xD"); | |
| context_check("STORE", "xD"); | |
| context_check("LOAD", "xD"); | |
| context_check("ADD", "xD"); | |
| generujKod("JUMP", generujEtykiete()-10); | |
| context_check("LOAD", "xB"); | |
| context_check("SUB", "xD"); | |
| context_check("STORE", "xB"); | |
| context_check("LOAD", "xC"); | |
| context_check("ADD", "xA"); | |
| context_check("STORE", "xA"); | |
| generujKod("ZERO", -1); | |
| context_check("ADD", "xB"); | |
| generujKod("JZ", generujEtykiete()+4); | |
| context_check("LOAD", $3); | |
| context_check("STORE", "xC"); | |
| generujKod("JUMP", generujEtykiete()-25); | |
| context_check("LOAD", "xA"); | |
| } | |
| | NUMBER '/' NUMBER { | |
| if($3==0) | |
| { | |
| generujKod("ZERO",-1); | |
| } | |
| else if($1/$3<=0) | |
| generujKod("ZERO",-1); | |
| else | |
| { | |
| generujKod("ZERO",-1); | |
| generujKod("ADDC", ($1/$3)); | |
| } | |
| } | |
| | NUMBER '/' IDENTIFIER | |
| { | |
| if($1==0) | |
| generujKod("ZERO",-1); | |
| else | |
| { | |
| } | |
| } | |
| | IDENTIFIER '/' NUMBER | |
| { | |
| if($3==0) | |
| generujKod("ZERO",-1); | |
| else if($3==1) | |
| context_check("LOAD", $1); | |
| else | |
| { | |
| } | |
| } | |
| | IDENTIFIER '/' IDENTIFIER { | |
| generujKod("ZERO", -1); | |
| context_check("ADD", $3); | |
| generujKod("JZ", generujEtykiete()+32); | |
| context_check("STORE", "xB"); | |
| context_check("LOAD", $1); | |
| context_check("STORE", "xA"); | |
| context_check("LOAD", "#jeden"); | |
| context_check("STORE", "xD"); | |
| context_check("LOAD", $3); | |
| context_check("STORE", "xC"); | |
| context_check("ADD", "xC"); | |
| context_check("SUB", "xA"); | |
| generujKod("JGE", generujEtykiete()+9); | |
| context_check("LOAD", "xD"); | |
| context_check("ADD", "xD"); | |
| context_check("STORE", "xD"); | |
| context_check("LOAD", "xC"); | |
| context_check("ADD", "xC"); | |
| context_check("STORE", "xC"); | |
| context_check("ADD", "xC"); | |
| generujKod("JUMP", generujEtykiete()-9); // | |
| context_check("LOAD", "xC"); | |
| context_check("SUB", "xA"); | |
| generujKod("JGE", generujEtykiete()+7); | |
| context_check("LOAD", "xA"); | |
| context_check("SUB", "xC"); | |
| context_check("STORE", "xA"); | |
| context_check("LOAD", "xB"); | |
| context_check("ADD", "xD"); | |
| context_check("STORE", "xB"); | |
| context_check("LOAD", $3); | |
| context_check("SUB", "xA"); | |
| generujKod("JGE", generujEtykiete()+4); | |
| generujKod("JUMP", generujEtykiete()-27); | |
| generujKod("ZERO", -1); | |
| generujKod("JUMP", generujEtykiete()+2); | |
| context_check("LOAD", "xB"); | |
| context_check("SUB", $3); | |
| } | |
| | NUMBER '%' NUMBER { | |
| generujKod("LOAD", $1 % $3); | |
| } | |
| | NUMBER '%' IDENTIFIER { | |
| } | |
| | IDENTIFIER '%' NUMBER { | |
| } | |
| | IDENTIFIER '%' IDENTIFIER { | |
| generujKod("ZERO", -1); | |
| context_check("STORE", "xB"); | |
| context_check("LOAD", $1); | |
| context_check("STORE", "xA"); | |
| context_check("LOAD", "#jeden"); | |
| context_check("STORE", "xD"); | |
| context_check("LOAD", $3); | |
| context_check("STORE", "xC"); | |
| context_check("ADD", "xC"); | |
| context_check("SUB", "xA"); | |
| generujKod("JGE", generujEtykiete()+9); | |
| context_check("LOAD", "xD"); | |
| context_check("ADD", "xD"); | |
| context_check("STORE", "xD"); | |
| context_check("LOAD", "xC"); | |
| context_check("ADD", "xC"); | |
| context_check("STORE", "xC"); | |
| context_check("ADD", "xC"); | |
| generujKod("JUMP", generujEtykiete()-9); // | |
| context_check("LOAD", "xC"); | |
| context_check("SUB", "xA"); | |
| generujKod("JGE", generujEtykiete()+7); | |
| context_check("LOAD", "xA"); | |
| context_check("SUB", "xC"); | |
| context_check("STORE", "xA"); | |
| context_check("LOAD", "xB"); | |
| context_check("ADD", "xD"); | |
| context_check("STORE", "xB"); | |
| context_check("LOAD", $3); | |
| context_check("SUB", "xA"); | |
| generujKod("JGE", generujEtykiete()+2); | |
| generujKod("JUMP", generujEtykiete()-27); | |
| context_check("LOAD", "xA"); | |
| } | |
| ; | |
| condition : NUMBER EQ NUMBER { | |
| if($1 == $3) | |
| { | |
| generujKod("ZERO", -1); | |
| } | |
| else | |
| { | |
| generujKod("ZERO", -1); | |
| generujKod("ADDC", 1); | |
| } | |
| } | |
| | NUMBER EQ IDENTIFIER { | |
| generujKod("ZERO", -1); | |
| generujKod("ADDC", $1); | |
| context_check("STORE", "xC"); | |
| context_check("SUB", $3); | |
| generujKod("JGE", generujEtykiete()+6); /* Jak wieksze to niech bedzie z lewej strony */ | |
| context_check("LOAD", $3); | |
| context_check("STORE", "xA"); | |
| context_check("LOAD", "xC"); | |
| context_check("STORE", "xB"); | |
| generujKod("JUMP", generujEtykiete()+5); | |
| context_check("LOAD", "xC"); | |
| context_check("STORE", "xA"); | |
| context_check("LOAD", $3); | |
| context_check("STORE", "xB"); | |
| context_check("LOAD", "xA"); | |
| context_check("SUB", "xB"); | |
| generujKod("JGE", generujEtykiete()+3); | |
| generujKod("ZERO", -1); | |
| generujKod("JUMP", generujEtykiete()+2); | |
| context_check("LOAD", "#jeden"); | |
| } | |
| | IDENTIFIER EQ NUMBER { | |
| generujKod("ZERO", -1); | |
| generujKod("ADDC", $3); | |
| context_check("STORE", "xC"); | |
| context_check("SUB", $1); | |
| generujKod("JGE", generujEtykiete()+6); /* Jak wieksze to niech bedzie z lewej strony */ | |
| context_check("LOAD", $1); | |
| context_check("STORE", "xA"); | |
| context_check("LOAD", "xC"); | |
| context_check("STORE", "xB"); | |
| generujKod("JUMP", generujEtykiete()+5); | |
| context_check("LOAD", "xC"); | |
| context_check("STORE", "xA"); | |
| context_check("LOAD", $1); | |
| context_check("STORE", "xB"); | |
| context_check("LOAD", "xA"); | |
| context_check("SUB", "xB"); | |
| generujKod("JGE", generujEtykiete()+3); | |
| generujKod("ZERO", -1); | |
| generujKod("JUMP", generujEtykiete()+2); | |
| context_check("LOAD", "#jeden"); | |
| } | |
| | IDENTIFIER EQ IDENTIFIER { | |
| context_check("LOAD", $1); | |
| context_check("SUB", $3); | |
| generujKod("JGE", generujEtykiete()+6); /* Jak wieksze to niech bedzie z lewej strony */ | |
| context_check("LOAD", $3); | |
| context_check("STORE", "xA"); | |
| context_check("LOAD", $1); | |
| context_check("STORE", "xB"); | |
| generujKod("JUMP", generujEtykiete()+5); | |
| context_check("LOAD", $1); | |
| context_check("STORE", "xA"); | |
| context_check("LOAD", $3); | |
| context_check("STORE", "xB"); | |
| context_check("LOAD", "xA"); | |
| context_check("SUB", "xB"); | |
| generujKod("JGE", generujEtykiete()+3); | |
| generujKod("ZERO", -1); | |
| generujKod("JUMP", generujEtykiete()+2); | |
| context_check("LOAD", "#jeden"); | |
| /* Tutaj if */ | |
| } | |
| | NUMBER NEQ NUMBER { | |
| if($1 == $3) | |
| { | |
| context_check("LOAD", "#jeden"); | |
| } | |
| else | |
| { | |
| generujKod("ZERO", -1); | |
| } | |
| } | |
| | NUMBER NEQ IDENTIFIER { | |
| generujKod("ZERO", -1); | |
| generujKod("ADDC", $1); | |
| context_check("STORE", "xC"); | |
| context_check("SUB", $3); | |
| generujKod("JGE", generujEtykiete()+6); /* Jak wieksze to niech bedzie z lewej strony */ | |
| context_check("LOAD", $3); | |
| context_check("STORE", "xA"); | |
| context_check("LOAD", "xC"); | |
| context_check("STORE", "xB"); | |
| generujKod("JUMP", generujEtykiete()+5); | |
| context_check("LOAD", "xC"); | |
| context_check("STORE", "xA"); | |
| context_check("LOAD", $3); | |
| context_check("STORE", "xB"); | |
| context_check("LOAD", "xA"); | |
| context_check("SUB", "xB"); | |
| generujKod("JGE", generujEtykiete()+3); | |
| context_check("LOAD", "#jeden"); | |
| generujKod("JUMP", generujEtykiete()+2); | |
| generujKod("ZERO", -1); | |
| } | |
| | IDENTIFIER NEQ NUMBER { | |
| generujKod("ZERO", -1); | |
| generujKod("ADDC", $3); | |
| context_check("STORE", "xC"); | |
| context_check("SUB", $1); | |
| generujKod("JGE", generujEtykiete()+6); /* Jak wieksze to niech bedzie z lewej strony */ | |
| context_check("LOAD", $1); | |
| context_check("STORE", "xA"); | |
| context_check("LOAD", "xC"); | |
| context_check("STORE", "xB"); | |
| generujKod("JUMP", generujEtykiete()+5); | |
| context_check("LOAD", "xC"); | |
| context_check("STORE", "xA"); | |
| context_check("LOAD", $1); | |
| context_check("STORE", "xB"); | |
| context_check("LOAD", "xA"); | |
| context_check("SUB", "xB"); | |
| generujKod("JGE", generujEtykiete()+3); | |
| context_check("LOAD", "#jeden"); | |
| generujKod("JUMP", generujEtykiete()+2); | |
| generujKod("ZERO", -1); | |
| } | |
| | IDENTIFIER NEQ IDENTIFIER { | |
| context_check("LOAD", $1); | |
| context_check("SUB", $3); | |
| generujKod("JGE", generujEtykiete()+6); /* Jak wieksze to niech bedzie z lewej strony */ | |
| context_check("LOAD", $3); | |
| context_check("STORE", "xA"); | |
| context_check("LOAD", $1); | |
| context_check("STORE", "xB"); | |
| generujKod("JUMP", generujEtykiete()+5); | |
| context_check("LOAD", $1); | |
| context_check("STORE", "xA"); | |
| context_check("LOAD", $3); | |
| context_check("STORE", "xB"); | |
| context_check("LOAD", "xA"); | |
| context_check("SUB", "xB"); | |
| generujKod("JGE", generujEtykiete()+3); | |
| context_check("LOAD", "#jeden"); | |
| generujKod("JUMP", generujEtykiete()+2); | |
| generujKod("ZERO", -1); | |
| /* Tutaj if */ | |
| } | |
| | NUMBER LT NUMBER { | |
| if($1 < $3) | |
| generujKod("ZERO", -1); | |
| else | |
| context_check("LOAD", "#jeden"); | |
| } | |
| | NUMBER LT IDENTIFIER {; | |
| context_check("LOAD", $3); | |
| generujKod("SUBC", $1); | |
| generujKod("JGE", generujEtykiete()+3); /* Większe */ | |
| context_check("LOAD", "#jeden"); | |
| generujKod("JUMP", generujEtykiete()+2); | |
| generujKod("ZERO", -1); | |
| /* if */ | |
| } | |
| | IDENTIFIER LT NUMBER { | |
| generujKod("ZERO", -1); | |
| generujKod("ADDC", $3); | |
| context_check("SUB", $1); | |
| generujKod("JGE", generujEtykiete()+3); /* Większe */ | |
| context_check("LOAD", "#jeden"); | |
| generujKod("JUMP", generujEtykiete()+2); | |
| generujKod("ZERO", -1); | |
| } | |
| | IDENTIFIER LT IDENTIFIER { | |
| context_check("LOAD", $3); | |
| context_check("SUB", $1); | |
| generujKod("JGE", generujEtykiete()+3); /* Większe */ | |
| context_check("LOAD", "#jeden"); | |
| generujKod("JUMP", generujEtykiete()+2); | |
| generujKod("ZERO", -1); | |
| } | |
| | NUMBER GT NUMBER { | |
| if($1 > $3) | |
| generujKod("ZERO", -1); | |
| else | |
| context_check("LOAD", "#jeden"); | |
| } | |
| | NUMBER GT IDENTIFIER { | |
| generujKod("ZERO", -1); | |
| generujKod("ADDC", $1); | |
| context_check("SUB", $3); | |
| generujKod("JGE", generujEtykiete()+3); /* Większe */ | |
| context_check("LOAD", "#jeden"); | |
| generujKod("JUMP", generujEtykiete()+2); | |
| generujKod("ZERO", -1); | |
| } | |
| | IDENTIFIER GT NUMBER { | |
| context_check("LOAD", $1); | |
| generujKod("SUBC", $3); | |
| generujKod("JGE", generujEtykiete()+3); /* Większe */ | |
| context_check("LOAD", "#jeden"); | |
| generujKod("JUMP", generujEtykiete()+2); | |
| generujKod("ZERO", -1); | |
| } | |
| | IDENTIFIER GT IDENTIFIER { | |
| context_check("LOAD", $1); | |
| context_check("SUB", $3); | |
| generujKod("JGE", generujEtykiete()+3); /* Większe */ | |
| context_check("LOAD", "#jeden"); | |
| generujKod("JUMP", generujEtykiete()+2); | |
| generujKod("ZERO", -1); | |
| } | |
| | NUMBER LTEQ NUMBER { | |
| if($1 <= $3) | |
| generujKod("ZERO", -1); | |
| else | |
| context_check("LOAD", "#jeden"); | |
| } | |
| | NUMBER LTEQ IDENTIFIER { | |
| context_check("LOAD", $3); | |
| generujKod("SUBC", $1); | |
| generujKod("JGE", generujEtykiete()+18); /* Większe to bedzie koniec */ | |
| generujKod("ZERO", -1); | |
| generujKod("ADDC", $1); | |
| context_check("STORE", "xC"); | |
| context_check("SUB", $3); | |
| generujKod("JGE", generujEtykiete()+6); /* Jak wieksze to niech bedzie z lewej strony */ | |
| context_check("LOAD", $3); | |
| context_check("STORE", "xA"); | |
| context_check("LOAD", "xC"); | |
| context_check("STORE", "xB"); | |
| generujKod("JUMP", generujEtykiete()+5); | |
| context_check("LOAD", "xC"); | |
| context_check("STORE", "xA"); | |
| context_check("LOAD", $3); | |
| context_check("STORE", "xB"); | |
| context_check("LOAD", "xA"); | |
| context_check("SUB", "xB"); | |
| generujKod("JGE", generujEtykiete()+3); | |
| generujKod("ZERO", -1); | |
| generujKod("JUMP", generujEtykiete()+2); | |
| context_check("LOAD", "#jeden"); | |
| } | |
| | IDENTIFIER LTEQ NUMBER { | |
| generujKod("ZERO", -1); | |
| generujKod("ADDC", $3); | |
| context_check("SUB", $1); | |
| generujKod("JGE", generujEtykiete()+18); /* Większe */ | |
| generujKod("ZERO", -1); | |
| generujKod("ADDC", $3); | |
| context_check("STORE", "xC"); | |
| context_check("SUB", $1); | |
| generujKod("JGE", generujEtykiete()+6); /* Jak wieksze to niech bedzie z lewej strony */ | |
| context_check("LOAD", $1); | |
| context_check("STORE", "xA"); | |
| context_check("LOAD", "xC"); | |
| context_check("STORE", "xB"); | |
| generujKod("JUMP", generujEtykiete()+5); | |
| context_check("LOAD", "xC"); | |
| context_check("STORE", "xA"); | |
| context_check("LOAD", $1); | |
| context_check("STORE", "xB"); | |
| context_check("LOAD", "xA"); | |
| context_check("SUB", "xB"); | |
| generujKod("JGE", generujEtykiete()+3); | |
| generujKod("ZERO", -1); | |
| generujKod("JUMP", generujEtykiete()+2); | |
| context_check("LOAD", "#jeden"); | |
| } | |
| | IDENTIFIER LTEQ IDENTIFIER { | |
| context_check("LOAD", $3); | |
| context_check("SUB", $1); | |
| generujKod("JGE", generujEtykiete()+16); /* Większe */ | |
| context_check("LOAD", $1); | |
| context_check("SUB", $3); | |
| generujKod("JGE", generujEtykiete()+6); /* Jak wieksze to niech bedzie z lewej strony */ | |
| context_check("LOAD", $3); | |
| context_check("STORE", "xA"); | |
| context_check("LOAD", $1); | |
| context_check("STORE", "xB"); | |
| generujKod("JUMP", generujEtykiete()+5); | |
| context_check("LOAD", $1); | |
| context_check("STORE", "xA"); | |
| context_check("LOAD", $3); | |
| context_check("STORE", "xB"); | |
| context_check("LOAD", "xA"); | |
| context_check("SUB", "xB"); | |
| generujKod("JGE", generujEtykiete()+3); | |
| generujKod("ZERO", -1); | |
| generujKod("JUMP", generujEtykiete()+2); | |
| context_check("LOAD", "#jeden"); | |
| } | |
| | NUMBER GTEQ NUMBER { | |
| if($1 >= $3) | |
| generujKod("ZERO", -1); | |
| else | |
| context_check("LOAD", "#jeden"); | |
| } | |
| | NUMBER GTEQ IDENTIFIER { | |
| generujKod("ZERO", -1); | |
| generujKod("ADDC", $1); | |
| context_check("SUB", $3); | |
| generujKod("JGE", generujEtykiete()+18); /* Większe */ | |
| generujKod("ZERO", -1); | |
| generujKod("ADDC", $1); | |
| context_check("STORE", "xC"); | |
| context_check("SUB", $3); | |
| generujKod("JGE", generujEtykiete()+6); /* Jak wieksze to niech bedzie z lewej strony */ | |
| context_check("LOAD", $3); | |
| context_check("STORE", "xA"); | |
| context_check("LOAD", "xC"); | |
| context_check("STORE", "xB"); | |
| generujKod("JUMP", generujEtykiete()+5); | |
| context_check("LOAD", "xC"); | |
| context_check("STORE", "xA"); | |
| context_check("LOAD", $3); | |
| context_check("STORE", "xB"); | |
| context_check("LOAD", "xA"); | |
| context_check("SUB", "xB"); | |
| generujKod("JGE", generujEtykiete()+3); | |
| generujKod("ZERO", -1); | |
| generujKod("JUMP", generujEtykiete()+2); | |
| context_check("LOAD", "#jeden"); | |
| } | |
| | IDENTIFIER GTEQ NUMBER { | |
| context_check("LOAD", $1); | |
| generujKod("SUBC", $3); | |
| generujKod("JGE", generujEtykiete()+18); /* Większe */ | |
| generujKod("ZERO", -1); | |
| generujKod("ADDC", $3); | |
| context_check("STORE", "xC"); | |
| context_check("SUB", $1); | |
| generujKod("JGE", generujEtykiete()+6); /* Jak wieksze to niech bedzie z lewej strony */ | |
| context_check("LOAD", $1); | |
| context_check("STORE", "xA"); | |
| context_check("LOAD", "xC"); | |
| context_check("STORE", "xB"); | |
| generujKod("JUMP", generujEtykiete()+5); | |
| context_check("LOAD", "xC"); | |
| context_check("STORE", "xA"); | |
| context_check("LOAD", $1); | |
| context_check("STORE", "xB"); | |
| context_check("LOAD", "xA"); | |
| context_check("SUB", "xB"); | |
| generujKod("JGE", generujEtykiete()+3); | |
| generujKod("ZERO", -1); | |
| generujKod("JUMP", generujEtykiete()+2); | |
| context_check("LOAD", "#jeden"); | |
| } | |
| | IDENTIFIER GTEQ IDENTIFIER { | |
| context_check("LOAD", $1); | |
| context_check("SUB", $3); | |
| generujKod("JGE", generujEtykiete()+16); /* Większe */ | |
| context_check("LOAD", $1); | |
| context_check("SUB", $3); | |
| generujKod("JGE", generujEtykiete()+6); /* Jak wieksze to niech bedzie z lewej strony */ | |
| context_check("LOAD", $3); | |
| context_check("STORE", "xA"); | |
| context_check("LOAD", $1); | |
| context_check("STORE", "xB"); | |
| generujKod("JUMP", generujEtykiete()+5); | |
| context_check("LOAD", $1); | |
| context_check("STORE", "xA"); | |
| context_check("LOAD", $3); | |
| context_check("STORE", "xB"); | |
| context_check("LOAD", "xA"); | |
| context_check("SUB", "xB"); | |
| generujKod("JGE", generujEtykiete()+3); | |
| generujKod("ZERO", -1); | |
| generujKod("JUMP", generujEtykiete()+2); | |
| context_check("LOAD", "#jeden"); | |
| } | |
| ; | |
| %% | |
| /* Odpalanie parsera */ | |
| int main(int argc, char *argv[]) | |
| { | |
| extern FILE *yyin; | |
| yyin = fopen(argv[1], "r"); | |
| errors = 0; | |
| declare("#print0"); /* Wyświetlanie */ | |
| declare("#jeden"); | |
| declare("xA"); | |
| declare("xB"); | |
| declare("xC"); | |
| declare("xD"); | |
| generujKod("ADDC", 1); | |
| context_check("STORE", "#jeden"); | |
| extern int yydebug; | |
| yydebug = 0; | |
| yyparse(); | |
| if(errors == 0) | |
| { | |
| printCommand(); | |
| } | |
| return 0; | |
| } | |
| yyerror(char *s) | |
| { | |
| errors++; | |
| printf("%s\n", s); | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment