For-to-Nondeclaring-ForUsingTXL
Software Transformation Systems
TXL solution to
TIL Chairmarks #2.1, declaring "for" statement to nondeclaring "for" statement.
--
JamesCordy - 10 Oct 2005
File "TILfordeclare.Txl"
% TXL transformation to adapt existing "declaring for" semantics TIL programs
% to a proposed new semantics in which "for" control variables must be declared
% Jim Cordy, October 2005
% Note: In this program all keywords of TIL are quoted in patterns and replacements -
% this is not strictly necessary, but is conventional style in modern TXL programs.
% Based on the TIL base grammar
include "TIL.Grm"
% Preserve comments, we're probably going to maintain the result
include "TILCommentOverrides.Grm"
% Transformation rule to correct all for loops.
% Default rewrite rule semantics in TXL are compositional fixed point,
% which for most transformations is the desired semantics. However,
% this transformation has no syntactic compositional fixed point.
% So the alternatives are either a semantically-guarded transformation,
% a grammar override, or an explicit once-over traversal.
% This solution uses the last of these, not because it is the best solution
% but because this example gives us an opportunity to demonstrate that possibility.
function main
% This is a function transformer, so it applies only once unless explicitly
% reapplied. The "replace *" allows it to search deeply for its pattern.
% The replacement reapplies it twice to implement an explicit traversal.
replace * [statement*]
'for Id [id] := Expn1 [expression] 'to Expn2 [expression] 'do
Statements [statement*]
'end
MoreStatements [statement*]
by
'var Id;
'for Id := Expn1 'to Expn2 'do
Statements [main]
'end
MoreStatements [main]
end function
Example run:
<linux> cat multiples.til
// Test of declaring for loop in TIL
// Output first 10 multiples of numbers 1 through 9
for i := 1 to 9 do
for j := 1 to 10 do
write i*j;
end end
<linux> txl multiples.til TILfordeclare.Txl
TXL v10.4a (15.6.05) (c)1988-2005 Queen's University at Kingston
Compiling TILfordeclare.Txl ...
Parsing multiples.til ...
Transforming ...
// Test of declaring for loop in TIL
// Output first 10 multiples of numbers 1 through 9
var i;
for i := 1 to 9 do
var j;
for j := 1 to 10 do
write i * j;
end
end
<linux>