use std::str::FromStr; use crate::parser::{lexer::Token, ast::Ast, parse_error}; use eww_shared_util::Span; 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, "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::SimplExpr(Span(l, r, file_id), SimplExpr::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 = { => <>, => <>, }; SimplExpr: SimplExpr = { =>? { let parser = simplexpr::simplexpr_parser::ExprParser::new(); parser.parse(file_id, x.into_iter().map(Ok)) .map_err(|e| ParseError::User { error: parse_error::ParseError::SimplExpr(simplexpr::error::Error::from_parse_error(file_id, e)) }) } } Num: String = <"number"> => <>.to_string(); Bool: String = { "true" => "true".to_string(), "false" => "false".to_string(), } // vim:shiftwidth=4