In TXL, all parsers are also pretty printers, so see the
TIL Parser Using TXL if comments are not an issue. Because the TXL solution to preserving formatting and comments in a transformation is
Source Factoring, comments are not normally handled using TXL itself.
However, in TXL it is also possible to handle comments by parsing them, either as disciplined comments (those appearing in predicted places, which of course is possible using any system), or using
Robust Parsing techniques.
TXL allows for the addition of disciplined comments to an existing base grammar using
Grammar Overrides. The example below is based on the TXL base grammar for TIL given on the
TIL Parser Using TXL page, and implements a pretty printer for TIL with discplined comment handling.
--
JamesCordy - 17 Aug 2005 (revised
JamesCordy - 10 Oct 2005)
File "TILpretty.Txl"
% TXL parser / pretty-printer for Tiny Imperative Language,
% with disciplined comment handling
include "TIL.Grm"
#define COMMENTS
% Add optional grammar overrides for disciplined end-of-line comments
% in the C++ style. You can either control this either by commenting/uncommenting
% the #define above, or by using -d COMMENTS on the TXL command line
#if COMMENTS then
include "TILCommentOverrides.Grm"
#end if
% No need to do anything except recognize the input, since the grammar
% includes the formatting cues
function main
match [program]
_ [program]
end function
File "TILCommentOverrides.Grm"
% Grammar overrides to allow for disciplined TIL comments in the C++ style.
% (Handling more general undisciplined comments is more complicated,
% see the TXL C grammar.)
#pragma -comment
comments
//
end comments
redefine statement
...
| [comment_statement]
end redefine
define comment_statement
[repeat comment_NL+]
end define
define comment_NL
[comment] [NL]
end define
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
// Got one - print it!
write f; n := n / f;
end
f := f + 1;
end
<linux> txl factors.til TILpretty.Txl
TXL v10.4a (15.6.05) (c)1988-2005 Queen's University at Kingston
Compiling TILpretty.Txl ...
Parsing factors.til ...
Transforming ...
// 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
// Got one - print it!
write f;
n := n / f;
end
f := f + 1;
end
<linux>