parse_peghb.tcl

Go to the documentation of this file.
00001 /*  -*- tcl -*-*/
00002 /* */
00003 /*  Copyright (c) 2005 by Andreas Kupries <andreas_kupries@users.sourceforge.net>*/
00004 /*  Parser Generator / Frontend - Read halfbaked PEG container.*/
00005 
00006 /*  ### ### ### ######### ######### #########*/
00007 /*  Requisites*/
00008 
00009 namespace ::page::parse::peghb {
00010     variable fixup {}
00011     variable definitions
00012 }
00013 
00014 /*  ### ### ### ######### ######### #########*/
00015 /*  API*/
00016 
00017 ret  ::page::parse::peghb (type halfbaked , type t) {
00018     variable peghb::fixup
00019     variable peghb::definitions
00020     array set definitions {}
00021 
00022     set fixup {}
00023 
00024     interp create -safe sb
00025     # Should remove everything.
00026     interp alias  sb Start  {} ::page::parse::peghb::Start  $t
00027     interp alias  sb Define {} ::page::parse::peghb::Define $t
00028     interp eval   sb $halfbaked
00029     interp delete sb
00030 
00031     array set undefined {}
00032     array set users     {}
00033     foreach {n sym} $fixup {
00034     if {[info exists definitions($sym)]} {
00035         set def $definitions($sym)
00036         $t set $n def $def
00037         lappend users($def) $n
00038     } else {
00039         lappend undefined($sym) $n
00040     }
00041     }
00042 
00043     foreach def [array names users] {
00044     $t set $def users $users($def)
00045     }
00046 
00047     $t set root definitions [array get definitions]
00048     $t set root undefined   [array get undefined]
00049     $t set root symbol <StartExpression>
00050     $t set root name   <HalfBaked>
00051 
00052     return
00053 }
00054 
00055 /*  ### ### ### ######### ######### #########*/
00056 /*  Internal. Helpers*/
00057 
00058 ret  ::page::parse::peghb::Start (type t , type pe) {
00059     variable fixup
00060     $t set root start [treeOf $t root $pe fixup]
00061     return
00062 }
00063 
00064 ret  ::page::parse::peghb::Define (type t , type mode , type sym , type pe) {
00065     variable fixup
00066     variable definitions
00067 
00068     set def [$t insert root end]
00069 
00070     $t set $def users  {}
00071     $t set $def symbol $sym
00072     $t set $def label  $sym
00073     $t set $def mode   $mode
00074 
00075     treeOf $t $def $pe fixup
00076 
00077     set definitions($sym) $def
00078     return
00079 }
00080 
00081 ret  ::page::parse::peghb::treeOf (type t , type root , type pe , type fv) {
00082     upvar 1 $fv fixup
00083 
00084     set n  [$t insert $root end]
00085     set op [lindex $pe 0]
00086     $t set $n op $op
00087 
00088     if {$op eq "t"} {
00089     $t set $n char [lindex $pe 1]
00090 
00091     } elseif {$op eq ".."} {
00092     $t set $n begin [lindex $pe 1]
00093     $t set $n end   [lindex $pe 2]
00094 
00095     } elseif {$op eq "n"} {
00096 
00097     set sym [lindex $pe 1]
00098     $t set $n sym $sym
00099     $t set $n def ""
00100 
00101     lappend fixup $n $sym
00102     } else {
00103     foreach sub [lrange $pe 1 end] {
00104         treeOf $t $n $sub fixup
00105     }
00106     }
00107     return $n
00108 }
00109 
00110 /*  ### ### ### ######### ######### #########*/
00111 /*  Internal. Strings.*/
00112 
00113 namespace ::page::parse::peghb {}
00114 
00115 /*  ### ### ### ######### ######### #########*/
00116 /*  Ready*/
00117 
00118 package provide page::parse::peghb 0.1
00119 

Generated on 21 Sep 2010 for Gui by  doxygen 1.6.1