parser.c
unknown
plain_text
20 days ago
7.2 kB
4
Indexable
#include <stdio.h> #include <stdlib.h> #include <string.h> #include "parser.h" #include "codeGen.h" Symbol table[TBLSIZE]; void initTable(void) { strcpy(table[0].name, "x"); table[0].val = 0; strcpy(table[1].name, "y"); table[1].val = 0; strcpy(table[2].name, "z"); table[2].val = 0; sbcount = 3; } int getval(char *str) { int i = 0; for (i = 0; i < sbcount; i++) if (strcmp(str, table[i].name) == 0) return table[i].val; if (sbcount >= TBLSIZE) error(RUNOUT); strcpy(table[sbcount].name, str); table[sbcount].val = 0; sbcount++; return 0; } int getidx(char* str) { int i = 0; for (i = 0; i < sbcount; i++) { if (strcmp(str, table[i].name) == 0) return 4 * i; } return -1; } int setval(char *str, int val) { int i = 0; for (i = 0; i < sbcount; i++) { if (strcmp(str, table[i].name) == 0) { table[i].val = val; return val; } } if (sbcount >= TBLSIZE) error(RUNOUT); strcpy(table[sbcount].name, str); table[sbcount].val = val; sbcount++; return val; } BTNode *makeNode(TokenSet tok, const char *lexe) { BTNode *node = (BTNode*)malloc(sizeof(BTNode)); strcpy(node->lexeme, lexe); node->data = tok; node->val = 0; node->left = NULL; node->right = NULL; return node; } void freeTree(BTNode *root) { if (root != NULL) { freeTree(root->left); freeTree(root->right); free(root); } } BTNode *factor(void) { BTNode *retp = NULL, *left = NULL; if (match(INT)) { retp = makeNode(INT, getLexeme()); advance(); } else if (match(ID)) { retp = makeNode(ID, getLexeme()); advance(); } else if (match(INC)) { retp = makeNode(INC, getLexeme()); advance(); retp->right = makeNode(INT, "1"); retp->left = factor(); } else if (match(DEC)) { retp = makeNode(DEC, getLexeme()); advance(); retp->right = makeNode(INT, "1"); retp->left = factor(); } else if (match(LPAREN)) { advance(); retp = assign_expr(); if (match(RPAREN)) advance(); else error(MISPAREN); } else { error(NOTNUMID); } return retp; } BTNode* unary_expr(void) { BTNode* node = NULL; if (match(ADDSUB)) { node = makeNode(ADDSUB, getLexeme()); advance(); node->left = makeNode(INT, "0"); node->right = unary_expr(); } else { node = factor(); } return node; } BTNode* muldiv_expr(void) { BTNode* node = unary_expr(); return muldiv_expr_tail(node); } BTNode* muldiv_expr_tail(BTNode* left) { BTNode* node = NULL; if (match(MULDIV)) { node = makeNode(MULDIV, getLexeme()); advance(); node->left = left; node->right = unary_expr(); return muldiv_expr_tail(node); } else { return left; } } BTNode* addsub_expr(void) { BTNode* node = muldiv_expr(); return addsub_expr_tail(node); } BTNode* addsub_expr_tail(BTNode* left) { BTNode* node = NULL; if (match(ADDSUB)) { node = makeNode(ADDSUB, getLexeme()); advance(); node->left = left; node->right = muldiv_expr(); return addsub_expr_tail(node); } else { return left; } } BTNode* and_expr(void) { BTNode* node = addsub_expr(); return and_expr_tail(node); } BTNode* and_expr_tail(BTNode* left) { BTNode* node = NULL; if (match(AND)) { node = makeNode(AND, getLexeme()); advance(); node->left = left; node->right = addsub_expr(); return and_expr_tail(node); } else { return left; } } BTNode* xor_expr(void) { BTNode* node = and_expr(); return xor_expr_tail(node); } BTNode* xor_expr_tail(BTNode* left) { BTNode* node = NULL; if (match(XOR)) { node = makeNode(XOR, getLexeme()); advance(); node->left = left; node->right = and_expr(); return xor_expr_tail(node); } else { return left; } } BTNode* or_expr(void) { BTNode* node = xor_expr(); return or_expr_tail(node); } BTNode* or_expr_tail(BTNode* left) { BTNode* node = NULL; if (match(OR)) { node = makeNode(OR, getLexeme()); advance(); node->left = left; node->right = xor_expr(); return or_expr_tail(node); } else { return left; } } BTNode* assign_expr(void) { BTNode *node = NULL, *left= NULL; char* str; if (match(ID)) { left = makeNode(ID, getLexeme()); advance(); if (match(ASSIGN)) { node = makeNode(ASSIGN, getLexeme()); advance(); node->left = left; node->right = assign_expr(); } else if (match(ADDSUB_ASSIGN)) { node = makeNode(ADDSUB_ASSIGN, getLexeme()); advance(); node->left = left; node->right = assign_expr(); } else { node = or_expr(); } } else { node = or_expr(); } return node; } void statement(void) { BTNode *retp = NULL; if (match(ENDFILE)) { exit(0); } else if (match(END)) { printf(">> "); advance(); } else { retp = assign_expr(); if (match(END)) { int d = getAssembly(retp, 0); printf("%d\n", evaluateTree(retp)); printf("Prefix traversal: "); printPrefix(retp); printf("\n"); freeTree(retp); printf(">> "); advance(); } else { error(SYNTAXERR); } } } void err(ErrorType errorNum) { if (PRINTERR) { fprintf(stderr, "error: "); switch (errorNum) { case MISPAREN: fprintf(stderr, "mismatched parenthesis\n"); break; case NOTNUMID: fprintf(stderr, "number or identifier expected\n"); break; case NOTFOUND: fprintf(stderr, "variable not defined\n"); break; case RUNOUT: fprintf(stderr, "out of memory\n"); break; case NOTLVAL: fprintf(stderr, "lvalue required as an operand\n"); break; case DIVZERO: fprintf(stderr, "divide by constant zero\n"); break; case SYNTAXERR: fprintf(stderr, "syntax error\n"); break; default: fprintf(stderr, "undefined error\n"); break; } } exit(0); }
Editor is loading...
Leave a Comment