act-file 0.0.1

Parser for Act-files.
Documentation
/**
 * Calculator grammar to generate parser in Rust.
 */

%lex

%%

// -----------------------------------------------
// Lexical grammar.
//
// Uses regexp to produce list of tokens.
// Return values is a token type.

\s+     /* skip whitespace */ return "";
\d+     return "NUMBER";

"+"     return "+";
"*"     return "*";

"("     return "(";
")"     return ")";  

/lex

// -----------------------------------------------
// Operator precedence.
//
// The `*` goes after `+`, so `2 + 2 * 2` is
// correctly parsed as `2 + (2 * 2)`.
//
// Also both are left-associative, meaning
// `2 + 2 + 2` is `(2 + 2) + 2`, which is important
// when we build AST nodes.

%left +
%left *

// -----------------------------------------------
// Module include.
//
// The code which is included "as is" to the generated
// parser. Should at least contain `TResult` -- the
// type of the final parsed value.

%{

// Important: define the type of the parsing result:

type TResult = i32;

%}

%%

// -----------------------------------------------
// Syntactic grammar (BNF).

Expr

    // ---------------------------------------
    // Addition

    : Expr + Expr {

        // Types of used args, and the return type.
        |$1: i32, $3: i32| -> i32;

        $$ = $1 + $3
    }

    // ---------------------------------------
    // Multiplication

    | Expr * Expr {

        |$1: i32, $3: i32| -> i32;

        $$ = $1 * $3
    }

    // ---------------------------------------
    // Simple number

    | NUMBER {

        || -> i32;

        $$ = yytext.parse::<i32>().unwrap()
    }

    // ---------------------------------------
    // Grouping in parens

    | ( Expr ) {

        $$ = $2

    };