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
 |