From 1e561222f2d53306686bb9031a361df24e47001f Mon Sep 17 00:00:00 2001 From: "Prof. Ronald Moore" <ronald.moore@h-da.de> Date: Thu, 30 Apr 2020 22:02:15 +0200 Subject: [PATCH] lexer done --- .../cplusplus/interpreter/interpreter | Bin 17600 -> 40672 bytes .../cplusplus/interpreter/interpreter.cpp | 165 ++++++++++++++---- 2 files changed, 132 insertions(+), 33 deletions(-) diff --git a/recursiveDescentParsers/cplusplus/interpreter/interpreter b/recursiveDescentParsers/cplusplus/interpreter/interpreter index b4110dc560d39b33753aec8ba003afa3bec6f815..066ac63171237fe93a4d8312b1af2aa713881b14 100755 GIT binary patch literal 40672 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 literal 17600 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 Xg8C$&UEVMrf>yVIutm`{pm7-hj|}d8 diff --git a/recursiveDescentParsers/cplusplus/interpreter/interpreter.cpp b/recursiveDescentParsers/cplusplus/interpreter/interpreter.cpp index f954cb5..5996dd5 100644 --- a/recursiveDescentParsers/cplusplus/interpreter/interpreter.cpp +++ b/recursiveDescentParsers/cplusplus/interpreter/interpreter.cpp @@ -2,59 +2,158 @@ // Prof. Ronald Moore // https://fbi.h-da.de/personen/ronald-moore/ // mailto:ronald.moore@h-da.de -// with no warranties whatsoever -// -// The grammar we are going to parse here is: -// Grammar: -// E → T E´ -// E´ → + T E´ | - T E´ | ε -// T → F T´ -// T´ → * F T´ | / F T´ | ε -// F → ( E ) | num -// where the following are taken to be tokens: +// with no warranties whatsoever! + + +#include <cassert> +#include <cctype> // for isspace +#include <cstdlib> // for strtod +#include <iostream> +#include <fstream> +#include <string> +// include <vector> + +// =================== +// LEXICAL ANALYSIS +// The following are taken to be tokens: // left and right parenthesis, the plus and minus characters, // as well as asterisk and forward slash -- and numbers. // In the script, substraction and division are not supported, // but it seems like time to add them. -// -// Note that the recursive descent function for (e.g.) E´ -// is nameded "E2ndHalf"- - -#include <cstdio> -#include <cstdlib> -#include <string> -#include <vector> // Preliminaries and Utilities // ============================ -// global variables -- sue me if you don't like that! -std::string currentLine( "" ); -int currentLineNumber = 0; -int currentColumnNumber = 0; -int currentTokenLength = 0; // Utility Types typedef double numberType; // feel fee to change this to something else like int or float or bigint.... +typedef enum Token { + tok_number = 'n', + tok_lparen = '(', + tok_rparen = ')', + tok_plus = '+', + tok_minus = '-', + tok_times = '*', + tok_div = '/', + tok_eof = 'E', + bad_tok = 'X' +} Token; + +// global variables -- sue me if you don't like that! +static std::istream *input = &(std::cin); // until proven otherwise +static std::string currentLine( "" ); +static int currentLineNumber = -1; +static int currentColumnNumber = 0; +static int currentTokenLength = 0; -// the tokens -enum Token { - tok_number, - tok_lparen, - tok_rparen, - tok_plus, - tok_minus, - tok_times, - tok_div -} next_token; // again with the global variables... +static Token next_token; // again with the global variables... +static numberType currentNumber; // = zero.... // The Lexer // ========== +static bool skippedWhiteSpace( ) { // return true if not at EOF, i.e. if skipped + while ( true ) { + int currentLineLength = currentLine.length(); + while ( currentColumnNumber < currentLineLength ) + if ( isspace( currentLine[ currentColumnNumber ] ) ) + currentColumnNumber++; + else // if NOT isspace() + return true; + + // if we're here, we're at the end of a line. + std::getline( *input, currentLine ); + currentLineNumber++; + currentColumnNumber = 0; + if ( ! *input ) // EOF!! + return false; + // else, repeat! + // Which is the same as + // return skippedWhiteSpace() -- i.e. tail recursion. + }; +}; +static Token gettok( ) { + assert( input ); // we assume nullptr != input + if ( ! *input ) return bad_tok; + // else, we can read from input + // Skip white space, going to next line as necessary + if ( ! skippedWhiteSpace( ) ) return tok_eof; + + // We're have visible text in front of us. + char currentChar = currentLine[ currentColumnNumber ]; + currentColumnNumber++; // usually, but see num... + switch ( currentChar ) { + case '(' : return tok_lparen; + case ')' : return tok_rparen; + case '+' : return tok_plus; + case '-' : return tok_minus; + case '*' : return tok_times; + case '/' : return tok_div; + default : + // either we have a number in front of us, or we don't + assert( 0 < currentColumnNumber ); + char *alpha = &(currentLine[ currentColumnNumber-1 ]); + // minus one because we incremented it before the switch + char *omega = nullptr; // until we call strtod... + double tmpValue = strtod( alpha, &omega ); + if ( alpha == omega ) { + return bad_tok; // !!! + }; + // else if strtod found a real number (or at least a double) + currentNumber = tmpValue; // let C++ do the converison + currentColumnNumber += (omega - alpha) -1; + // minus one because we incremented it before the switch + return tok_number; + + }; // end switch + assert( false ); // we should never get here! + return bad_tok; +} // end gettok + +// PARSING!!! +// =========== +// +// The grammar we are going to parse here is: +// Grammar: +// E → T E´ +// E´ → + T E´ | - T E´ | ε +// T → F T´ +// T´ → * F T´ | / F T´ | ε +// F → ( E ) | num +// Note that the recursive descent function for (e.g.) E´ +// is nameded "E2ndHalf"- + + + + // main (!) // ========= int main( int argc, char **argv ) { + if (2 != argc) { + std::cerr << "Usage: " << argv[0] << " <fileName>.\n" + << "You provided " << argc-1 << " arguments, we take exactly one (only).\n"; + return( -1 ); + }; + // else if 1 == argc .... + std::string fileName( argv[1] ); + if ( "-" != fileName ) { + static std::ifstream ifs( fileName ); + input = &ifs; + } + + // Prime the pump! + next_token = gettok( ); + + // 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 << "EOF" << std::endl; + return 0; // Alles klar!!! } -- GitLab