1# -*- tcl -*- 2# 3# Copyright (c) 2005 by Andreas Kupries <andreas_kupries@users.sourceforge.net> 4# Parser Generator / Backend - PEG in half baked form for PEG container. 5 6# ### ### ### ######### ######### ######### 7## Requisites 8 9package require page::util::peg 10 11namespace eval ::page::gen::peg::hb { 12 # Get various utilities. 13 14 namespace import ::page::util::peg::* 15} 16 17# ### ### ### ######### ######### ######### 18## API 19 20proc ::page::gen::peg::hb {t chan} { 21 hb::printWarnings [hb::getWarnings $t] 22 23 set gstart [$t get root start] 24 if {$gstart ne ""} { 25 set gstart [hb::peOf $t $gstart] 26 } else { 27 puts stderr "No start expression." 28 } 29 30 hb::Start $chan $gstart 31 32 set temp {} 33 set max -1 34 foreach {sym def} [$t get root definitions] { 35 set eroot [lindex [$t children $def] 0] 36 set l [string length [list $sym]] 37 if {$l > $max} {set max $l} 38 lappend temp \ 39 [list $sym [$t get $def mode] [hb::peOf $t $eroot] $l] 40 } 41 42 foreach e [lsort -dict -index 0 $temp] { 43 foreach {sym mode rule l} $e break 44 hb::Rule $chan $sym $mode $rule [expr {$max - $l}] 45 } 46 return 47} 48 49# ### ### ### ######### ######### ######### 50## Internal. Helpers 51 52proc ::page::gen::peg::hb::Start {chan pe} { 53 puts $chan "Start [printTclExpr $pe]\n" 54 return 55} 56 57proc ::page::gen::peg::hb::Rule {chan sym mode pe off} { 58 variable ms 59 set off [string repeat " " $off] 60 puts $chan "Define $ms($mode) $sym$off [printTclExpr $pe]" 61 return 62} 63 64# ### ### ### ######### ######### ######### 65## Internal. Strings. 66 67namespace eval ::page::gen::peg::hb { 68 variable ms ; array set ms { 69 value {value } 70 discard {discard} 71 match {match } 72 leaf {leaf } 73 } 74} 75 76# ### ### ### ######### ######### ######### 77## Ready 78 79package provide page::gen::peg::hb 0.1 80