A simple parser typechecker embedded in Go to fulfill https://sulzmann.github.io/ProgrammingParadigms/projectExp.html#(2)
N ::= 0 | 1 | 2
B ::= true | false
V ::= N | B
E ::= V | (E) | E + E | E * E | E && E | E || E
N ::= 0 | 1 | 2
B ::= true | false
V ::= N | B
F ::= V | (EP)
EP ::= EP + EO | EO
EO ::= EO || EM | EM
EM ::= EM * EA | EA
EA ::= EA && F | F
N ::= 0 | 1 | 2
B ::= true | false
V ::= N | B
F ::= V | (EP)
EP ::= EO EP2
EP2 ::= + EO EP2 |
EO ::= EM EO2
EO2 ::= || EM EO2 |
EM ::= EA EM2
EM2 ::= * EA EM2 |
EA ::= F EA2
EA2 ::= && F EA2 |
The output of the examples consists of three lines:
- The input value is behind Original
- The parsed value is behind Parsed
- The inferred type
Original: 1
Parsed : 1
Int
Original: 1+0
Parsed : (1+0)
Int
Original: 1 * 2
Parsed : (1*2)
Int
Original: (1)
Parsed : 1
Int
Original: (1 * (2))
Parsed : (1*2)
Int
Original: (1 + 2) * 0
Parsed : ((1+2)*0)
Int
Original: true || false
Parsed : (true||false)
Bool
Original: 1+
Parsed : Syntax Error
Illtyped
Original: + 1
Parsed : Syntax Error
Illtyped
Original: (((1))
Parsed : Syntax Error
Illtyped
Original: tru
Parsed : Syntax Error
Illtyped
Original: fal
Parsed : Syntax Error
Illtyped
Original: true | false
Parsed : Syntax Error
Illtyped
Original: 1 + true
Parsed : (1+true)
Illtyped
Original: 2 * false
Parsed : (2*false)
Illtyped
Original: 1 || true
Parsed : (1||true)
Illtyped
Original: 1 && false
Parsed : (1&&false)
Illtyped