From 608be2d1569db5385228c65b993bfe03684908bb Mon Sep 17 00:00:00 2001 From: Steven Schronk Date: Thu, 11 Nov 2010 13:58:57 -0600 Subject: [PATCH] Expression functions enhanced. Works with unary and binary operators. Detects unbalance parenthesis, but still prints odd error messages when such errors occur. --- parse.c | 82 +++++++++++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 54 insertions(+), 28 deletions(-) diff --git a/parse.c b/parse.c index 61c8087..6f2c009 100644 --- a/parse.c +++ b/parse.c @@ -9,6 +9,9 @@ #include "parse.h" #include "token.h" +#define OP "+-*//&|<>=" +#define UNARY_OP "-~" + void parse_class() { if(settings.tokens) { printf("\n"); } @@ -551,26 +554,49 @@ void parse_if() void parse_expression() { - do { - if(settings.tokens) { printf("%s\n", pT); } - if(has_more_tokens(pC) == true) - { - pC = advance(pC, pT); - tk = token_type(pT); - } else { - compiler_error(34, "Could Not Parse Expression. Incomplete Program", pS, pC, pT); - } - } while (*pT != ']' && *pT != ';'); -} + parse_term(); -void parse_term() -{ if(has_more_tokens(pC) == true) { pC = advance(pC, pT); tk = token_type(pT); } else { - compiler_error(25, "Could Not Complete Term. Incomplete Program", pS, pC, pT); + compiler_error(34, "Could Not Parse Expression. Incomplete Program", pS, pC, pT); + } + + if(strchr(OP, *pT) != NULL) + { + if(settings.tokens) { printf("%s\n", pT); } + if(has_more_tokens(pC) == true) + { + pC = advance(pC, pT); + tk = token_type(pT); + } else { + compiler_error(34, "Could Not Parse Expression. Incomplete Program", pS, pC, pT); + } + parse_expression(); + } +} + +void parse_term() +{ + if(tk == INT_CONST) + { + if(settings.tokens) { printf("%s\n", pT); } + return; + } + + if(strchr(UNARY_OP, *pT) != NULL) + { + if(settings.tokens) { printf("%s\n", pT); } + if(has_more_tokens(pC) == true) + { + pC = advance(pC, pT); + tk = token_type(pT); + parse_term(); + } else { + compiler_error(25, "Could Not Complete Term. Incomplete Program", pS, pC, pT); + } } switch(*pT) @@ -594,7 +620,20 @@ void parse_term() break; case '(': if(settings.tokens) { printf("\t%s\n", pT); } - parse_expr_lst(); + if(has_more_tokens(pC) == true) + { + pC = advance(pC, pT); + tk = token_type(pT); + } else { + compiler_error(25, "Could Not Complete Term. Incomplete Program", pS, pC, pT); + } + parse_expression(); + + if (*pT == ')') { + if(settings.tokens) { printf("\t%s\n", pT); } + } else { + compiler_error(38, "Could Not Find Symbol ')' At This Location", pS, pC, pT); + } break; case '.': if(settings.tokens) { printf("\t%s\n", pT); } @@ -602,19 +641,6 @@ void parse_term() default: return; } - - if(strchr(UNARY_OP, *pT) != NULL) - { - if(settings.tokens) { printf("\t%s\n", pT); } - if(has_more_tokens(pC) == true) - { - pC = advance(pC, pT); - tk = token_type(pT); - parse_term(); - } else { - compiler_error(25, "Could Not Complete Term. Incomplete Program", pS, pC, pT); - } - } } void parse_subroutine_call() -- 2.11.4.GIT