parse_peghb.tcl
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009 namespace ::page::parse::peghb {
00010 variable fixup {}
00011 variable definitions
00012 }
00013
00014
00015
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
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
00112
00113 namespace ::page::parse::peghb {}
00114
00115
00116
00117
00118 package provide page::parse::peghb 0.1
00119