Actually several packages: * grammar::peg - Construction and manipulation of parsing expression grammars * grammar::peg::interp - Interpreter for parsing expression grammars. Documentation: * http://tcllib.sourceforge.net/doc/peg.html * http://tcllib.sourceforge.net/doc/peg_interp.html ---- 3-9-8: I hope the following may help others who are trying to use the "grammar::peg" package. These were tested under "etcl" (Evolane Tcl/Tk Engine Version 1.0-rc26 See http://wiki.tcl.tk/15260 ). ====== 1% # For now, just load the 'grammar::peg^ package 2% package require grammar::peg 0.1 3% #initialize a new (abeit empty) grammar. The start symbol will be, by default, 'epsilon^. 4% grammar::peg myGrammar ::myGrammar 5% # add a nonterminal to it 6% ::myGrammar nonterminal add myDigit {/ {t 0} {t 1} {t 2}} 7% # show its serialization 8% ::myGrammar serialize grammar::pegc {myDigit {/ {t 0} {t 1} {t 2}}} {myDigit value} epsilon 9% # change the start symbol to the nonterminal 'myDigit^ 10% ::myGrammar start {/ {n myDigit}} 11% # show its serialization 12% ::myGrammar serialize grammar::pegc {myDigit {/ {t 0} {t 1} {t 2}}} {myDigit value} {/ {n myDigit}} 13% # Now we show how you could, instead, have started with a list representing 14% # the grammar. Since "myGrammar" exists, we will make "myGrammarFromList". 15% package require struct::list 1.6.1 16% # (Incidentally, Andreas Kupries states: 'struct::list' is a package in Tcllib, like grammar::peg, and 17% # guesses that grammar::peg forgot to 'package require' it.) 18% set mySerialization [list grammar::pegc \ > {myDigit {/ {t 0} {t 1} {t 2}}} {myDigit value} {/ {n myDigit}} \ > ] grammar::pegc {myDigit {/ {t 0} {t 1} {t 2}}} {myDigit value} {/ {n myDigit}} 19% grammar::peg myGrammarFromList deserialize $mySerialization ::myGrammarFromList 20% # Next we attempt to use (interpret) the grammar on an input string. 21% #Load all relevant packages (this may be overkill) 22% set pattern {grammar::me|grammar::peg}; foreach packageName [package names] {if [regexp $pattern $packageName] {puts "[catch {package require $packageName}] $packageName"}} 0 grammar::peg::interp 0 grammar::peg 0 grammar::me::tcl 0 grammar::me::cpu 0 grammar::me::util 0 grammar::me::cpu::core 0 grammar::me::cpu::gasm 23% # Initialize the interpreter. 24% grammar::peg::interp::setup ::myGrammar 25% # As of 3-9-8, that's as far as I have gotten. The documentation at http://tcllib.sourceforge.net/doc/peg_interp.html 26% # suggests using 27% # ::grammar::peg::interp::parse nextcmd errorvar astvar 28% #" which "interprets the loaded grammar and tries to match it against the stream of characters represented by the command prefix nextcmd". 29% # so I put the string "102" in "myFile.txt" and tried the following, but, as you can see, was unsuccessful. 30% set f [open c:/myFile.txt r+] file37bf6c8 31% chan configure $f -encoding cp1252 32% set offset 0 0 33% ::grammar::peg::interp::parse $f myErrorVar myAstVar invalid command name "file37bf6c8" 34% chan close $f ====== ---- [[ [Category Package], a part of [Tcllib] | [Category Parsing] ]]