From ce858db26574d22cde2310bcce95f9775919b8d4 Mon Sep 17 00:00:00 2001 From: "Prof. Ronald Moore" <ronald.moore@h-da.de> Date: Fri, 1 May 2020 00:07:58 +0200 Subject: [PATCH] Finished Intepreter for now --- .../cplusplus/interpreter/.gitignore | 3 + .../cplusplus/interpreter/Makefile | 13 ++- .../cplusplus/interpreter/interpreter | Bin 40672 -> 0 bytes .../cplusplus/interpreter/interpreter.cpp | 95 +++++++++++++++++- .../cplusplus/interpreter/testInput.txt | 11 ++ .../cplusplus/interpreter/testOutput.txt | 23 +++++ 6 files changed, 137 insertions(+), 8 deletions(-) create mode 100644 recursiveDescentParsers/cplusplus/interpreter/.gitignore delete mode 100755 recursiveDescentParsers/cplusplus/interpreter/interpreter create mode 100644 recursiveDescentParsers/cplusplus/interpreter/testInput.txt create mode 100644 recursiveDescentParsers/cplusplus/interpreter/testOutput.txt diff --git a/recursiveDescentParsers/cplusplus/interpreter/.gitignore b/recursiveDescentParsers/cplusplus/interpreter/.gitignore new file mode 100644 index 0000000..dd56fba --- /dev/null +++ b/recursiveDescentParsers/cplusplus/interpreter/.gitignore @@ -0,0 +1,3 @@ +interpreter +tmp.txt + diff --git a/recursiveDescentParsers/cplusplus/interpreter/Makefile b/recursiveDescentParsers/cplusplus/interpreter/Makefile index fd54984..f41bbbc 100644 --- a/recursiveDescentParsers/cplusplus/interpreter/Makefile +++ b/recursiveDescentParsers/cplusplus/interpreter/Makefile @@ -6,7 +6,7 @@ PROGS := interpreter - +TESTFILES := testInput.txt testOutput.txt # Uncomment only one of the next two lines (choose your c++ compiler) # CC=g++ CC := clang++ @@ -22,7 +22,7 @@ CFLAGS := # Tell make that the following "targets" are "phony" # Cf. https://www.gnu.org/software/make/manual/html_node/Phony-Targets.html#Phony-Targets -.PHONY : all clean +.PHONY : all clean test ## Now, the targets -- the things that will get made! @@ -32,5 +32,12 @@ $(PROGS): %: %.cpp $(CC) -g $< $(CFLAGS) -o $@ clean: - $(RM) -fv *~ *.o $(PROGS) + $(RM) -v *~ *.o $(PROGS) tmp.txt + +test: $(PROGS) $(TESTFILES) + # "Running interpreter in test mode\n" + -./interpreter testInput.txt 2>&1 >tmp.txt + # "Checking output -- no news is good news!\n" + diff testOutput.txt tmp.txt + -rm tmp.txt diff --git a/recursiveDescentParsers/cplusplus/interpreter/interpreter b/recursiveDescentParsers/cplusplus/interpreter/interpreter deleted file mode 100755 index 066ac63171237fe93a4d8312b1af2aa713881b14..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40672 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 diff --git a/recursiveDescentParsers/cplusplus/interpreter/interpreter.cpp b/recursiveDescentParsers/cplusplus/interpreter/interpreter.cpp index 5996dd5..c481e21 100644 --- a/recursiveDescentParsers/cplusplus/interpreter/interpreter.cpp +++ b/recursiveDescentParsers/cplusplus/interpreter/interpreter.cpp @@ -48,6 +48,17 @@ static int currentTokenLength = 0; static Token next_token; // again with the global variables... static numberType currentNumber; // = zero.... +static void printErrorMsg( const std::string Error ) +{ + std::cout << "ERROR on line " << currentLineNumber + << ", column " << currentColumnNumber << " : " + << Error << std::endl; + std::cout << currentLine; + for ( int col = 0; col < currentColumnNumber-1; col++ ) + std::cout << '-'; + std::cout << '^' << std::endl; +} // end printErrorMsg + // The Lexer // ========== static bool skippedWhiteSpace( ) { // return true if not at EOF, i.e. if skipped @@ -123,7 +134,81 @@ static Token gettok( ) { // Note that the recursive descent function for (e.g.) E´ // is nameded "E2ndHalf"- +// Forward Declarations +static numberType E(); +static numberType E2ndHalf(); +static numberType T(); +static numberType T2ndHalf(); +static numberType F(); + +// E → T E´ +numberType E() { return T() + E2ndHalf(); } + +// T → F T´ +numberType T() { return F() * T2ndHalf(); } + +// E´ → + T E´ | - T E´ | ε +numberType E2ndHalf() { + switch ( next_token ) { + case tok_plus : + next_token = gettok(); // eat + + return T() + E2ndHalf(); + + case tok_minus : + next_token = gettok(); // eat - + return (-1.0 * T()) + E2ndHalf(); + default : + return 0.0; + }; +} // end E2ndHalf + +// T´ → * F T´ | / F T´ | ε +numberType T2ndHalf() { + numberType tmp, rhs, acc; + switch ( next_token ) { + case tok_times : + next_token = gettok(); // eat * + return F() * T2ndHalf(); + case tok_div : + next_token = gettok(); // eat / + tmp = F(); + if ( 0.0 != tmp ) + return (1.0/tmp) * T2ndHalf(); + // else if T() returned zero + printErrorMsg( "Division by zero!" ); + // fall through to default return one + + default : + return 1.0; + }; +} // end T2ndHalf + +// F → ( E ) | num +numberType F() { + numberType result = 0; + switch ( next_token ) { + case tok_lparen : + next_token = gettok(); // eat lparen + result = E(); + if ( tok_rparen == next_token ) { + next_token = gettok(); // eat rparen + return result; + }; + // else if rparen not found + printErrorMsg( "Expected Right Parenthesis" ); + return 0.0; + + case tok_number : + result = currentNumber; // side-effect of last gettok() + next_token = gettok(); // eat id + return result; + + default : + printErrorMsg( "Expected Left Parenthesis or number" ); + return 0.0; + }; +} // main (!) @@ -148,12 +233,12 @@ int main( int argc, char **argv ) { // get tokens and dump them... while ( tok_eof != next_token ) { - std::cout << "TOKEN = " << (char)next_token - << " current num = " << currentNumber - << std::endl; - next_token = gettok(); + std::cout << currentLineNumber << ":" + << currentLine << std::endl; + numberType value = E( ); + std::cout << "INTERPRETER: " << value << std::endl; }; - std::cout << "EOF" << std::endl; + std::cout << "End Of File!" << std::endl; return 0; // Alles klar!!! } diff --git a/recursiveDescentParsers/cplusplus/interpreter/testInput.txt b/recursiveDescentParsers/cplusplus/interpreter/testInput.txt new file mode 100644 index 0000000..7c49594 --- /dev/null +++ b/recursiveDescentParsers/cplusplus/interpreter/testInput.txt @@ -0,0 +1,11 @@ +42 +40 + 2 +(44.44 - 2.44) +(21 * 2.0) +(84.0 / (3-1)) +88 / 2 - 2 +88 / (8 / 4) - 2 +44.0 - 2 +(4 * 11.0) - 2 +(8 * 11.0) / 2 - 2 +(8 * 11.0) / (8 / 4) - 2 diff --git a/recursiveDescentParsers/cplusplus/interpreter/testOutput.txt b/recursiveDescentParsers/cplusplus/interpreter/testOutput.txt new file mode 100644 index 0000000..91ba1de --- /dev/null +++ b/recursiveDescentParsers/cplusplus/interpreter/testOutput.txt @@ -0,0 +1,23 @@ +0:42 +INTERPRETER: 42 +1:40 + 2 +INTERPRETER: 42 +2:(44.44 - 2.44) +INTERPRETER: 42 +3:(21 * 2.0) +INTERPRETER: 42 +4:(84.0 / (3-1)) +INTERPRETER: 42 +5:88 / 2 - 2 +INTERPRETER: 42 +6:88 / (8 / 4) - 2 +INTERPRETER: 42 +7:44.0 - 2 +INTERPRETER: 42 +8:(4 * 11.0) - 2 +INTERPRETER: 42 +9:(8 * 11.0) / 2 - 2 +INTERPRETER: 42 +10:(8 * 11.0) / (8 / 4) - 2 +INTERPRETER: 42 +End Of File! -- GitLab