summaryrefslogtreecommitdiff
path: root/chomp-bench/src/arith/lalr.lalrpop
blob: fe21d012d0ec32e529473b4c2604b7d3706c7899 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
use std::str::FromStr;

grammar;

pub Expression: i64 = {
    <p : Product> <v : (<AddOp> <Product>)*> => {
        v.into_iter().fold(p, |acc, (op, p)| if op { acc + p } else { acc - p })
    }
}

AddOp: bool = {
    "+" => true,
    "-" => false,
}

Product: i64 = {
    <t : Term> <v : (<MulOp> <Term>)*> => {
        v.into_iter().fold(t, |acc, (op, t)| if op { acc * t } else { acc / t })
    }
}

MulOp: bool = {
    "*" => true,
    "/" => false,
}

Term: i64 = {
    Number,
    "-" <Number> => -<>,
    "(" <Expression> ")",
}

Number: i64 = r"[0-9]+" => i64::from_str(<>).unwrap();