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>