%start AbbrList %% AbbrList -> Result, ()>: Text { Ok(vec![Isabelle::Text($1?)]) } | Abbr { Ok(vec![Isabelle::Symbol($1?)]) } | AbbrList Abbr { let mut $1 = $1?; $1.push(Isabelle::Symbol($2?)); Ok($1) } | AbbrList Text { let mut $1 = $1?; $1.push(Isabelle::Text($2?)); Ok($1) } ; Abbr -> Result: 'AOPEN' Name { Ok($2?) } ; Text -> Result: 'TEXT' { let v = $1.map_err(|_| ())?; Ok($lexer.span_str(v.span()).to_string()) } | 'AOPEN' { //let v = $2.map_err(|_| ())?; Ok("\\".to_string()) } | 'LT' { //let v = $2.map_err(|_| ())?; Ok("<".to_string()) //format!("<{}", $lexer.span_str(v.span()))) } ; Name -> Result: 'NAME' { let v = $1.map_err(|_| ())?; let name = $lexer.span_str(v.span()); Ok(name[1..name.len()-1].to_string()) } ; %% use crate::Isabelle;