parse_pegser.tcl
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009 package require grammar::peg
00010
00011 namespace ::page::parse::pegser {}
00012
00013
00014
00015
00016 ret ::page::parse::pegser (type serial , type t) {
00017
00018 ::grammar::peg gr deserialize $serial
00019
00020 $t set root start [pegser::treeOf $t root [gr start] fixup]
00021
00022 array set definitions {}
00023 foreach sym [gr nonterminals] {
00024 set def [$t insert root end]
00025
00026 $t set $def users {}
00027 $t set $def symbol $sym
00028 $t set $def label $sym
00029 $t set $def mode [gr nonterminal mode $sym]
00030 pegser::treeOf $t $def [gr nonterminal rule $sym] fixup
00031
00032 set definitions($sym) $def
00033 }
00034
00035 array set undefined {}
00036 array set users {}
00037 foreach {n sym} $fixup {
00038 if {[info exists definitions($sym)]} {
00039 set def $definitions($sym)
00040 $t set $n def $def
00041 lappend users($def) $n
00042 } else {
00043 lappend undefined($sym) $n
00044 }
00045 }
00046
00047 foreach def [array names users] {
00048 $t set $def users $users($def)
00049 }
00050
00051 $t set root definitions [array get definitions]
00052 $t set root undefined [array get undefined]
00053 $t set root symbol <StartExpression>
00054 $t set root name <Serialization>
00055
00056 return
00057 }
00058
00059
00060
00061
00062 ret ::page::parse::pegser::treeOf (type t , type root , type pe , type fv) {
00063 upvar 1 $fv fixup
00064
00065 set n [$t insert $root end]
00066 set op [lindex $pe 0]
00067 $t set $n op $op
00068
00069 if {$op eq "t"} {
00070 $t set $n char [lindex $pe 1]
00071
00072 } elseif {$op eq ".."} {
00073 $t set $n begin [lindex $pe 1]
00074 $t set $n end [lindex $pe 2]
00075
00076 } elseif {$op eq "n"} {
00077
00078 set sym [lindex $pe 1]
00079 $t set $n sym $sym
00080 $t set $n def ""
00081
00082 lappend fixup $n $sym
00083 } else {
00084 foreach sub [lrange $pe 1 end] {
00085 treeOf $t $n $sub fixup
00086 }
00087 }
00088 return $n
00089 }
00090
00091
00092
00093
00094 namespace ::page::parse::pegser {}
00095
00096
00097
00098
00099 package provide page::parse::pegser 0.1
00100