use std::str::FromStr; use crate::parser::{lexer::{Token}, ast::{Ast, Span}, parse_error}; use simplexpr::ast::SimplExpr; use simplexpr; use lalrpop_util::ParseError; grammar(file_id: usize); extern { type Location = usize; type Error = parse_error::ParseError; enum Token { "(" => Token::LPren, ")" => Token::RPren, "[" => Token::LBrack, "]" => Token::RBrack, "true" => Token::True, "false" => Token::False, "string" => Token::StrLit(), "number" => Token::NumLit(), "symbol" => Token::Symbol(), "keyword" => Token::Keyword(), "simplexpr" => Token::SimplExpr(), "comment" => Token::Comment, } } pub Toplevel: (Span, Vec) = { )*> => (Span(l, r, file_id), elems) } pub Ast: Ast = { "(" )*> ")" => Ast::List(Span(l, r, file_id), elems), "[" )*> "]" => Ast::Array(Span(l, r, file_id), elems), => Ast::SimplExpr(Span(l, r, file_id), expr), => x, => x, => Ast::Literal(Span(l, r, file_id), x.into()), "comment" => Ast::Comment(Span(l, r, file_id)), }; Keyword: Ast = => Ast::Keyword(Span(l, r, file_id), x[1..].to_string()); Symbol: Ast = => Ast::Symbol(Span(l, r, file_id), x.to_string()); Literal: String = { => <>, => <>, => <>, }; StrLit: String = { => { x[1..x.len() - 1].to_owned() }, }; SimplExpr: SimplExpr = { =>? { let expr = x[1..x.len() - 1].to_string(); simplexpr::parse_string(file_id, &expr).map_err(|e| { let span = e.get_span().map(|simplexpr::Span(simpl_l, simpl_r, file_id)| Span(1 + l + simpl_l, 1 + l + simpl_r, file_id)); ParseError::User { error: parse_error::ParseError::SimplExpr(span, e) }}) } } Num: String = <"number"> => <>.to_string(); Bool: String = { "true" => "true".to_string(), "false" => "false".to_string(), } // vim:shiftwidth=4