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", &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 );
}