mirror of
https://github.com/cwbaker/lalr.git
synced 2026-09-26 16:33:18 +03:00
Update README.md calculator example to match source code
This commit is contained in:
parent
ae4ed8104c
commit
658bc53969
1 changed files with 32 additions and 38 deletions
70
README.md
70
README.md
|
|
@ -16,7 +16,6 @@ Modern [LALR(1)](https://en.wikipedia.org/wiki/LALR_parser) parser generator and
|
|||
## Example
|
||||
|
||||
~~~c++
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
#include <lalr/GrammarCompiler.hpp>
|
||||
|
|
@ -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<int>* start, const ParserNode<int>* finish )
|
||||
{
|
||||
return start[0].user_data() + start[2].user_data();
|
||||
}
|
||||
|
||||
static int subtract( const ParserNode<int>* start, const ParserNode<int>* finish )
|
||||
{
|
||||
return start[0].user_data() - start[2].user_data();
|
||||
}
|
||||
|
||||
static int multiply( const ParserNode<int>* start, const ParserNode<int>* finish )
|
||||
{
|
||||
return start[0].user_data() * start[2].user_data();
|
||||
}
|
||||
|
||||
static int divide( const ParserNode<int>* start, const ParserNode<int>* finish )
|
||||
{
|
||||
return start[0].user_data() / start[2].user_data();
|
||||
}
|
||||
|
||||
static int compound( const ParserNode<int>* start, const ParserNode<int>* finish )
|
||||
{
|
||||
return start[1].user_data();
|
||||
}
|
||||
|
||||
static int integer( const ParserNode<int>* start, const ParserNode<int>* 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<const char*, int> 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 );
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue