slj 0.6.6

Programski jezik v slovenščini | A programming language in Slovenian
Documentation
use super::*;

pub struct Argumenti {
    pub tipi: Vec<Tip>,
    pub spremenljivke: Vec<Rc<Vozlišče>>,
    pub argumenti: Vec<Rc<Vozlišče>>,
}

impl<'a> Parser<'a> {
    pub fn argumenti<'b>(&mut self, izraz: &'b[Token<'a>]) -> Result<Argumenti, Napake> where 'a: 'b {
        let mut napake = Napake::new();

        let mut tipi = Vec::new();
        let mut spremenljivke = Vec::new();
        let mut argumenti = Vec::new();
        let razdeljeno = razdeli(izraz, &[","])?;

        for argument in razdeljeno {
            match argument {
                [] => {
                    tipi.push(Tip::Brez);
                    argumenti.push(Prazno.rc());
                    spremenljivke.push(Prazno.rc());
                },
                [ Operator("@", ..), literal @ Literal(..) ]
                    | [ literal @ Literal(L::Niz(..)) ] => {
                    match self.drevo(&[*literal]) {
                        Ok(drevo) => {
                            let tip = drevo.tip();
                            let spr = self.dodaj_spremenljivko(self.naključno_ime(25), tip.clone());
                            let prirejanje = Prirejanje { spremenljivka: spr.clone(), izraz: drevo }.rc();

                            let referenca = match tip {
                                Tip::Seznam(..) => RefSeznama(spr).rc(),
                                _ => Referenca(spr).rc()
                            };

                            tipi.push(referenca.tip());
                            spremenljivke.push(prirejanje);
                            argumenti.push(referenca);
                        },
                        Err(n) => napake.razširi(n),
                    }
                },
                [ .. ] => {
                    match self.drevo(argument) {
                        Ok(drevo) => {
                            tipi.push(drevo.tip());
                            argumenti.push(drevo);
                            spremenljivke.push(Prazno.rc());
                        },
                        Err(n) => napake.razširi(n),
                    }
                },
            }
        }

        if napake.prazno() {
            Ok(Argumenti{ tipi, spremenljivke, argumenti })
        }
        else {
            Err(napake)
        }
    }
}