From 658bc53969cbdf9cdc0ab9afe604a49b191fb019 Mon Sep 17 00:00:00 2001 From: Charles Baker Date: Sat, 20 Apr 2019 20:15:34 +1200 Subject: [PATCH] Update README.md calculator example to match source code --- README.md | 70 +++++++++++++++++++++++++------------------------------ 1 file changed, 32 insertions(+), 38 deletions(-) diff --git a/README.md b/README.md index abd63bd..961fa16 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,6 @@ Modern [LALR(1)](https://en.wikipedia.org/wiki/LALR_parser) parser generator and ## Example ~~~c++ - #include #include #include @@ -26,36 +25,6 @@ Modern [LALR(1)](https://en.wikipedia.org/wiki/LALR_parser) parser generator and using namespace std; using namespace lalr; -static int add( const ParserNode* start, const ParserNode* finish ) -{ - return start[0].user_data() + start[2].user_data(); -} - -static int subtract( const ParserNode* start, const ParserNode* finish ) -{ - return start[0].user_data() - start[2].user_data(); -} - -static int multiply( const ParserNode* start, const ParserNode* finish ) -{ - return start[0].user_data() * start[2].user_data(); -} - -static int divide( const ParserNode* start, const ParserNode* finish ) -{ - return start[0].user_data() / start[2].user_data(); -} - -static int compound( const ParserNode* start, const ParserNode* finish ) -{ - return start[1].user_data(); -} - -static int integer( const ParserNode* start, const ParserNode* finish ) -{ - return ::atoi( start[0].lexeme().c_str() ); -} - void lalr_calculator_example() { const char* calculator_grammar = @@ -80,16 +49,41 @@ void lalr_calculator_example() compiler.compile( calculator_grammar, calculator_grammar + strlen(calculator_grammar) ); Parser parser( compiler.parser_state_machine() ); parser.parser_action_handlers() - ( "add", &add ) - ( "subtract", &subtract ) - ( "multiply", &multiply ) - ( "divide", ÷ ) - ( "compound", &compound ) - ( "integer", &integer ) + ( "add", [] ( const int* data, const ParserNode<>* nodes, size_t length ) + { + return data[0] + data[2]; + } + ) + ( "subtract", [] ( const int* data, const ParserNode<>* nodes, size_t length ) + { + return data[0] - data[2]; + } + ) + ( "multiply", [] ( const int* data, const ParserNode<>* nodes, size_t length ) + { + return data[0] * data[2]; + } + ) + ( "divide", [] ( const int* data, const ParserNode<>* nodes, size_t length ) + { + return data[0] / data[2]; + } + ) + ( "compound", [] ( const int* data, const ParserNode<>* nodes, size_t length ) + { + return data[1]; + } + ) + ( "integer", [] ( const int* data, const ParserNode<>* nodes, size_t length ) + { + return ::atoi( nodes[0].lexeme().c_str() ); + } + ) ; - + const char* input = "1 + 2 * (3 + 4) + 5"; parser.parse( input, input + strlen(input) ); + printf( "1 + 2 * (3 + 4) + 5 = %d", parser.user_data() ); LALR_ASSERT( parser.accepted() ); LALR_ASSERT( parser.full() ); LALR_ASSERT( parser.user_data() == 20 );