mirror of
https://github.com/KevinMidboe/linguist.git
synced 2025-10-29 17:50:22 +00:00
81 lines
1.3 KiB
Plaintext
81 lines
1.3 KiB
Plaintext
% Calculator.Txl - simple numerical expression evaluator
|
|
|
|
% Part I. Syntax specification
|
|
define program
|
|
[expression]
|
|
end define
|
|
|
|
define expression
|
|
[term]
|
|
| [expression] [addop] [term]
|
|
end define
|
|
|
|
define term
|
|
[primary]
|
|
| [term] [mulop] [primary]
|
|
end define
|
|
|
|
define primary
|
|
[number]
|
|
| ( [expression] )
|
|
end define
|
|
|
|
define addop
|
|
'+
|
|
| '-
|
|
end define
|
|
|
|
define mulop
|
|
'*
|
|
| '/
|
|
end define
|
|
|
|
|
|
% Part 2. Transformation rules
|
|
rule main
|
|
replace [expression]
|
|
E [expression]
|
|
construct NewE [expression]
|
|
E [resolveAddition] [resolveSubtraction] [resolveMultiplication]
|
|
[resolveDivision] [resolveParentheses]
|
|
where not
|
|
NewE [= E]
|
|
by
|
|
NewE
|
|
end rule
|
|
|
|
rule resolveAddition
|
|
replace [expression]
|
|
N1 [number] + N2 [number]
|
|
by
|
|
N1 [+ N2]
|
|
end rule
|
|
|
|
rule resolveSubtraction
|
|
replace [expression]
|
|
N1 [number] - N2 [number]
|
|
by
|
|
N1 [- N2]
|
|
end rule
|
|
|
|
rule resolveMultiplication
|
|
replace [term]
|
|
N1 [number] * N2 [number]
|
|
by
|
|
N1 [* N2]
|
|
end rule
|
|
|
|
rule resolveDivision
|
|
replace [term]
|
|
N1 [number] / N2 [number]
|
|
by
|
|
N1 [/ N2]
|
|
end rule
|
|
|
|
rule resolveParentheses
|
|
replace [primary]
|
|
( N [number] )
|
|
by
|
|
N
|
|
end rule
|