1use super::*;
2
3impl<'a> Parser<'a> {
4 pub fn drevo(&mut self, izraz: &[Token<'a>]) -> Result<Rc<Vozlišče>, Napake> {
5 self.logični(izraz)
6 }
7
8 fn logični(&mut self, izraz: &[Token<'a>]) -> Result<Rc<Vozlišče>, Napake> {
10 match loči_zadaj(izraz, &["||"]) {
11 Some(Ok((l_izraz, op, d_izraz))) => {
12 let l = self.logični(l_izraz)?;
13 let d = self.logični(d_izraz)?;
14 match (l.tip(), d.tip()) {
15 (Tip::Bool, Tip::Bool) => Ok(Disjunkcija(l, d).rc()),
16 _ => Err(Napake::from_zaporedje(&[*op], E5, &format!("Neveljavna tipa za operacijo: {} {} {}", l.tip(), op.as_str(), d.tip()))),
17 }
18 },
19 Some(Err(napaka)) => Err(napaka),
20 None => match loči_zadaj(izraz, &["&&"]) {
21 Some(Ok((l_izraz, op, d_izraz))) => {
22 let l = self.logični(l_izraz)?;
23 let d = self.logični(d_izraz)?;
24 match (l.tip(), d.tip()) {
25 (Tip::Bool, Tip::Bool) => Ok(Konjunkcija(l, d).rc()),
26 _ => Err(Napake::from_zaporedje(&[*op], E5, &format!("Neveljavna tipa za operacijo: {} {} {}", l.tip(), op.as_str(), d.tip()))),
27 }
28 },
29 Some(Err(napaka)) => Err(napaka),
30 None => self.bitni(izraz),
31 }
32 }
33 }
34
35 fn bitni(&mut self, izraz: &[Token<'a>]) -> Result<Rc<Vozlišče>, Napake> {
37 match loči_zadaj(izraz, &["|"]) {
38 Some(Ok((l_izraz, op, d_izraz))) => {
39 let l = self.bitni(l_izraz)?;
40 let d = self.bitni(d_izraz)?;
41 match (l.tip(), d.tip()) {
42 (Tip::Celo, Tip::Celo) => Ok(bitni_op(op.as_str())(l, d).rc()),
43 _ => Err(Napake::from_zaporedje(&[*op], E5, &format!("Neveljavna tipa za operacijo: {} {} {}", l.tip(), op.as_str(), d.tip()))),
44 }
45 },
46 Some(Err(napaka)) => Err(napaka),
47 None => match loči_zadaj(izraz, &["^"]) {
48 Some(Ok((l_izraz, op, d_izraz))) => {
49 let l = self.bitni(l_izraz)?;
50 let d = self.bitni(d_izraz)?;
51 match (l.tip(), d.tip()) {
52 (Tip::Celo, Tip::Celo) => Ok(bitni_op(op.as_str())(l, d).rc()),
53 _ => Err(Napake::from_zaporedje(&[*op], E5, &format!("Neveljavna tipa za operacijo: {} {} {}", l.tip(), op.as_str(), d.tip()))),
54 }
55 },
56 Some(Err(napaka)) => Err(napaka),
57 None => match loči_zadaj(izraz, &["&"]) {
58 Some(Ok((l_izraz, op, d_izraz))) => {
59 let l = self.bitni(l_izraz)?;
60 let d = self.bitni(d_izraz)?;
61 match (l.tip(), d.tip()) {
62 (Tip::Celo, Tip::Celo) => Ok(bitni_op(op.as_str())(l, d).rc()),
63 _ => Err(Napake::from_zaporedje(&[*op], E5, &format!("Neveljavna tipa za operacijo: {} {} {}", l.tip(), op.as_str(), d.tip()))),
64 }
65 },
66 Some(Err(napaka)) => Err(napaka),
67 None => match loči_zadaj(izraz, &["<<", ">>"]) {
68 Some(Ok((l_izraz, op, d_izraz))) => {
69 let l = self.bitni(l_izraz)?;
70 let d = self.bitni(d_izraz)?;
71 match (l.tip(), d.tip()) {
72 (Tip::Celo, Tip::Celo) => Ok(bitni_op(op.as_str())(l, d).rc()),
73 _ => Err(Napake::from_zaporedje(&[*op], E5, &format!("Neveljavna tipa za operacijo: {} {} {}", l.tip(), op.as_str(), d.tip()))),
74 }
75 },
76 Some(Err(napaka)) => Err(napaka),
77 None => self.primerjalni(izraz),
78 }
79 }
80 }
81 }
82 }
83
84 pub fn primerjalni(&mut self, izraz: &[Token<'a>]) -> Result<Rc<Vozlišče>, Napake> {
86 match loči_zadaj(izraz, PRIMERJALNI_OP.as_slice()) {
87 Some(Ok((l_izraz, op, d_izraz))) => {
88 let l = self.primerjalni(l_izraz)?;
89 let d = self.primerjalni(d_izraz)?;
90 match (l.tip(), d.tip()) {
91 (Tip::Celo, Tip::Celo) => Ok(primerjalni_op(op.as_str()).unwrap()(Tip::Celo, l, d).rc()),
92 (Tip::Znak, Tip::Znak) => Ok(primerjalni_op(op.as_str()).unwrap()(Tip::Celo, ZnakVCelo(l).rc(), ZnakVCelo(d).rc()).rc()),
93 (Tip::Real, Tip::Real) => Ok(primerjalni_op(op.as_str()).unwrap()(Tip::Real, l, d).rc()),
94 _ => Err(Napake::from_zaporedje(&[*op], E5, &format!("Nemogoča operacija: {} {} {}", l.tip(), op.as_str(), d.tip()))),
95 }
96 },
97 Some(Err(napaka)) => Err(napaka),
98 None => self.aditivni(izraz)
99 }
100 }
101
102 fn aditivni(&mut self, izraz: &[Token<'a>]) -> Result<Rc<Vozlišče>, Napake> {
105 match loči_zadaj(izraz, &["+", "-"]) {
106 Some(Ok(([], Operator("-", ..), ..))) => self.aritmetični(izraz),
108 Some(Ok((pred @ [.., Operator(..)], minus @ Operator("-", ..), za @ [..]))) =>
109 self.aditivni([pred, [Ločilo("(", 0, 0), *minus].as_slice(), za, [Ločilo(")", 0, 0)].as_slice()].concat().as_slice()),
110
111 Some(Ok((l_izraz, op, d_izraz))) => {
113 let l = self.aritmetični(l_izraz)?;
114 let d = self.aritmetični(d_izraz)?;
115 match (l.tip(), d.tip()) {
116 (Tip::Celo, Tip::Celo) => Ok(aritmetični_op(op.as_str())(Tip::Celo, l, d).rc()),
117 (Tip::Real, Tip::Real) => Ok(aritmetični_op(op.as_str())(Tip::Real, l, d).rc()),
118 _ => Err(Napake::from_zaporedje(&[*op], E5, &format!("Nemogoča operacija: {} {} {}", l.tip(), op.as_str(), d.tip()))),
119 }
120 },
121 Some(Err(napaka)) => Err(napaka),
122 None => self.aritmetični(izraz),
123 }
124 }
125
126 fn aritmetični(&mut self, izraz: &[Token<'a>]) -> Result<Rc<Vozlišče>, Napake> {
127 match loči_zadaj(izraz, &["*", "/", "%"]) {
128 Some(Ok((l_izraz, op, d_izraz))) => {
129 let l = self.aritmetični(l_izraz)?;
130 let d = self.aritmetični(d_izraz)?;
131 match (l.tip(), d.tip()) {
132 (Tip::Celo, Tip::Celo) => Ok(aritmetični_op(op.as_str())(Tip::Celo, l, d).rc()),
133 (Tip::Real, Tip::Real) => Ok(aritmetični_op(op.as_str())(Tip::Real, l, d).rc()),
134 _ => Err(Napake::from_zaporedje(&[*op], E5, &format!("Nemogoča operacija: {} {} {}", l.tip(), op.as_str(), d.tip()))),
135 }
136 },
137 Some(Err(napaka)) => Err(napaka),
138 None => match loči_zadaj(izraz, &["**"]) {
139 Some(Ok((l_izraz, op, d_izraz))) => {
140 let l = self.aritmetični(l_izraz)?;
141 let d = self.aritmetični(d_izraz)?;
142 match (l.tip(), d.tip()) {
143 (Tip::Celo, Tip::Celo) => Ok(aritmetični_op(op.as_str())(Tip::Celo, l, d).rc()),
144 (Tip::Real, Tip::Real) => Ok(aritmetični_op(op.as_str())(Tip::Real, l, d).rc()),
145 _ => Err(Napake::from_zaporedje(&[*op], E5, &format!("Nemogoča operacija: {} {} {}", l.tip(), op.as_str(), d.tip()))),
146 }
147 },
148 Some(Err(napaka)) => Err(napaka),
149 None => self.osnovni(izraz),
150 }
151 }
152 }
153
154 pub fn osnovni(&mut self, izraz: &[Token<'a>]) -> Result<Rc<Vozlišče>, Napake> {
155 match izraz {
156 [ Literal(L::Bool("resnica", ..)) ] => Ok(Resnica.rc()),
158 [ Literal(L::Bool("laž", ..)) ] => Ok(Laž.rc()),
159 [ Literal(L::Celo(število, ..)) ] => Ok(Vozlišče::Celo(število.replace("_", "").parse().unwrap()).rc()),
161 [ Literal(L::Real(število, ..)) ] => Ok(Vozlišče::Real(število.replace("_", "").parse().unwrap()).rc()),
162 [ Operator("-", ..), Literal(L::Celo(str, ..)) ] => Ok(Vozlišče::Celo(-str.replace("_", "").parse::<i32>().unwrap()).rc()),
163 [ Operator("-", ..), Literal(L::Real(str, ..)) ] => Ok(Vozlišče::Real(-str.replace("_", "").parse::<f32>().unwrap()).rc()),
164 [ Literal(L::Znak(str, ..)) ] => Ok(Vozlišče::Znak(interpoliraj_niz(&str[1..str.len()-1]).chars().nth(0).unwrap()).rc()),
166 [ Literal(L::Niz(niz, ..)) ] => Ok(Vozlišče::Niz(interpoliraj_niz(&niz[1..niz.len()-1])).rc()),
168 [ Ločilo("(", ..), ostanek @ .., Ločilo(")", ..) ] => self.drevo(ostanek),
170 [ Ime("asm", ..), Ločilo("(", ..), argumenti @ .., Ločilo(")", ..) ] => self.asm(argumenti),
172 [ ime @ Ime(..), Ločilo("(", ..), argumenti @ .., Ločilo(")", ..) ] => self.funkcijski_klic(ime, argumenti),
174 [ izraz @ .., Operator("kot", ..), tip @ Tip(..) ] => self.pretvorba(izraz, tip),
176 [ Operator("!", ..), ostanek @ .. ] => {
178 let drevo = self.drevo(ostanek)?;
179 match drevo.tip() {
180 Tip::Bool => Ok(Zanikaj(drevo).rc()),
181 _ => Err(Napake::from_zaporedje(izraz, E9, "Zanikati je mogoče samo Boolove vrednosti"))
182 }
183 },
184 [ Operator("-", ..), ostanek @ .. ] => {
186 let drevo = self.drevo(ostanek)?;
187 match drevo.tip() {
188 Tip::Celo => Ok(Odštevanje(Tip::Celo, Celo(0).rc(), drevo).rc()),
189 Tip::Real => Ok(Odštevanje(Tip::Real, Celo(0).rc(), drevo).rc()),
190 _ => Err(Napake::from_zaporedje(ostanek, E9, "Izraza ni mogoče negirati"))
191 }
192 },
193 [ ime @ Ime(..) ] => Ok(self.spremenljivke.get(ime.as_str())
195 .ok_or(Napake::from_zaporedje(&[*ime], E2, "Neznana spremenljivka"))?.clone()),
196
197 [ Operator("@", ..), ime @ Ime(..) ] => {
199 let spremenljivka = self.spremenljivke.get(ime.as_str())
200 .ok_or(Napake::from_zaporedje(&[*ime], E2, "Neznana spremenljivka"))?.clone();
201
202 match spremenljivka.tip() {
203 Tip::Seznam(..) => Ok(RefSeznama(spremenljivka).rc()),
204 _ => Ok(Referenca(spremenljivka).rc())
205 }
206 }
207
208 deref @ [ ime @ Ime(..), Operator("@", ..) ] => {
210 let referenca = self.spremenljivke.get(ime.as_str())
211 .ok_or(Napake::from_zaporedje(&[*ime], E2, "Neznana spremenljivka"))?;
212
213 match &**referenca {
214 Spremenljivka { tip, .. } => match &*tip {
215 Tip::Referenca(..) => Ok(Dereferenciraj(referenca.clone()).rc()),
216 _ => Err(Napake::from_zaporedje(deref, E2, "Dereferenciramo lahko samo referenco.")),
217 },
218 _ => Err(Napake::from_zaporedje(deref, E2, "Dereferenciramo lahko samo spremenljivko.")),
219 }
220 }
221
222 [ ime @ Ime(..), Ločilo("[", ..), indeks @ .., Ločilo("]", ..) ] => {
224 let indeks = self.drevo(indeks)?.rc();
225 let spremenljivka = self.spremenljivke.get(ime.as_str())
226 .ok_or(Napake::from_zaporedje(&[*ime], E2, "Neznana spremenljivka"))?;
227
228 match &**spremenljivka {
229 Spremenljivka { tip: Tip::Seznam(..), .. } =>
230 Ok(Indeksiraj{ seznam_ref: RefSeznama(spremenljivka.clone()).rc(), indeks }.rc()),
231 Spremenljivka { tip: Tip::RefSeznama(..), .. } =>
232 Ok(Indeksiraj{ seznam_ref: spremenljivka.clone(), indeks }.rc()),
233 _ => Err(Napake::from_zaporedje(izraz, E2,
234 &format!("V spremenljivko tipa '{}' ni mogoče indeksirati.", spremenljivka.tip()))),
235 }
236 }
237
238 [ ime @ Ime(..), Ločilo(".", ..), Ime("dolžina", ..) ] => {
239 let spremenljivka = self.spremenljivke.get(ime.as_str())
240 .ok_or(Napake::from_zaporedje(&[*ime], E2, "Neznana spremenljivka"))?;
241
242 match spremenljivka.tip() {
243 Tip::Seznam(..) => Ok(Dolžina(spremenljivka.clone()).rc()),
244 Tip::RefSeznama(..) => Ok(Dolžina(spremenljivka.clone()).rc()),
245 _ => Err(Napake::from_zaporedje(&[*ime], E2,
246 &format!("Tip '{}' nima dolžine", spremenljivka.tip())))
247 }
248 },
249
250 [ neznano @ Neznano(..) ] => Err(Napake::from_zaporedje(&[*neznano], E1, "Neznana beseda")),
251 [] => Ok(Prazno.rc()),
252 _ => Err(Napake::from_zaporedje(izraz, E1,
253 &format!("Neznan izraz: {}", izraz.iter().map(|t| t.as_str()).collect::<Vec<&str>>().join(" "))))
254 }
255 }
256
257 fn pretvorba(&mut self, izraz: &[Token<'a>], tip_ven_izraz: &Token) -> Result<Rc<Vozlišče>, Napake> {
258 let drevo = self.drevo(izraz)?.rc();
259 let tip_noter = drevo.tip();
260 let tip_ven = Tip::from(&[*tip_ven_izraz])?;
261
262 match (tip_noter.clone(), tip_ven.clone()) {
263 (Tip::Real, Tip::Celo) => Ok(RealVCelo(drevo).rc()),
264 (Tip::Celo, Tip::Real) => Ok(CeloVReal(drevo).rc()),
265 (Tip::Celo, Tip::Znak) => Ok(CeloVZnak(drevo).rc()),
266 (Tip::Znak, Tip::Celo) => Ok(ZnakVCelo(drevo).rc()),
267 (a, b) if a == b => Ok(drevo),
268 _ => Err(Napake::from_zaporedje(&[*tip_ven_izraz], E1,
269 &format!("Tipa {} ni mogoče pretvoriti v {}", tip_noter, tip_ven)))
270 }
271 }
272
273 fn asm(&self, izraz: &[Token<'a>]) -> Result<Rc<Vozlišče>, Napake> {
274 let niz = match izraz {
275 [ Literal(L::Niz(niz, ..)) ] => &niz[1..niz.len()-1],
276 _ => Err(Napake::from_zaporedje(izraz, E5, "Funkcija 'asm' sprejema samo nize"))?,
277 };
278
279 match niz {
280 "GETC" => Ok(Preberi.rc()),
281 _ => Err(Napake::from_zaporedje(izraz, E1,
282 &format!("Neznan ukaz: {niz}")))
283 }
284 }
285}
286
287#[cfg(test)]
288mod testi {
289 use std::rc::Rc;
290
291 use crate::parser::tokenizer::Tokenize;
292
293 use super::*;
294
295 #[test]
296 fn osnovni() {
297 let mut parser = Parser::new();
298 assert_eq!(parser.osnovni([ Literal(L::Bool("resnica", 1, 1))].as_slice()).unwrap(), Resnica.rc());
299 assert_eq!(parser.osnovni([ Literal(L::Bool("laž", 1, 1))].as_slice()).unwrap(), Laž.rc());
300 assert_eq!(parser.osnovni([ Operator("!", 1, 1), Literal(L::Bool("laž", 1, 2))].as_slice()).unwrap(), Zanikaj(Laž.rc()).rc());
301 assert_eq!(parser.osnovni([ Ločilo("(", 1, 1), Literal(L::Bool("laž", 1, 2)), Ločilo(")", 1, 5)].as_slice()).unwrap(), Laž.rc());
302 assert_eq!(parser.osnovni([ Literal(L::Celo("3", 1, 1))].as_slice()).unwrap(), Celo(3).rc());
303 assert_eq!(parser.osnovni([ Literal(L::Real("3.125", 1, 1))].as_slice()).unwrap(), Real(3.125).rc());
304 assert_eq!(parser.osnovni([ Literal(L::Celo("1_000", 1, 1))].as_slice()).unwrap(), Celo(1000).rc());
305 assert_eq!(parser.osnovni([ Literal(L::Znak("'đ'", 1, 1))].as_slice()).unwrap(), Znak('đ').rc());
306 assert_eq!(parser.osnovni([ Literal(L::Niz("\"angleščina\\n\"", 1, 1))].as_slice()).unwrap(), Niz("angleščina\n".to_string()).rc());
307
308 parser.funkcije.insert("fun()".to_string(), Funkcija {
309 tip: Tip::Real,
310 ime: "fun".to_string(),
311 parametri: vec![],
312 telo: Zaporedje(vec![
313 Vrni(Prirejanje {
314 spremenljivka: Spremenljivka { tip: Tip::Real, ime: "vrni".to_string(), naslov: 0, z_odmikom: true }.rc(),
315 izraz: Real(1.0).rc(),
316 }.rc()).rc()
317 ]).rc(),
318 prostor: 0,
319 }.rc());
320 assert_eq!(parser.osnovni([ Ime("fun", 1, 1), Ločilo("(", 1, 4), Ločilo(")", 1, 5)].as_slice()).unwrap(), FunkcijskiKlic {
321 funkcija: parser.funkcije["fun()"].clone(),
322 spremenljivke: Zaporedje(vec![]).rc(),
323 argumenti: Zaporedje([].to_vec()).rc(),
324 }.rc());
325
326 parser.spremenljivke.insert("a".to_string(), Rc::new(Spremenljivka { tip: Tip::Celo, ime: "a".to_string(), naslov: 0, z_odmikom: false }));
327 assert_eq!(parser.osnovni([ Ime("a", 1, 1)].as_slice()).unwrap(), parser.spremenljivke["a"].clone());
328 }
329
330 #[test]
331 fn pretvorba() {
332 let mut parser = Parser::new();
333 assert_eq!(parser.drevo([ Literal(L::Celo("3", 1, 1)), Operator("kot", 1, 3), Tip("real", 1, 7) ].as_slice()).unwrap(),
334 CeloVReal(Celo(3).rc()).rc());
335 assert_eq!(parser.drevo([ Literal(L::Real("3.0", 1, 1)), Operator("kot", 1, 3), Tip("celo", 1, 7) ].as_slice()).unwrap(),
336 RealVCelo(Real(3.0).rc()).rc());
337 assert_eq!(parser.drevo([ Literal(L::Real("3.0", 1, 1)), Operator("kot", 1, 3), Tip("real", 1, 7) ].as_slice()).unwrap(),
338 Real(3.0).rc());
339 }
340
341 #[test]
342 fn aritmetični() {
343 let mut parser = Parser::new();
344 assert_eq!(parser.drevo([ Literal(L::Celo("3", 1, 1)), Operator("+", 1, 2), Literal(L::Celo("2", 1, 3)) ].as_slice()).unwrap(),
345 Seštevanje(Tip::Celo, Celo(3).rc(), Celo(2).rc()).rc());
346 assert_eq!(parser.drevo([ Literal(L::Celo("3", 1, 1)), Operator("-", 1, 2), Literal(L::Celo("2", 1, 3)) ].as_slice()).unwrap(),
347 Odštevanje(Tip::Celo, Celo(3).rc(), Celo(2).rc()).rc());
348 assert_eq!(parser.drevo([ Literal(L::Celo("3", 1, 1)), Operator("*", 1, 2), Literal(L::Celo("2", 1, 3)) ].as_slice()).unwrap(),
349 Množenje(Tip::Celo, Celo(3).rc(), Celo(2).rc()).rc());
350 assert_eq!(parser.drevo([ Literal(L::Celo("3", 1, 1)), Operator("/", 1, 2), Literal(L::Celo("2", 1, 3)) ].as_slice()).unwrap(),
351 Deljenje(Tip::Celo, Celo(3).rc(), Celo(2).rc()).rc());
352 assert_eq!(parser.drevo([ Literal(L::Celo("3", 1, 1)), Operator("%", 1, 2), Literal(L::Celo("2", 1, 3)) ].as_slice()).unwrap(),
353 Modulo(Tip::Celo, Celo(3).rc(), Celo(2).rc()).rc());
354 assert_eq!(parser.drevo([ Literal(L::Celo("3", 1, 1)), Operator("**", 1, 2), Literal(L::Celo("2", 1, 4)) ].as_slice()).unwrap(),
355 Potenca(Tip::Celo, Celo(3).rc(), Celo(2).rc()).rc());
356
357 assert_eq!(parser.drevo("-(3-4)".tokenize().as_slice()).unwrap(), Odštevanje(Tip::Celo, Celo(0).rc(), Odštevanje(Tip::Celo, Celo(3).rc(), Celo(4).rc()).rc()).rc());
358 assert_eq!(parser.drevo("-3".tokenize().as_slice()).unwrap(), Celo(-3).rc());
359 assert_eq!(parser.drevo("-3 * 2".tokenize().as_slice()).unwrap(), Množenje(Tip::Celo, Celo(-3).rc(), Celo(2).rc()).rc());
360 assert_eq!(parser.drevo("3 * -2".tokenize().as_slice()).unwrap(), Množenje(Tip::Celo, Celo(3).rc(), Celo(-2).rc()).rc());
361 assert_eq!(parser.drevo("--1".tokenize().as_slice()).unwrap(), Odštevanje(Tip::Celo, Celo(0).rc(), Celo(-1).rc()).rc());
362 assert_eq!(parser.drevo("2 + -1".tokenize().as_slice()).unwrap(), Seštevanje(Tip::Celo, Celo(2).rc(), Celo(-1).rc()).rc());
363 }
364
365 #[test]
366 fn primerjalni() {
367 let mut parser = Parser::new();
368 assert_eq!(parser.primerjalni([ Literal(L::Celo("3", 1, 1)), Operator("==", 1, 2), Literal(L::Celo("2", 1, 3)) ].as_slice()).unwrap(),
369 Enako(Tip::Celo, Celo(3).rc(), Celo(2).rc()).rc());
370 assert_eq!(parser.primerjalni([ Literal(L::Celo("3", 1, 1)), Operator("!=", 1, 2), Literal(L::Celo("2", 1, 3)) ].as_slice()).unwrap(),
371 NiEnako(Tip::Celo, Celo(3).rc(), Celo(2).rc()).rc());
372 assert_eq!(parser.primerjalni([ Literal(L::Celo("3", 1, 1)), Operator("<=", 1, 2), Literal(L::Celo("2", 1, 3)) ].as_slice()).unwrap(),
373 ManjšeEnako(Tip::Celo, Celo(3).rc(), Celo(2).rc()).rc());
374 assert_eq!(parser.primerjalni([ Literal(L::Celo("3", 1, 1)), Operator(">=", 1, 2), Literal(L::Celo("2", 1, 3)) ].as_slice()).unwrap(),
375 VečjeEnako(Tip::Celo, Celo(3).rc(), Celo(2).rc()).rc());
376 assert_eq!(parser.primerjalni([ Literal(L::Celo("3", 1, 1)), Operator("<", 1, 2), Literal(L::Celo("2", 1, 3)) ].as_slice()).unwrap(),
377 Manjše(Tip::Celo, Celo(3).rc(), Celo(2).rc()).rc());
378 assert_eq!(parser.primerjalni([ Literal(L::Celo("3", 1, 1)), Operator(">", 1, 2), Literal(L::Celo("2", 1, 4)) ].as_slice()).unwrap(),
379 Večje(Tip::Celo, Celo(3).rc(), Celo(2).rc()).rc());
380 }
381}