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.
--
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:
<linux> 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
<linux> 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
<linux>