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