parse_pegser.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 serialized PEG container.*/
00005 
00006 /*  ### ### ### ######### ######### #########*/
00007 /*  Requisites*/
00008 
00009 package require grammar::peg
00010 
00011 namespace ::page::parse::pegser {}
00012 
00013 /*  ### ### ### ######### ######### #########*/
00014 /*  API*/
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 /*  Internal. Helpers*/
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 /*  Internal. Strings.*/
00093 
00094 namespace ::page::parse::pegser {}
00095 
00096 /*  ### ### ### ######### ######### #########*/
00097 /*  Ready*/
00098 
00099 package provide page::parse::pegser 0.1
00100 

Generated on 21 Sep 2010 for Gui by  doxygen 1.6.1