ling-lang 2030.0.5

Ling - The Omniglot Systems Language
// src/parser/grammar.lalrpop
use crate::lexer::Token;
use crate::parser::ast::*;

grammar;

extern {
    type Token = Token;
}

pub Program: Vec<Item> = {
    <items:Item*> => items
};

Item: Item = {
    "bind" <name:Ident> "=" <expr:Expr> => Item::Bind(name, expr),
    "form" <name:Ident> <fields:FormFields> => Item::Form(name, fields),
    "choose" <name:Ident> <variants:ChoiceVariants> => Item::Choose(name, variants),
    "can" <name:Ident> <methods:TraitMethods> => Item::Can(name, methods),
    "give" <ty:Type> <impls:ImplBlock> => Item::Give(ty, impls),
};

Expr: Expr = {
    <e:IfExpr> => e,
    <e:MatchExpr> => e,
    <e:BinaryExpr> => e,
    <e:CallExpr> => e,
};

IfExpr: Expr = {
    "if" <cond:Expr> <then:Block> "else" <else_:Block> => Expr::If(cond, then, else_),
};