fickle is a Tcl utility that generates Tcl code, much like flex does for C code. From the README:
This is a scanner generator program much like flex(1) is to C. If you have no desire to author Tcl programs, particularly those that manipulate text, fickle is not for you. A passing knowledge of flex or some other lex-like program would be useful as that fickle uses nearly identical syntax and commands as flex. Two good references are the flex(1) man page and the O'Reilly book 'lex & yacc' by Levine, Mason, and Brown.
The fickle package comes with a bunch of example files derived from lex & yacc[L1 ]. One example I wrote is tsa, a Tcl source code analyzer. It tries to calculate source lines of code (sloc).
fickle 2.0 is a near complete rewrite of the previous one. It is much faster than before and supports many more of flex's features. New capabilities include yy_flex_debug, yylineno, and embedded comments. Other features of fickle are:
A full list of features is available from the README[L2 ].
Download fickle from below:
fickle is protected by the GNU general public license.
For heavy-duty parsing needs one ought to use a syntax analyzer such as taccle.
Invoke fickle before running the program much akin to using flex:
> tclsh fickle.tcl foo.fcl > tclsh foo.tcl
whereas with flex it would be:
> flex foo.f > gcc -o foo lex.yy.c -lfl > ./foo
For comparison purposes here is a fickle specification file to match some English verbs:
# Recognizes various English verbs in sentences. # This is based upon example 'ch1-02.l' from "lex & yacc" by John # R. Levine, Tony Mason, and Doug Brown (by O'Reilly & Associates, ISBN # 1-56592-000-7). For more information on using lex and yacc, see # http://www.oreilly.com/catalog/lex/. %{ #!/usr/bin/tclsh %} %% [\t ]+ # ignore whitespace is | am | are | were | was | will puts "$yytext: is a verb" [a-zA-Z]+ puts "$yytext: is not a verb" .|\n ECHO ;# normal default anyway %% yylex
And the equivalent flex version:
%{ /* * this sample demonstrates (very) simple recognition: * a verb/not a verb. this example derived from 'ch1-02.l'. */ %} %% [\t ]+ /* ignore whitespace */ is | am | are | were | was | will { printf ("%s: is a verb\n", yytext); } [a-zA-Z]+ { printf ("%s: is not a verb\n", yytext); } .|\n { ECHO; /* normal default anyway */ } %% main() { yylex(); }
Return to Jason Tang