gen_peg_cpkg.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 / Backend - PEG as Tcl script.*/
00005 
00006 /*  ### ### ### ######### ######### #########*/
00007 /*  Requisites*/
00008 
00009 package require page::util::peg
00010 
00011 namespace ::page::gen::peg::cpkg {
00012     /*  Get various utilities.*/
00013 
00014     namespace import ::page::util::peg::*
00015 }
00016 
00017 /*  ### ### ### ######### ######### #########*/
00018 /*  API*/
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 /*  Internal. Helpers*/
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 /*  Internal. Strings.*/
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 {/*  -*- tcl -*-*/
00107     /*  Parsing Expression Grammar '@@'.*/
00108 
00109     /*  ### ### ### ######### ######### #########*/
00110     /*  Package description*/
00111 
00112     /*  It provides a single command returning the handle of a*/
00113     /*  grammar container in which the grammar '@@'*/
00114     /*  is stored. The container is usable by a PEG interpreter*/
00115     /*  or other packages taking PE grammars.*/
00116 
00117     /*  ### ### ### ######### ######### #########*/
00118     /*  Requisites.*/
00119     /*  - PEG container type*/
00120 
00121     package require grammar::peg
00122 
00123     namespace ::@@ {}
00124 
00125     /*  ### ### ### ######### ######### #########*/
00126     /*  API*/
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     /*  Initialization = Grammar definition*/
00156     }
00157     variable headerb    "namespace ::@@ \{"
00158 
00159     variable trailer "\}"
00160     variable trailerb {
00161     /*  ### ### ### ######### ######### #########*/
00162     /*  Package Management - Ready*/
00163 
00164     package provide @@ 0.1
00165     }
00166 }
00167 
00168 /*  ### ### ### ######### ######### #########*/
00169 /*  Ready*/
00170 
00171 package provide page::gen::peg::cpkg 0.1
00172 

Generated on 21 Sep 2010 for Gui by  doxygen 1.6.1