#![feature(plugin, collections, str_char)]
#![plugin(peg_syntax_ext)]

extern crate rustc_serialize;

use gdl::program;

peg_file! gdl("grammar.rustpeg");

#[derive(Debug, Eq, PartialEq, RustcDecodable, RustcEncodable)]
pub struct Program {
    sexprs: Vec<SExpr>
}

#[derive(Debug, Eq, PartialEq, RustcDecodable, RustcEncodable)]
pub enum SExpr {
    Func(String, Vec<Term>),
    RuleOp(Vec<Term>)
}

#[derive(Debug, Eq, PartialEq, RustcDecodable, RustcEncodable)]
pub enum Term {
    Constant(String),
    Variable(String),
    ExprTerm(SExpr),
    Num(u8)
}

pub fn parse(s: &str) -> Program {
    match program(s) {
        Ok(p) => p,
        Err(e) => panic!("{}", e)
    }
}