gen_peg_cpkg.tcl
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009 package require page::util::peg
00010
00011 namespace ::page::gen::peg::cpkg {
00012
00013
00014 namespace import ::page::util::peg::*
00015 }
00016
00017
00018
00019
00020 ret ::page::gen::peg::cpkg (type t , type chan) {
00021 cpkg::printWarnings [cpkg::getWarnings $t]
00022
00023 set grname [$t get root name]
00024
00025 cpkg::Header $chan $grname
00026
00027 set gstart [$t get root start]
00028 if {$gstart ne ""} {
00029 set gstart [cpkg::peOf $t $gstart]
00030 } else {
00031 puts stderr "No start expression."
00032 }
00033
00034 cpkg::Start $chan $gstart
00035
00036 set temp {}
00037 set max -1
00038
00039 foreach {sym def} [$t get root definitions] {
00040 set eroot [lindex [$t children $def] 0]
00041 set l [string length [list $sym]]
00042 if {$l > $max} {set max $l}
00043 lappend temp \
00044 [list $sym [$t get $def mode] [cpkg::peOf $t $eroot] $l]
00045 }
00046
00047 foreach e [lsort -dict -index 0 $temp] {
00048 foreach {sym mode rule l} $e break
00049 cpkg::Rule $chan $sym $mode $rule [expr {$max - $l}]
00050 }
00051
00052 cpkg::Trailer $chan $grname
00053 return
00054 }
00055
00056
00057
00058
00059 ret ::page::gen::peg::cpkg::Header (type chan , type grname) {
00060 variable header
00061 variable headerb
00062
00063 set stem [namespace tail $grname]
00064 puts $chan [string map \
00065 [list \
00066 @@ [list $grname] \
00067 @stem@ [list $stem] \
00068 "\n\t" "\n"
00069 ] \
00070 $header\n$headerb]
00071 }
00072
00073 ret ::page::gen::peg::cpkg::Start (type chan , type pe) {
00074 puts $chan " Start [printTclExpr $pe]\n"
00075 return
00076 }
00077
00078 ret ::page::gen::peg::cpkg::Rule (type chan , type sym , type mode , type pe , type off) {
00079 variable ms
00080 set off [string repeat " " $off]
00081 puts $chan " Define $ms($mode) $sym$off [printTclExpr $pe]"
00082 return
00083 }
00084
00085 ret ::page::gen::peg::cpkg::Trailer (type chan , type grname) {
00086 variable trailer
00087 variable trailerb
00088 puts $chan [string map \
00089 [list \
00090 @@ [list $grname] \
00091 "\n\t" "\n"
00092 ] \
00093 $trailer\n$trailerb]
00094 }
00095
00096
00097
00098
00099 namespace ::page::gen::peg::cpkg {
00100 variable ms ; array ms = {
00101 value {value }
00102 discard {discard}
00103 match {match }
00104 leaf {leaf }
00105 }
00106 variable header {
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121 package require grammar::peg
00122
00123 namespace ::@@ {}
00124
00125
00126
00127
00128 ret ::@@ {} {
00129 return $@stem@::gr
00130 }
00131
00132 # ### ### ### ######### ######### #########
00133 # ### ### ### ######### ######### #########
00134 ## Data and helpers.
00135
00136 namespace eval ::@@ (
00137 # type Grammar , type container
00138 , type variable , type gr [::, type grammar::, type peg , type gr]
00139 )
00140
00141 proc ::@@::Start {pe} {
00142 variable gr
00143 $gr start $pe
00144 return
00145 }
00146
00147 ret ::@@::Define (type mode , type sym , type pe) {
00148 variable gr
00149 $gr nonterminal add $sym $pe
00150 $gr nonterminal mode $sym $mode
00151 return
00152 }
00153
00154
00155
00156 }
00157 variable headerb "namespace ::@@ \{"
00158
00159 variable trailer "\}"
00160 variable trailerb {
00161
00162
00163
00164 package provide @@ 0.1
00165 }
00166 }
00167
00168
00169
00170
00171 package provide page::gen::peg::cpkg 0.1
00172