A TXL solution to [[TIL Chairmarks]] #1.3, the begin-end syntax extension for the [[Tiny Imperative Language]].
TXL is designed for implementing language extensions, so adding a new syntactic feature is simple in TXL using [[Grammar Overrides]]. The "..." in the "redefine" is not a shorthand in this example, rather a language feature of TXL that denotes an extension to the existing nonterminal alternatives.
Since there is no semantics for begin-end in TIL, we don't add any transform for this yet.
-- Main.JamesCordy - 10 Oct 2005
_File "TILbeginparser.Txl"_
% TXL parser for begin-end language extenssion to Tiny Imperative Language
% Jim Cordy, October 2005
% Begin with the standard TIL grammar
include "TIL.Grm"
% Add begin-end statements using grammar overrides
redefine statement
... % refers to all existing forms for [statement]
| [begin_statement] % add alternative for our new form
end redefine
define begin_statement
'begin [IN][NL]
[statement*] [EX]
'end [NL]
end define
% No need to do anything except recognize the input, since the grammar
% includes the output formatting cues
function main
match [program]
_ [program]
end function
_Example run:_
cat begintest.til
// Factor an input number
begin
var n;
write "Input n please"; read n;
write "The factors of n are";
begin
var f; f := 2;
while n != 1 do
while (n / f) * f = n do
// Got one - print it!
write f;
n := n / f;
end
f := f + 1;
end end end
txl begintest.til TILbeginparser.Txl
TXL v10.4a (15.6.05) (c)1988-2005 Queen's University at Kingston
Compiling TILbeginparser.Txl ...
Parsing begintest.til ...
Transforming ...
begin
var n;
write "Input n please";
read n;
write "The factors of n are";
begin
var f;
f := 2;
while n != 1 do
while (n / f) * f = n do
write f;
n := n / f;
end
f := f + 1;
end
end
end