use std::str::FromStr; use crate::ast::*; grammar; // pub Items: Vec<(usize, usize)> = { // <@L> <@R> => vec![(<>)], // <mut v:Items> <e:Spanned<"+">> => { v.push(e); v }, // <v:Items> "-" => v // }; // Spanned<T>: (usize, usize) = { // <@L> T <@R> => (<>) // }; match { // The default whitespace skipping is disabled an `ignore pattern` is specified r"\s*" => { }, // Skip `// comments` r"//[^\n\r]*" => { }, // Skip `/* comments */` r"/\*([^\*]*\*+[^\*/])*([^\*]*\*+|[^\*])*\*/" => { }, _ } Spanned<T>: (usize, usize, T) = { <l:@L> <t:T> <r:@R> => (l, r, t) }; // A comma separated sequence without trailing comma CommaNoTrail<T>: Vec<T> = { <mut v:(<T> ",")*> <e:T> => { v.push(e); v } } pub NumSeq: Vec<(usize, usize, i32)> = { CommaNoTrail<Spanned<Num>>, } pub Num: i32 = { <n: r"[0-9]+"> => i32::from_str(n).unwrap(), }; Id: String = { r"(_|[a-z]|[A-Z])([a-z]|[A-Z]|[0-9]|_)*" => String::from_str(<>).unwrap(), };