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_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_Stat = E PRINT | E ASSIGN | E WHILE | E IF;
- KeySet H_Decl = E ID | E COMMA;
- KeySet H_Init = E ID | E ASSIGN | E VALUE | E COMMA;
- 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;
- void stat(KeySet K);
- 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 fork(KeySet K);
- void cycle(KeySet K);
- 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++) {
- if (variables[i] == value) {
- printf("VARIABLES I IS: %d VALUE: %d\n",variables[i],value);
- return 0;
- }else{
- printf("NEW: %d VALUE: %d\n",variables[i],value);
- }
- }
- 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]);
- }
- void declare_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);
- //printf("PRINT lex_symbol: %s\n", symbol_name(lex_symbol));
- 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(ADD, K);
- int value = comp(K);
- set_variable(id, value);
- }
- void var(KeySet K) {
- match(VAR, K | E ID);
- check("Očakáva sa IDs", K | E COMMA | E ID);
- if(((E lex_symbol) & (E ID))) {
- declare_variable(lex_attr);
- next_symbol();
- } else error("Očakáva sa ID", K | E COMMA | E ID);
- while (((E lex_symbol) & (E COMMA))) {
- next_symbol();
- check("Očakáva sa ID", K | E COMMA | E ID);
- if(((E lex_symbol) & (E ID))) {
- /*
- if(is_var_declared(lex_attr) == 0) {
- fprintf(stderr, "CHYBA: premenná %s už je zadeklarovaná.\n", lex_ids[lex_attr]);
- }
- */
- declare_variable(lex_attr);
- next_symbol();
- } else error("Očakáva sa ID", K | E COMMA | E ID);
- }
- }
- void read(KeySet K) {
- match(READ, K | E ID);
- check("Očakáva sa IDs", K | E COMMA | E ID);
- if(((E lex_symbol) & (E ID))) {
- read_variable(lex_attr);
- next_symbol();
- } else error("Očakáva sa ID", K | E COMMA | E ID);
- while (((E lex_symbol) & (E COMMA))) {
- next_symbol();
- check("Očakáva sa ID", K | E COMMA | E ID);
- if(((E lex_symbol) & (E ID))) {
- /*
- if(is_var_declared(lex_attr) == 0) {
- fprintf(stderr, "CHYBA: premenná %s už je zadeklarovaná.\n", lex_ids[lex_attr]);
- }
- */
- read_variable(lex_attr);
- next_symbol();
- } else error("Očakáva sa ID", K | E COMMA | E ID);
- }
- }
- //Term → VALUE | ID | "(" Expr ")"
- int term(KeySet K) {
- //printf("TERM LEX Symbol: %s\n", symbol_name(lex_symbol));
- int value;
- switch (lex_symbol) {
- case VALUE:
- value = lex_attr;
- write_number(lex_attr);
- next_symbol();
- break;
- case ID:
- value = variables[lex_attr];
- write_var(lex_attr);
- next_symbol();
- /*
- if (is_var_declared(lex_attr) == 1) {
- fprintf(stderr, "CHYBA: premenná %s nebola zadeklarovaná.\n", lex_ids[lex_attr]);
- }
- */
- break;
- case LPAR:
- next_symbol();
- value = comp(K | E RPAR | H_Comp);
- 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 stat(KeySet K) {
- //printf("STAT LEX Symbol: %s\n", symbol_name(lex_symbol));
- switch (lex_symbol) {
- case PRINT:
- print(K);
- break;
- case ASSIGN:
- assign(K);
- break;
- case WHILE:
- cycle(K);
- break;
- case IF:
- fork(K);
- break;
- case READ:
- read(K);
- break;
- default:
- assert("Neocakavany operator v stat()");
- }
- }
- //Comp → Expr [( "<" | ">" [=] )| "!=" | "==" ) Expr]
- int comp(KeySet K) {
- int leftOp, rightOp;
- Symbol operator;
- leftOp = expr(H_Term | H_Expr | K);
- if (E lex_symbol & (H_Comp)) {
- operator=lex_symbol;
- next_symbol();
- rightOp = expr(H_Term | H_Expr | K);
- switch (operator) {
- case EQ:
- write_eq();
- leftOp = leftOp == rightOp;
- break;
- case NE:
- write_ne();
- leftOp = leftOp != rightOp;
- break;
- case LT:
- write_lt();
- leftOp = leftOp < rightOp;
- break;
- case LE:
- write_le();
- leftOp = leftOp <= rightOp;
- break;
- case GT:
- write_gt();
- leftOp = leftOp > rightOp;
- break;
- case GE:
- write_ge();
- leftOp = leftOp >= rightOp;
- break;
- default:
- assert("Neocakavany operator v comp()");
- }
- }
- //printf("leftOp: %d\n", leftOp);
- return leftOp;
- }
- // If → "if" "(" Comp ")" "{" {Stat ";"} "}" ["else "{" {Stat ";"} "}"]
- void fork(KeySet K) {
- match(IF, K | E LPAR | H_Comp | E RPAR | E LBRC | H_Stat | E RBRC | E ELSE);
- match(LPAR, K | H_Comp | E RPAR | E LBRC | H_Stat | E RBRC | E ELSE);
- comp(K | E RPAR | E LBRC | H_Stat | E RBRC | E ELSE);
- match(RPAR, K | E LBRC | H_Stat | E RBRC | E ELSE);
- match(LBRC, K | H_Stat | E RBRC | E ELSE);
- write_bze(0);
- int bze_address = get_address();
- while ((E lex_symbol) & (E PRINT | E ASSIGN | E WHILE | E IF)) {
- stat(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_Stat | E RBRC);
- while ((E lex_symbol) & (E PRINT | E ASSIGN | E WHILE | E IF)) {
- stat(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 ")" "{" {Stat ";"} "}"
- void cycle(KeySet K) {
- int expr_address = get_address();
- match(WHILE, K | LPAR | H_Comp | E RPAR | E LBRC | H_Stat | E RBRC);
- match(LPAR, K | H_Comp | E RPAR | E LBRC | H_Stat | E RBRC);
- comp(K | E RPAR | E LBRC | H_Stat | E RBRC);
- match(RPAR, K | E LBRC | H_Stat | E RBRC);
- match(LBRC, K | H_Stat | E RBRC);
- write_bze(0);
- int bze_address = get_address();
- while ((E lex_symbol) & (E PRINT | E ASSIGN | E WHILE | E IF)) {
- stat(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 MUL:
- write_mul();
- leftOp = leftOp * rightOp;
- break;
- case DIV:
- write_div();
- leftOp = leftOp / rightOp;
- 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:
- 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: %s\n", symbol_name(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) {
- var(K);
- match(SEMICOLON, K);
- }
- while (E lex_symbol & (H_Stat | E SEMICOLON)) {
- stat(K);
- match(SEMICOLON, K);
- }
- printf("Po cet chyb: %d\n", errorCounter);
- match(SEOF, K);
- }
- /*
- * Gramatika:
- Program → [Read] { Stat }
- Read → "read" ID {"," ID} ";"
- Stat → Print | Cycle | Fork | Assign
- Print → "print" Comp ";"
- Cycle → "while" "(" Comp ")" "{" Stat ";""}""
- Fork → "if" "(" Comp ")" "{" Stat ";""}" ["else "{" Stat ";""}"]
- Assign → "assign" ID ":=" VALUE {"," Assign} ";"
- 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): ... }
- -------------------------------------------------------------------------------
- read a; print a;
- read a; print a; assign a := a + 100; print a;
- read a,b,c; print a * (b + c);
- read a,b,c; print a + b / c;
- read a; if(a >= 5){print 5;}else{print 3;};
- read a; while(a < 13){ print a; assign a := a+2; print a; };
- read a; while(a < 7){print a; assign a := a + 1; print a; if(a == 4){print a*2;}else{print 5;};};
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement