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>