Examples
Hello World!
The classic "Hello World!" using Sweet Parser:
#include <stdio.h>
#include <sweet/parser.hpp>
using namespace std;
using namespace sweet;
using namespace sweet::parser;
static ptr<ParserUserData<char>> hello_world( const ParserSymbol* symbol, const ParserNode<>* start, const ParserNode<>* finish )
{
printf( "Hello World!\n" );
return ptr<ParserUserData<char>>();
}
void parser_hello_world_example()
{
const char* grammar =
"hello_world {\n"
" hello_world: 'Hello World!' [hello_world];\n"
"}"
;
ParserData parser_data( grammar, grammar + strlen(grammar) );
Parser<const char*> parser( &parser_data );
parser.parser_action_handlers()
( "hello_world", &hello_world )
;
const char* input = "Hello World!";
parser.parse( input, input + strlen(input) );
SWEET_ASSERT( parser.accepted() );
SWEET_ASSERT( parser.full() );
}
Calculator
A calculator using Sweet Parser:
#include <stdio.h>
#include <stdarg.h>
#include <sweet/parser.hpp>
using namespace std;
using namespace sweet;
using namespace sweet::parser;
static int add( const ParserSymbol* symbol, const ParserNode<int>* start, const ParserNode<int>* finish )
{
return start[0].get_user_data() + start[2].get_user_data();
}
static int subtract( const ParserSymbol* symbol, const ParserNode<int>* start, const ParserNode<int>* finish )
{
return start[0].get_user_data() - start[2].get_user_data();
}
static int multiply( const ParserSymbol* symbol, const ParserNode<int>* start, const ParserNode<int>* finish )
{
return start[0].get_user_data() * start[2].get_user_data();
}
static int divide( const ParserSymbol* symbol, const ParserNode<int>* start, const ParserNode<int>* finish )
{
return start[0].get_user_data() / start[2].get_user_data();
}
static int compound( const ParserSymbol* symbol, const ParserNode<int>* start, const ParserNode<int>* finish )
{
return start[1].get_user_data();
}
static int integer( const ParserSymbol* symbol, const ParserNode<int>* start, const ParserNode<int>* finish )
{
return ::atoi( start[0].get_lexeme().c_str() );
}
void parser_calculator_example()
{
const char* grammar =
"calculator {\n"
" %left '+' '-';\n"
" %left '*' '/';\n"
" %none integer;\n"
"\n"
" expr: expr '+' expr [add]\n"
" | expr '-' expr [subtract]\n"
" | expr '*' expr [multiply]\n"
" | expr '/' expr [divide]\n"
" | '(' expr ')' [compound]\n"
" | integer [integer]\n"
" ;\n"
"\n"
" integer: \"[0-9]+\";\n"
" whitespace: \"[ \t\r\n]*\";\n"
"}"
;
ParserData parser_data( grammar, grammar + strlen(grammar) );
Parser<const char*, int> parser( &parser_data );
parser.parser_action_handlers()
( "add", &add )
( "subtract", &subtract )
( "multiply", &multiply )
( "divide", ÷ )
( "compound", &compound )
( "integer", &integer )
;
const char* input = "1 + 2 * (3 + 4) + 5";
parser.parse( input, input + strlen(input) );
SWEET_ASSERT( parser.accepted() );
SWEET_ASSERT( parser.full() );
SWEET_ASSERT( parser.user_data() == 20 );
}