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.
-- Main.JamesCordy - 17 Aug 2005 (revised Main.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:_
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
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