Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <assert.h>
- #include <stdio.h>
- #include "lexer.h"
- #include "generator.h"
- #include "interpret.h"
- #include <stdlib.h>
- #include <math.h>
- #include <string.h>
- KeySet H_Command = E PRINT | E READ | E WHILE | E ASSIGN;
- KeySet H_Term = E VALUE | E ID | E LPAR;
- KeySet H_Expr = E PLUS | E MINUS;
- KeySet H_Mul = E MUL | E DIV;
- KeySet H_Comp = E LT | E GT | E LE | E GE | E EQ | E NE;
- KeySet H_Decl = E ID | E COMMA;
- KeySet H_Init = E ID | E ASSIGN | E VALUE | E COMMA;
- KeySet H_Stat = E ID | E COMMA | E ASSIGN | E VALUE | E COMMA | E PRINT | E READ ;
- KeySet H_Seq = E ID | E COMMA | E ASSIGN | E VALUE | E COMMA | E PRINT | E READ | E SEMICOLON;
- int variables[LEX_IDS_MAX];
- //pocitadlo chyb
- int errorCounter = 0;
- int match(const Symbol expected, KeySet K);
- void read_variable(int id_idx);
- void error(const char *msg, KeySet K);
- int expr(KeySet K);
- int term(KeySet K);
- void read(KeySet K);
- void print(KeySet K);
- int power(KeySet K);
- void program(KeySet K);
- int comp(KeySet K);
- void funIf(KeySet K);
- void funWhile(KeySet K);
- char code_list[200]; // TODO temporary
- // zmenenie hodnoty bze
- void set_value_in_address(short address, short value) {
- code_list[address] = value;
- }
- void set_variable(int id_idx, int value) {
- variables[id_idx] = value;
- //set_var_value(id_idx);
- set_value(id_idx);
- }
- int is_var_declared(int value){
- int count = sizeof(variables)/sizeof(variables[0]);
- int i;
- for (i = 0; i < count; i++){
- printf("%d\n", variables[i]);
- if (variables[i] == value){
- return 0;
- }
- }
- return 1;
- }
- int match(const Symbol expected, KeySet K) {
- if (lex_symbol == expected) {
- int attr = lex_attr;
- next_symbol();
- return attr;
- } else {
- char *msg = malloc(100);
- snprintf(msg, 100, "Ocakavany symbol %s, namiesto toho sa vyskytol %s",
- symbol_name(expected), symbol_name(lex_symbol));
- error(msg, expected | K);
- free(msg);
- return 0;
- }
- }
- void error(const char *msg, KeySet K) {
- errorCounter++;
- fprintf(stderr, "CHYBA: %s\n", msg);
- while (!(E lex_symbol & K))
- next_symbol();
- }
- void check(const char *msg, KeySet K) {
- if (!(E lex_symbol & K))
- error(msg, K);
- }
- void read_variable(int id_idx) {
- int value;
- printf("%s = ", lex_ids[id_idx]);
- scanf("%d", &value);
- variables[id_idx] = value;
- write_ask_var(id_idx, lex_ids[id_idx]);
- }
- //Print → "print" Comp ";"
- void print(KeySet K){
- match(PRINT, K | E SEMICOLON);
- int result = comp(H_Comp | K);
- printf("Vysledok: %d\n", result);
- write_result();
- }
- void assign(KeySet K) {
- match(ASSIGN, K);
- int id = lex_attr;
- next_symbol();
- match(EQ, K);
- int value = comp(K);
- set_variable(id, value);
- }
- //Read → "read" ID {"," ID} ";"
- void read(KeySet K) {
- match(READ, K | E ID | E COMMA | E ID | E SEMICOLON);
- match(ID, K | E COMMA | E ID | E SEMICOLON);
- read_variable(lex_attr);
- //next_symbol();
- while((E lex_symbol) & (E COMMA)){
- match(COMMA, K | E ID | E SEMICOLON);
- read_variable(lex_attr);
- printf("VARIABLES %d AND LEX_attr %d\n",variables[lex_attr],lex_attr);
- next_symbol();
- if(is_var_declared(variables[lex_attr]) == 1){
- fprintf(stderr, "CHYBA: premenna %s uz je zadeklarovana.\n", lex_ids[lex_attr]);
- }
- }
- match(SEMICOLON, K);
- }
- //Term → VALUE | ID | "(" Expr ")"
- int term(KeySet K) {
- printf("TERM LEX Symbol: %s\n", symbol_name(lex_symbol));
- int value;
- switch (lex_symbol & (E ID | E LPAR | E VALUE)) {
- case VALUE:
- value = lex_attr;
- write_number(lex_attr);
- next_symbol();
- break;
- case ID:
- value = variables[lex_attr];
- write_var(lex_attr);
- if(is_var_declared(lex_attr) == 1) {
- fprintf(stderr, "CHYBA: premenná %s nebola zadeklarovaná.\n", lex_ids[lex_attr]);
- }
- next_symbol();
- break;
- case LPAR:
- next_symbol();
- value = expr(H_Term | H_Expr | K);
- match(RPAR, K);
- break;
- default:
- fprintf(stderr, "CHYBA: Chyba operand, namiesto toho sa vyskytol %s\n.",
- symbol_name(lex_symbol));
- exit(1);
- }
- return value;
- }
- void command(KeySet K) {
- printf("COMMAND LEX Symbol: %s\n", symbol_name(lex_symbol));
- switch (lex_symbol) {
- case PRINT:
- print(K);
- break;
- case ASSIGN:
- assign(K);
- break;
- case WHILE:
- funWhile(K);
- break;
- case IF:
- funIf(K);
- break;
- default:
- assert("Neocakavany operator v command()");
- }
- }
- //Comp → Expr [( "<" | ">" [=] )| "!=" | "==" ) Expr]
- int comp(KeySet K) {
- int value = -1;
- int leftOp, rightOp;
- Symbol operator;
- leftOp = expr(H_Term | H_Expr | K);
- printf("COMP LEX Symbol: %s\n", symbol_name(lex_symbol));
- //match(LPAR, K | E GT | E NE | E GE | E LE | E EQ | E LT | E RPAR);
- value = leftOp;
- if (E lex_symbol & H_Comp) {
- operator = lex_symbol;
- next_symbol();
- rightOp = expr(H_Term | H_Expr | K);
- switch (operator) {
- case GT:
- if(leftOp > rightOp){
- value = 1;
- }
- else{
- value = 0;
- }
- write_gt();
- break;
- case NE:
- if(leftOp != rightOp){
- value = 1;
- }
- else{
- value = 0;
- }
- write_ne();
- break;
- case GE:
- if(leftOp >= rightOp){
- value = 1;
- }
- else{
- value = 0;
- }
- write_ge();
- break;
- case LE:
- if(leftOp <= rightOp){
- value = 1;
- }
- else{
- value = 0;
- }
- write_le();
- break;
- case EQ:
- if(leftOp == rightOp){
- value = 1;
- }
- else{
- value = 0;
- }
- write_eq();
- break;
- case LT:
- if(leftOp < rightOp){
- value = 1;
- }
- else{
- value = 0;
- }
- write_lt();
- break;
- default:
- error("comp: neocakavany operand", K);
- }
- } else if(E lex_symbol & EOF) {
- return value;
- } else {
- error("comp: ocakava sa < / > / <= / >= / == / != nasledovany s expr", H_Term | H_Expr | K);
- }
- return value;
- }
- // If → "if" "(" Comp ")" "{" {Command ";"} "}" ["else "{" {Command ";"} "}"]
- void funIf(KeySet K) {
- match(IF, K | E LPAR | H_Comp | E RPAR | E LBRC | H_Command | E RBRC | E ELSE);
- match(LPAR, K | H_Comp | E RPAR | E LBRC | H_Command | E RBRC | E ELSE);
- comp(K | E RPAR | E LBRC | H_Command | E RBRC | E ELSE);
- match(RPAR, K | E LBRC | H_Command | E RBRC | E ELSE);
- match(LBRC, K | H_Command | E RBRC | E ELSE);
- write_bze(0);
- int bze_address = get_address();
- while((E lex_symbol) & (E PRINT | E ASSIGN | E WHILE | E IF)) {
- command(K | E SEMICOLON | E RBRC | E ELSE);
- match(SEMICOLON, K);
- }
- match(RBRC, K | E RBRC | E ELSE);
- write_jump(0);
- int bze_value = get_address();
- set_value_in_address(bze_address-1, bze_value);
- if ((E lex_symbol) & (E ELSE)) {
- next_symbol();
- match(LBRC, K | H_Command | E RBRC);
- while((E lex_symbol) & (E PRINT | E ASSIGN | E WHILE | E IF)) {
- command(K | E SEMICOLON | E RBRC);
- match(SEMICOLON, K);
- }
- match(RBRC, K);
- }
- int jump_value = get_address();
- set_value_in_address(bze_value-1, jump_value);
- }
- // While → "while" "(" Comp ")" "{" {Command ";"} "}"
- void funWhile(KeySet K) {
- int expr_address = get_address();
- match(LPAR, K | H_Comp | E RPAR | E LBRC | H_Command | E RBRC);
- comp(K | E RPAR | E LBRC | H_Command | E RBRC);
- match(RPAR, K | E LBRC | H_Command | E RBRC);
- match(LBRC, K | H_Command | E RBRC);
- write_bze(0);
- int bze_address = get_address();
- while((E lex_symbol) & (E PRINT | E ASSIGN | E WHILE | E IF)) {
- command(K | E SEMICOLON | E RBRC);
- match(SEMICOLON, K);
- }
- match(RBRC, K);
- write_jump(expr_address);
- int bze_value = get_address();
- set_value_in_address(bze_address-1, bze_value);
- }
- //Mul → Power {( "*" | "/" ) Power}
- int mul(KeySet K) {
- int leftOp, rightOp;
- Symbol operator;
- leftOp = power(H_Mul | E POWER | K);
- //check("mul/div: ocakava sa operand *, /, ^", H_Mul | E POWER | H_Term | K);
- while (E lex_symbol & (H_Mul | E POWER)) {
- operator = lex_symbol;
- next_symbol();
- rightOp = power(H_Mul | E POWER | K);
- printf("MUL LEX Symbol: %s\n", symbol_name(lex_symbol));
- switch (operator) {
- case DIV:
- leftOp = leftOp / rightOp;
- write_div();
- break;
- case MUL:
- leftOp = leftOp * rightOp;
- write_mul();
- break;
- default:
- error("div/mul: neocakavany operand", K);
- }
- //check("div/mul: ocakava sa operand *, /, ^", H_Mul | E POWER | H_Term | K);
- }
- return leftOp;
- }
- //Expr → Mul {( "+" | "-" ) Mul}
- int expr(KeySet K) {
- int leftOp, rightOp;
- Symbol operator;
- leftOp = mul(K);
- //check("expr: ocakava sa jeden z operandov +, -, *, /, ^", H_Expr | H_Mul | K);
- printf("EXPR LEX Symbol: %s\n", symbol_name(lex_symbol));
- while (E lex_symbol & (H_Expr | H_Mul)) {
- operator = lex_symbol;
- next_symbol();
- rightOp = mul(K);
- printf("EXPR LEX Symbol: %s\n", symbol_name(lex_symbol));
- switch (operator) {
- case PLUS:
- printf("CASE PLUS\n");
- write_add();
- leftOp = leftOp + rightOp;
- break;
- case MINUS:
- write_sub();
- leftOp = leftOp - rightOp;
- break;
- default:
- assert("Neocakavany operator v expr()");
- }
- //check("expr: ocakava sa +, -, *, /, ^", H_Expr | H_Mul | K);
- }
- return leftOp;
- }
- //Power → Term {( "^" ) Power}
- int power(KeySet K) {
- printf("POWER LEX Symbol: %d\n", lex_symbol);
- int leftOp, rightOp;
- Symbol operator;
- leftOp = term(E POWER | H_Term | K);
- //check("pow: ocakava sa operand ^", E POWER | H_Term | K);
- if (E lex_symbol & E POWER){
- operator = lex_symbol;
- next_symbol();
- rightOp = power(E POWER | H_Term | K);
- switch (operator) {
- case POWER:
- leftOp = pow(leftOp,rightOp);
- break;
- default:
- error("pow: neocakavany operand", K);
- }
- }
- return (int)leftOp;
- }
- void program(KeySet K) {
- if (lex_symbol == READ){
- read(K);
- }
- while(E lex_symbol & (H_Stat | E SEMICOLON)) {
- command(K);
- match(SEMICOLON, K | E ID);
- //match(ID, K);
- }
- printf("Pocet chyb: %d\n", errorCounter);
- match(SEOF, K);
- }
- /*
- * Gramatika:
- Program → [Read] { Command }
- Read → "read" ID {"," ID} ";"
- Command → Print | While | If| Init
- Print → "print" Comp ";"
- While → "while" "(" Comp ")" "{" Command ";""}""
- If → "if" "(" Comp ")" "{" Command ";""}" ["else "{" Command ";""}"]
- Init → "decl" ID ":=" VALUE {"," Init} ";"
- Comp → Expr [( "<" | ">" [=] )| "!=" | "==" ) Expr]
- Expr → Mul {( "+" | "-" ) Mul}
- Mul → Power {( "*" | "/" ) Power}
- Power → Term {( "^" ) Power}
- Term → VALUE | ID | "(" Expr ")"
- */
- /*
- -----------------------------------------------------------------------------
- | alternatíva
- {} opakovanie 0 alebo viac krát
- [] voliteľnosť
- -----------------------------------------------------------------------------
- A → ... Definícia A() { ... }
- Neterminal A Volánie A()
- Terminal a if (symbol == a) next_symbol();
- { X } while (symbol == first(X)) { ... }
- [ X ] if (symbol == first(X)) { ... }
- X | Y | Z switch (symbol) { case first(X): ... }
- // If → "if" "(" Comp ")" "{" {Command ";"} "}" ["else "{" {Command ";"} "}"]
- -------------------------------------------------------------------------------
- read a; print a;
- read a; print a; assign a = a + 5; print a;
- read a,b,c; print a * (b + c);
- read a,b,c; print a + b / c;
- read a; while(a < 5){print a; assign a := a + 1; if(a == 4){print a*2;};};
- read a; if(a >= 5){print 5;}else{print 0;};
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement