Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- %option noyywrap c++ yylineno
- %{
- #include <iostream>
- #include <cstdlib>
- #include "Parserbase.h"
- %}
- SZAMJEGY [0-9]
- WS [ \t\n]
- BETU [a-zA-Z]
- %%
- #[^#]*# // nem kell semmit csinalni
- {SZAMJEGY}+ return Parser::SZAMKONSTANS;
- PROGRAM return Parser::PROGRAM;
- VALTOZOK: return Parser::VALTOZOK;
- UTASITASOK: return Parser::UTASITASOK;
- PROGRAM_VEGE return Parser::PROGRAM_VEGE;
- HA return Parser::HA;
- AKKOR return Parser::AKKOR;
- KULONBEN return Parser::KULONBEN;
- HA_VEGE return Parser::HA_VEGE;
- CIKLUS return Parser::CIKLUS;
- AMIG return Parser::AMIG;
- CIKLUS_VEGE return Parser::CIKLUS_VEGE;
- BE: return Parser::BE;
- KI: return Parser::KI;
- EGESZ return Parser::EGESZ;
- LOGIKAI return Parser::LOGIKAI;
- IGAZ return Parser::IGAZ;
- HAMIS return Parser::HAMIS;
- SKIP return Parser::SKIP;
- ":=" return Parser::ERTEKADAS;
- "=" return Parser::EGYENLO;
- "<" return Parser::KISEBB;
- ">" return Parser::NAGYOBB;
- "+" return Parser::PLUSZ;
- "-" return Parser::MINUSZ;
- "*" return Parser::SZORZAS;
- "/" return Parser::OSZTAS;
- "%" return Parser::MARADEK;
- ES return Parser::ES;
- VAGY return Parser::VAGY;
- NEM return Parser::NEM;
- "(" return Parser::BALZAROJEL;
- ")" return Parser::JOBBZAROJEL;
- {BETU}({BETU}|{SZAMJEGY})* return Parser::AZONOSITO;
- {WS}+ // feher szokozok: semmi teendo
- . {
- std::cerr << "lexikalis hiba" << std::endl;
- exit(1);
- }
- %%
- ####
- %baseclass-preinclude "semantics.h"
- %lsp-needed
- %token <szoveg> SZAMKONSTANS
- %token PROGRAM
- %token VALTOZOK
- %token UTASITASOK
- %token PROGRAM_VEGE
- %token HA
- %token AKKOR
- %token KULONBEN
- %token HA_VEGE
- %token CIKLUS
- %token AMIG
- %token CIKLUS_VEGE
- %token BE
- %token KI
- %token EGESZ
- %token LOGIKAI
- %token ERTEKADAS
- %token BALZAROJEL
- %token JOBBZAROJEL
- %token <szoveg> AZONOSITO
- %token IGAZ
- %token HAMIS
- %token SKIP
- %left VAGY
- %left ES
- %left NEM
- %left EGYENLO
- %left KISEBB NAGYOBB
- %left PLUSZ MINUSZ
- %left SZORZAS OSZTAS MARADEK
- %type <kif> kifejezes
- %type <utasitas> ertekadas
- %type <utasitas> be
- %type <utasitas> ki
- %type <utasitas> elagazas
- %type <utasitas> ciklus
- %type <utasitas> utasitas
- %type <utasitas> utasitasok
- %type <utasitas> utasitaslista
- %type <utasitas> deklaracio
- %type <utasitas> deklaraciok
- %type <utasitas> valtozolista
- %type <utasitas> kezdes
- %type <utasitas> befejezes
- %union
- {
- std::string *szoveg;
- kifejezes_leiro *kif;
- utasitas_leiro *utasitas;
- }
- %%
- start:
- kezdes deklaraciok utasitasok befejezes
- {
- std::cout << "extern be_egesz" << std::endl
- << "extern ki_egesz" << std::endl
- << "extern be_logikai" << std::endl
- << "extern ki_logikai" << std::endl
- << "global main" << std::endl << std::endl
- << "section .bss" << std::endl
- << $3->code << std::endl
- << "section .text" << std::endl
- << "main:" << std::endl
- << $4->code
- << "ret" << std::endl;
- delete $1;
- delete $2;
- delete $3;
- delete $4;
- }
- ;
- kezdes:
- PROGRAM AZONOSITO
- {
- $$ = new utasitas_leiro( d_loc__.first_line );
- }
- ;
- befejezes:
- PROGRAM_VEGE
- {
- $$ = new utasitas_leiro( d_loc__.first_line );
- }
- ;
- deklaraciok:
- // ures
- {
- $$ = new utasitas_leiro( d_loc__.first_line );
- }
- |
- VALTOZOK valtozolista
- {
- $$ = new utasitas_leiro( d_loc__.first_line );
- delete $2;
- }
- ;
- valtozolista:
- deklaracio
- |
- deklaracio valtozolista
- {
- $$ = new utasitas_leiro( $1->sor, $1->code + $2->code );
- delete $1;
- delete $2;
- }
- ;
- deklaracio:
- EGESZ AZONOSITO
- {
- if( szimb_tabla.count(*$2) > 0 )
- {
- std::cerr << d_loc__.first_line << ".: A(z) '" << *$2 << "' valtozo mar definialva volt a "
- << szimb_tabla[*$2].def_sora << ". sorban." << std::endl;
- exit(1);
- }
- else
- {
- szimb_tabla[*$2] = valtozo_leiro(d_loc__.first_line,Egesz, counter++);
- $$ = new utasitas_leiro( d_loc__.first_line, szimb_tabla[*$2].cimke + "resd 4\n" );
- }
- delete $2;
- }
- |
- LOGIKAI AZONOSITO
- {
- if( szimb_tabla.count(*$2) > 0 )
- {
- std::cerr << d_loc__.first_line << ": A(z) '" << *$2 << "' valtozo mar definialva volt a "
- << szimb_tabla[*$2].def_sora << ". sorban." << std::endl;
- exit(1);
- }
- else
- {
- szimb_tabla[*$2] = valtozo_leiro(d_loc__.first_line,Logikai, counter++);
- $$ = new utasitas_leiro( d_loc__.first_line, szimb_tabla[*$2].cimke + "resb 1\n");
- }
- delete $2;
- }
- ;
- utasitasok:
- UTASITASOK utasitas utasitaslista
- {
- $$ = new utasitas_leiro( d_loc__.first_line );
- delete $2;
- delete $3;
- }
- ;
- utasitaslista:
- // epsilon
- {
- $$ = new utasitas_leiro( d_loc__.first_line );
- }
- |
- utasitas utasitaslista
- {
- $$ = new utasitas_leiro( $1->sor );
- delete $1;
- delete $2;
- }
- ;
- utasitas:
- SKIP
- {
- $$ = new utasitas_leiro( d_loc__.first_line );
- }
- |
- ertekadas
- |
- be
- |
- ki
- |
- elagazas
- |
- ciklus
- ;
- ertekadas:
- AZONOSITO ERTEKADAS kifejezes
- {
- if( szimb_tabla.count( *$1 ) == 0 )
- {
- std::cerr << d_loc__.first_line << ": A(z) '" << *$1 << "' valtozo nincs deklaralva." << std::endl;
- exit(1);
- }
- else if( szimb_tabla[*$1].vtip != $3->ktip )
- {
- std::cerr << d_loc__.first_line << ": Az ertekadas jobb- es baloldalan kulonbozo tipusu kifejezesek allnak." << std::endl;
- exit(1);
- }
- else
- {
- std::string reg;
- if($3->ktip == Egesz)
- reg = "eax";
- else
- reg = "al";
- $$ = new utasitas_leiro( d_loc__.first_line,$3->code
- + "mov [" + szimb_tabla[*$1].cimke + "]," + reg + "\n");
- }
- delete $3;
- }
- ;
- be:
- BE AZONOSITO
- {
- if( szimb_tabla.count( *$2 ) == 0 )
- {
- std::cerr << d_loc__.first_line << ": A(z) '" << *$2 << "' valtozo nincs deklaralva." << std::endl;
- exit(1);
- }
- else
- {
- std::string metodus, reg;
- if(szimb_tabla[*$2].vtip == Egesz)
- {
- metodus = "be_egesz";
- reg = "eax";
- }
- else
- {
- metodus = "be_logikai";
- reg = "al";
- }
- $$ = new utasitas_leiro( d_loc__.first_line, "call " + metodus + "\n"
- + "mov [" + szimb_tabla[*$2].cimke + "]," + reg + "\n");
- }
- delete $2;
- }
- ;
- ki:
- KI kifejezes
- {
- std::string metodus, reg;
- if($2->ktip == Egesz)
- {
- metodus = "be_egesz";
- reg = "eax";
- }
- else
- {
- metodus = "be_logikai";
- reg = "al";
- }
- $$ = new utasitas_leiro( d_loc__.first_line,$2->code + "push\n" + reg + "\n" + "call\n" + metodus + "\n" + "add esp,4\n");
- delete $2;
- }
- ;
- elagazas:
- HA kifejezes AKKOR utasitaslista HA_VEGE
- {
- if( $2->ktip != Logikai )
- {
- std::cerr << d_loc__.first_line << ": Nem logikai tipusu az elagazas feltetele." << std::endl;
- exit(1);
- }
- else
- {
- std::stringstream out1;
- out1 << "Cimke" << Parser::counter++;
- std::string akkor = out1.str();
- std::stringstream out2;
- out2 << "Cimke" << Parser::counter++;
- std::string vege = out2.str();
- $$ = new utasitas_leiro( $2->sor
- , $2->code
- + "cmp al,1\n"
- + "je " + akkor + "\n"
- + "jmp " + vege + "\n"
- + akkor + ":\n"
- + $4->code
- + vege + ":\n");
- }
- delete $2;
- delete $4;
- }
- |
- HA kifejezes AKKOR utasitaslista KULONBEN utasitaslista HA_VEGE
- {
- if( $2->ktip != Logikai )
- {
- std::cerr << d_loc__.first_line << ": Nem logikai tipusu az elagazas feltetele." << std::endl;
- exit(1);
- }
- else
- {
- std::stringstream out1;
- out1 << "Cimke" << Parser::counter++;
- std::string akkor = out1.str();
- std::stringstream out2;
- out2 << "Cimke" << Parser::counter++;
- std::string vege = out2.str();
- std::stringstream out3;
- out3 << "Cimke" << Parser::counter++;
- std::string kulonben = out3.str();
- $$ = new utasitas_leiro( $2->sor
- , $2->code
- + "cmp al,1\n"
- + "je " + akkor + "\n"
- + "jmp" + kulonben + "\n"
- + akkor + ":\n"
- + $4->code
- + "jmp " + vege + "\n"
- + kulonben + ":\n"
- + $6->code
- + vege + ":\n");
- }
- delete $2;
- delete $4;
- delete $6;
- }
- ;
- ciklus:
- CIKLUS AMIG kifejezes utasitaslista CIKLUS_VEGE
- {
- if( $3->ktip != Logikai )
- {
- std::cerr << d_loc__.first_line << ": Nem logikai tipusu a ciklus feltetele." << std::endl;
- exit(1);
- }
- else
- {
- std::stringstream out1;
- out1 << "Cimke" << Parser::counter++;
- std::string eleje = out1.str();
- std::stringstream out2;
- out2 << "Cimke" << Parser::counter++;
- std::string kozepe = out2.str();
- std::stringstream out3;
- out3 << "Cimke" << Parser::counter++;
- std::string vege = out3.str();
- $$ = new utasitas_leiro(
- $3->sor
- , eleje + ":\n"
- + $3->code
- + "cmp al,1\n"
- + "je " + kozepe + "\n"
- + "jmp " + vege + "\n"
- + kozepe + ":\n"
- + $4->code
- + "jmp " + eleje + "\n"
- + vege + ":\n"
- );
- }
- delete $3;
- delete $4;
- }
- ;
- kifejezes:
- SZAMKONSTANS
- {
- $$ = new kifejezes_leiro( d_loc__.first_line, Egesz , "mov eax" + *$1 + "\n");
- delete $1;
- }
- |
- IGAZ
- {
- $$ = new kifejezes_leiro( d_loc__.first_line, Logikai ,"mov al 1\n");
- }
- |
- HAMIS
- {
- $$ = new kifejezes_leiro( d_loc__.first_line, Logikai, "mov al 0\n");
- }
- |
- AZONOSITO
- {
- if( szimb_tabla.count( *$1 ) == 0 )
- {
- std::cerr << d_loc__.first_line << ": A(z) '" << *$1 << "' valtozo nincs deklaralva." << std::endl;
- exit(1);
- }
- else
- {
- valtozo_leiro vl = szimb_tabla[*$1];
- std::string reg;
- if(vl.vtip == Logikai)
- reg = "al";
- else
- reg = "eax";
- $$ = new kifejezes_leiro( vl.def_sora, vl.vtip, "mov" + reg + "["+vl.cimke+"]\n");
- delete $1;
- }
- }
- |
- kifejezes PLUSZ kifejezes
- {
- if( $1->ktip != Egesz )
- {
- std::cerr << $1->sor << ": A '+' operator baloldalan nem egesz tipusu kifejezes all." << std::endl;
- exit(1);
- }
- if( $3->ktip != Egesz )
- {
- std::cerr << $3->sor << ": A '+' operator jobboldalan nem egesz tipusu kifejezes all." << std::endl;
- exit(1);
- }
- std::string c = $3->code +
- "push eax\n" +
- $1->code +
- "pop edx\n" +
- "add eax,edx\n";
- $$ = new kifejezes_leiro( d_loc__.first_line, Egesz, c);
- delete $1;
- delete $3;
- }
- |
- kifejezes MINUSZ kifejezes
- {
- if( $1->ktip != Egesz )
- {
- std::cerr << $1->sor << ": A '-' operator baloldalan nem egesz tipusu kifejezes all." << std::endl;
- exit(1);
- }
- if( $3->ktip != Egesz )
- {
- std::cerr << $3->sor << ": A '-' operator jobboldalan nem egesz tipusu kifejezes all." << std::endl;
- exit(1);
- }
- std::string c = $3->code +
- "push eax\n" +
- $1->code +
- "pop ebx\n" +
- "sub eax,ebx\n";
- $$ = new kifejezes_leiro( d_loc__.first_line, Egesz, c);
- delete $1;
- delete $3;
- }
- |
- kifejezes SZORZAS kifejezes
- {
- if( $1->ktip != Egesz )
- {
- std::cerr << $1->sor << ": A '*' operator baloldalan nem egesz tipusu kifejezes all." << std::endl;
- exit(1);
- }
- if( $3->ktip != Egesz )
- {
- std::cerr << $3->sor << ": A '*' operator jobboldalan nem egesz tipusu kifejezes all." << std::endl;
- exit(1);
- }
- std::string c = $3->code +
- "push eax\n" +
- $1->code +
- "pop ebx\n" +
- "mov edx,0" +
- "mul ebx\n";
- $$ = new kifejezes_leiro( d_loc__.first_line, Egesz, c);
- delete $1;
- delete $3;
- }
- |
- kifejezes OSZTAS kifejezes
- {
- if( $1->ktip != Egesz )
- {
- std::cerr << $1->sor << ": A '/' operator baloldalan nem egesz tipusu kifejezes all." << std::endl;
- exit(1);
- }
- if( $3->ktip != Egesz )
- {
- std::cerr << $3->sor << ": A '/' operator jobboldalan nem egesz tipusu kifejezes all." << std::endl;
- exit(1);
- }
- std::string c = $3->code +
- "push eax\n" +
- $1->code +
- "pop ebx\n" +
- "mov edx,0" +
- "div ebx\n";
- $$ = new kifejezes_leiro( d_loc__.first_line, Egesz, c);
- delete $1;
- delete $3;
- }
- |
- kifejezes MARADEK kifejezes
- {
- if( $1->ktip != Egesz )
- {
- std::cerr << $1->sor << ": A '%' operator baloldalan nem egesz tipusu kifejezes all." << std::endl;
- exit(1);
- }
- if( $3->ktip != Egesz )
- {
- std::cerr << $3->sor << ": A '%' operator jobboldalan nem egesz tipusu kifejezes all." << std::endl;
- exit(1);
- }
- std::string c = $3->code +
- "push eax\n" +
- $1->code +
- "pop ebx\n" +
- "mov edx,0" +
- "div ebx\n" +
- "mov eax,edx";
- $$ = new kifejezes_leiro( d_loc__.first_line, Egesz, c);
- delete $1;
- delete $3;
- }
- |
- kifejezes KISEBB kifejezes
- {
- if( $1->ktip != Egesz )
- {
- std::cerr << $1->sor << ": A '<' operator baloldalan nem egesz tipusu kifejezes all." << std::endl;
- exit(1);
- }
- if( $3->ktip != Egesz )
- {
- std::cerr << $3->sor << ": A '<' operator jobboldalan nem egesz tipusu kifejezes all." << std::endl;
- exit(1);
- }
- std::string c = $3->code +
- "push eax\n" +
- $3->code +
- "pop ebx\n" +
- "cmp eax,ebx\n" +
- "setl al\n";
- $$ = new kifejezes_leiro( d_loc__.first_line, Logikai, c);
- delete $1;
- delete $3;
- }
- |
- kifejezes NAGYOBB kifejezes
- {
- if( $1->ktip != Egesz )
- {
- std::cerr << $1->sor << ": A '>' operator baloldalan nem egesz tipusu kifejezes all." << std::endl;
- exit(1);
- }
- if( $3->ktip != Egesz )
- {
- std::cerr << $3->sor << ": A '>' operator jobboldalan nem egesz tipusu kifejezes all." << std::endl;
- exit(1);
- }
- std::string c = $3->code +
- "push eax\n" +
- $3->code +
- "pop ebx\n" +
- "cmp eax,ebx\n" +
- "setl al\n";
- $$ = new kifejezes_leiro( d_loc__.first_line, Logikai, c);
- delete $1;
- delete $3;
- }
- |
- kifejezes EGYENLO kifejezes
- {
- if( $1->ktip != $3->ktip )
- {
- std::cerr << $1->sor << ": Az '=' operator jobb- es baloldalan kulonbozo tipusu kifejezesek allnak." << std::endl;
- exit(1);
- }
- std::string c = $3->code +
- "push eax\n" +
- $3->code +
- "pop ebx\n" +
- "cmp eax,ebx\n" +
- "sete al\n";
- $$ = new kifejezes_leiro( d_loc__.first_line, Logikai, c);
- delete $1;
- delete $3;
- }
- |
- kifejezes ES kifejezes
- {
- if( $1->ktip != Logikai )
- {
- std::cerr << $1->sor << ": Az 'ES' operator baloldalan nem logikai tipusu kifejezes all." << std::endl;
- exit(1);
- }
- if( $3->ktip != Logikai )
- {
- std::cerr << $3->sor << ": Az 'ES' operator jobboldalan nem logikai tipusu kifejezes all." << std::endl;
- exit(1);
- }
- std::string c = $1->code +
- "push ax\n" +
- $3->code +
- "pop bx\n" +
- "and al,bl\n";
- $$ = new kifejezes_leiro( d_loc__.first_line, Logikai, c);
- delete $1;
- delete $3;
- }
- |
- kifejezes VAGY kifejezes
- {
- if( $1->ktip != Logikai )
- {
- std::cerr << $1->sor << ": A 'VAGY' operator baloldalan nem logikai tipusu kifejezes all." << std::endl;
- exit(1);
- }
- if( $3->ktip != Logikai )
- {
- std::cerr << $3->sor << ": A 'VAGY' operator jobboldalan nem logikai tipusu kifejezes all." << std::endl;
- exit(1);
- }
- std::string c = $1->code +
- "push ax\n" +
- $3->code +
- "pop bx\n" +
- "or al,bl\n";
- $$ = new kifejezes_leiro( d_loc__.first_line, Logikai, c);
- delete $1;
- delete $3;
- }
- |
- NEM kifejezes
- {
- if( $2->ktip != Logikai )
- {
- std::cerr << $2->sor << ": A 'NEM' operator utan nem logikai tipusu kifejezes all." << std::endl;
- exit(1);
- }
- $$ = new kifejezes_leiro( d_loc__.first_line, Logikai, $2->code + "xor al,1\n");
- delete $2;
- }
- |
- BALZAROJEL kifejezes JOBBZAROJEL
- {
- $$ = $2;
- }
- ;
- ####
- #ifndef Parser_h_included
- #define Parser_h_included
- #include <map>
- #include <string>
- #include <FlexLexer.h>
- #include "Parserbase.h"
- #include "semantics.h"
- #undef Parser
- class Parser: public ParserBase
- {
- public:
- Parser(std::istream& inFile) : lexer( &inFile, &std::cerr ) {}
- int parse();
- private:
- yyFlexLexer lexer;
- static int counter;
- void error(char const *msg); // called on (syntax) errors
- int lex(); // returns the next token from the
- // lexical scanner.
- void print(); // use, e.g., d_token, d_loc
- std::map<std::string,valtozo_leiro> szimb_tabla;
- int sorszam;
- // support functions for parse():
- void executeAction(int ruleNr);
- void errorRecovery();
- int lookup(bool recovery);
- void nextToken();
- void print__();
- void exceptionHandler__(std::exception const &exc);
- };
- #endif
- ####
- // Generated by Bisonc++ V4.09.02 on Tue, 24 Oct 2017 21:29:10 +0200
- // Include this file in the sources of the class Parser.
- // $insert class.h
- #include "Parser.h"
- #include <cstdlib>
- inline void Parser::error(char const *msg)
- {
- std::cerr << "line " << d_loc__.first_line << ": " << msg << '\n';
- exit(1);
- }
- // $insert lex
- inline int Parser::lex()
- {
- int ret = lexer.yylex();
- d_loc__.first_line = lexer.lineno();
- if( ret == Parser::AZONOSITO || ret == Parser::SZAMKONSTANS )
- d_val__.szoveg = new std::string(lexer.YYText());
- return ret;
- }
- inline void Parser::print()
- {
- print__(); // displays tokens if --print was specified
- }
- inline void Parser::exceptionHandler__(std::exception const &exc)
- {
- throw; // re-implement to handle exceptions thrown by actions
- }
- // Add here includes that are only required for the compilation
- // of Parser's sources.
- // UN-comment the next using-declaration if you want to use
- // int Parser's sources symbols from the namespace std without
- // specifying std::
- //using namespace std;
- ####
- #ifndef SEMANTICS_H
- #define SEMANTICS_H
- #include <string>
- #include <iostream>
- #include <sstream>
- enum tipus { Egesz, Logikai };
- struct valtozo_leiro
- {
- int def_sora;
- tipus vtip;
- std::string cimke;
- valtozo_leiro( int s = 0, tipus t = Egesz, int sz = 0)
- : def_sora(s), vtip(t)
- {
- std::stringstream out;
- out << "Cimke" << sz;
- cimke = out.str();
- }
- };
- struct kifejezes_leiro
- {
- int sor;
- tipus ktip;
- std::string code;
- kifejezes_leiro( int s, tipus t , const std::string &c)
- : sor(s), ktip(t), code(c)
- {}
- };
- struct utasitas_leiro
- {
- int sor;
- std::string code;
- utasitas_leiro( int s, const std::string &c="" )
- : sor(s), code(c)
- {}
- };
- #endif //SEMANTICS_H
- ####
- #include <iostream>
- #include <fstream>
- #include <sstream>
- #include <cstdlib>
- #include "Parser.h"
- using namespace std;
- int Parser::counter = 0;
- void input_handler( ifstream& in, int argc, char* argv[] );
- int main( int argc, char* argv[] )
- {
- ifstream in;
- input_handler( in, argc, argv );
- Parser pars( in );
- pars.parse();
- return 0;
- }
- void input_handler( ifstream& in, int argc, char* argv[] )
- {
- if( argc < 2 )
- {
- cerr << "A forditando fajl nevet parancssori parameterben kell megadni." << endl;
- exit(1);
- }
- in.open( argv[1] );
- if( !in )
- {
- cerr << "A " << argv[1] << "fajlt nem sikerult megnyitni." << endl;
- exit(1);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement