Statement Statistics Using TXL
Software Transformation Systems
TXL solution to
TIL Chairmarks #4.2: Collecting statement statistics.
--
JamesCordy - 28 Oct 2005
File "TILstats.Txl"
% Gather statement statistics for a Tiny Imperative Language program
% Jim Cordy, October 2005
% Gathers and outputs statistics on the number of each kind of statement
% in a program. Replaces the program itself with an empty one.
% Begin with the TIL base grammar
include "TIL.Grm"
% Compute and output statement kind statistics, replace program with an empty one.
% There are many different ways to do this - this naive way is simple and
% obvioulsy correct, but exposes TXL's need for generics.
% Another less clear solution could use polymorphism to avoid the repetition.
function main
replace [program]
Program [program]
% Count each kind of statement we're interested in
% by extracting all of each kind from the program
construct Statements [statement*]
_ [^ Program]
construct StatementCount [number]
_ [length Statements] [putp "Total: %"]
construct Declarations [declaration*]
_ [^ Program]
construct DeclarationsCount [number]
_ [length Declarations] [putp "Declarations: %"]
construct Assignments [assignment_statement*]
_ [^ Program]
construct AssignmentsCount [number]
_ [length Assignments] [putp "Assignments: %"]
construct Ifs [if_statement*]
_ [^ Program]
construct IfCount [number]
_ [length Ifs] [putp "Ifs: %"]
construct Whiles [while_statement*]
_ [^ Program]
construct WhileCount [number]
_ [length Whiles] [putp "Whiles: %"]
construct Fors [for_statement*]
_ [^ Program]
construct ForCount [number]
_ [length Fors] [putp "Fors: %"]
construct Reads [read_statement*]
_ [^ Program]
construct ReadCount [number]
_ [length Reads] [putp "Reads: %"]
construct Writes [write_statement*]
_ [^ Program]
construct WriteCount [number]
_ [length Writes] [putp "Writes: %"]
by
% nothing
end function
Example run:
<linux> cat factors.til
// Factor an input number
var n;
write "Input n please";
read n;
write "The factors of n are";
var f;
f := 2;
while n != 1 do
while (n / f) * f = n do
write f;
n := n / f;
end
f := f + 1;
end
<linux> txl factors.til TILstats.Txl
TXL v10.4a (15.6.05) (c)1988-2005 Queen's University at Kingston
Compiling TILstats.Txl ...
Parsing factors.til ...
Transforming ...
Total: 11
Declarations: 2
Assignments: 3
Ifs: 0
Whiles: 2
Fors: 0
Reads: 1
Writes: 3
<linux>