From 6b16ce98bc2400fccfbfa264212c305599d562c4 Mon Sep 17 00:00:00 2001 From: Oschly Date: Wed, 7 Jan 2026 23:11:09 +0100 Subject: [PATCH] Lab 6 --- def.yy | 88 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-- in5.txt | 23 +++++++++++++-- z5.l | 41 ++++++++++++++++----------- 3 files changed, 131 insertions(+), 21 deletions(-) diff --git a/def.yy b/def.yy index b02d6e5..ea95c57 100644 --- a/def.yy +++ b/def.yy @@ -33,8 +33,10 @@ int memoryCounter = 0; std::stack expressionsStack; FILE *tripletFile; int tempVarCounter = 0; +int stringCounter = 0; std::vector asmCode; +std::map stringLiterals; bool isNumber(const std::string& s) { if (s.empty()) return false; @@ -86,11 +88,49 @@ void generateAsm(const std::string& result, const std::string& arg1, } } +void generatePrintInt(const std::string& var) { + asmCode.push_back("# print_integer(" + var + ")"); + asmCode.push_back(generateLoad("$a0", var)); + asmCode.push_back("li $v0, 1"); + asmCode.push_back("syscall"); +} + +void generatePrintFloat(const std::string& var) { + asmCode.push_back("# print_float(" + var + ")"); + asmCode.push_back("lwc1 $f12, " + var); + asmCode.push_back("li $v0, 2"); + asmCode.push_back("syscall"); +} + +void generatePrintString(const std::string& strLabel) { + asmCode.push_back("# print_string(" + strLabel + ")"); + asmCode.push_back("la $a0, " + strLabel); + asmCode.push_back("li $v0, 4"); + asmCode.push_back("syscall"); +} + +void generateReadInt(const std::string& var) { + asmCode.push_back("# read_integer -> " + var); + asmCode.push_back("li $v0, 5"); + asmCode.push_back("syscall"); + asmCode.push_back("sw $v0, " + var); +} + +void generateReadFloat(const std::string& var) { + asmCode.push_back("# read_float -> " + var); + asmCode.push_back("li $v0, 6"); + asmCode.push_back("syscall"); + asmCode.push_back("swc1 $f0, " + var); +} + void writeDataSection(FILE* out) { fprintf(out, ".data\n"); for (auto& pair : symbolTable) { fprintf(out, "%s: .word 0\n", pair.first.c_str()); } + for (auto& pair : stringLiterals) { + fprintf(out, "%s: .asciiz %s\n", pair.first.c_str(), pair.second.c_str()); + } fprintf(out, "\n"); } @@ -139,8 +179,9 @@ void writeTriplet(const std::string& result, const std::string& arg1, } %token ID +%token STRING_LIT %token INT_LIT -%token LET +%token LET PRINT_INT PRINT_FLOAT PRINT_STRING READ_INT READ_FLOAT %token INT_TYPE %token SEMICOLON COLON @@ -163,6 +204,8 @@ statement_list statement : variable_declaration { printf("Deklaracja zmiennej\n"); } | assignment { printf("Instrukcja przypisania\n"); } + | print_statement { printf("Instrukcja wypisania\n"); } + | read_statement { printf("Instrukcja odczytu\n"); } | expression SEMICOLON { printf("instrukcja\n"); if (!expressionsStack.empty()) { @@ -196,6 +239,47 @@ variable_declaration } ; + print_statement + : PRINT_INT '(' expression ')' SEMICOLON + { + printf("print_integer\n"); + if (!expressionsStack.empty()) { + StackElement expr = expressionsStack.top(); + expressionsStack.pop(); + generatePrintInt(expr.value); + } + } + | PRINT_FLOAT '(' expression ')' SEMICOLON + { + printf("print_float\n"); + if (!expressionsStack.empty()) { + StackElement expr = expressionsStack.top(); + expressionsStack.pop(); + generatePrintFloat(expr.value); + } + } + | PRINT_STRING '(' STRING_LIT ')' SEMICOLON + { + printf("print_string: %s\n", $3); + std::string label = "str" + std::to_string(stringCounter++); + stringLiterals[label] = std::string($3); + generatePrintString(label); + } + ; + + read_statement + : READ_INT '(' ID ')' SEMICOLON + { + printf("read_integer -> %s\n", $3); + generateReadInt(std::string($3)); + } + | READ_FLOAT '(' ID ')' SEMICOLON + { + printf("read_float -> %s\n", $3); + generateReadFloat(std::string($3)); + } + ; + expression : expression '+' expression { printf("Wyrazenie z +\n"); @@ -275,7 +359,6 @@ int main(int argc, char *argv[]) { return OUTFILE_ERROR; } - // Otwórz plik wyjściowy na asembler yyout = fopen("output.asm", "w"); if (!yyout) { fprintf(stderr, "Blad output.asm\n"); @@ -292,7 +375,6 @@ int main(int argc, char *argv[]) { fclose(yyout); - // Zapisz tablicę symboli do symbols.txt saveSymbolTable(); return 0; } diff --git a/in5.txt b/in5.txt index 058a33b..f07f38e 100644 --- a/in5.txt +++ b/in5.txt @@ -1,2 +1,21 @@ -let x: Int = 5 + 3; -let y: Int = x - 1; +let x: Int = 42; +print_string("Integer: \n"); +print_string("\n"); +print_integer(x); +print_string("\n"); + +print_string("Podaj float: \n"); +let f: Int = 0; +read_float(f); +print_string("Float: \n"); +print_float(f); +print_string("\n"); + +print_string("Podaj integer: \n"); +let y: Int = 0; +read_integer(y); +print_string("Wynik: \n"); +print_integer(y); +print_string("\n"); + +print_string("Koniec testu\n"); diff --git a/z5.l b/z5.l index d9e3d5f..131e37f 100644 --- a/z5.l +++ b/z5.l @@ -1,5 +1,4 @@ %{ -#include #include #include #include "def.tab.hh" @@ -12,18 +11,28 @@ void yyerror(const char *msg, ...); %option noyywrap %% -"let" {fprintf(stdout, "LET\n"); return LET;} -"Int" {fprintf(stdout, "INT_TYPE\n"); return INT_TYPE;} -":" {fprintf(stdout, ":\n"); return COLON;} -";" {fprintf(stdout, ";\n"); return SEMICOLON;} -\+ {fprintf(stdout, "+\n"); return '+';} -\* {fprintf(stdout, "*\n"); return '*';} -\( {fprintf(stdout, "(\n"); return '(';} -\) {fprintf(stdout, ")\n"); return ')';} -\/ {fprintf(stdout, "/\n"); return '/';} -\- {fprintf(stdout, "-\n"); return '-';} -\= {fprintf(stdout, "=\n"); return '=';} -[0-9]+ { +"let" {fprintf(stdout, "LET\n"); return LET;} +"Int" {fprintf(stdout, "INT_TYPE\n"); return INT_TYPE;} +":" {fprintf(stdout, ":\n"); return COLON;} +";" {fprintf(stdout, ";\n"); return SEMICOLON;} +"print_integer" {fprintf(stdout, "PRINT_INT\n"); return PRINT_INT;} +"print_float" {fprintf(stdout, "PRINT_FLOAT\n"); return PRINT_FLOAT;} +"print_string" {fprintf(stdout, "PRINT_STRING\n"); return PRINT_STRING;} +"read_integer" {fprintf(stdout, "READ_INT\n"); return READ_INT;} +"read_float" {fprintf(stdout, "READ_FLOAT\n"); return READ_FLOAT;} +\+ {fprintf(stdout, "+\n"); return '+';} +\* {fprintf(stdout, "*\n"); return '*';} +\( {fprintf(stdout, "(\n"); return '(';} +\) {fprintf(stdout, ")\n"); return ')';} +\/ {fprintf(stdout, "/\n"); return '/';} +\- {fprintf(stdout, "-\n"); return '-';} +\= {fprintf(stdout, "=\n"); return '=';} +\"[^\"]*\" { + fprintf(stdout, "string literal: %s\n", yytext); + yylval.text = strdup(yytext); + return STRING_LIT; + } +[0-9]+ { fprintf(stdout, "liczba: %s\n", yytext); yylval.ival = atoi(yytext); return INT_LIT; @@ -33,9 +42,9 @@ void yyerror(const char *msg, ...); yylval.text = strdup(yytext); return ID; } -[ \t]+ {;} -\n {yylineno++;} -. {yyerror("Blad leksykalny\n");} +[ \t]+ {;} +\n {yylineno++;} +. {yyerror("Blad leksykalny\n");} %% void yyerror(const char *msg, ...)