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(),
};