fix codetest failure - ASSERT_ARGS does not have a ; after and
[parrot.git] / compilers / tge / TGE / Grammar.pir
blobc12a6566c3d55c1c5c17b60959a9fb97eba5ef84
1 # Copyright (C) 2005-2008, Parrot Foundation.
2 # $Id$
4 =head1 NAME
6 TGE::Grammar - The base class for all tree grammars.
8 =head1 SYNOPSIS
10 (To come.)
12 =head1 DESCRIPTION
14 =cut
16 .namespace [ 'TGE'; 'Grammar' ]
18 .sub '__onload' :load
19     # define the class
20     .local pmc base
21     newclass base, ['TGE';'Grammar']
22     addattribute base, 'rules'   # the rules in the grammar (an array)
23     addattribute base, 'symbols' # used for tracking symbols parsed
24                                  # (often a hash, but grammar chooses
25                                  # implementation)
26     .return ()
27 .end
29 =head2 new
31 Create a new grammar object. [Not implemented: Optionally pass it a
32 grammar specification in a string.] The grammar object holds an array
33 of TGE::Rule objects, which are the semantics defined by the grammar.
35 =cut
37 .sub init :vtable :method
38     $P1 = new 'ResizablePMCArray'
39     setattribute self, 'rules', $P1
40     $P2 = new 'Hash'
41     setattribute self, 'symbols', $P2
42 .end
44 =head2 add_rule
46 Add a rule to the current attribute grammar.
48 =cut
50 .sub 'add_rule' :method
51     .param pmc type
52     .param pmc name
53     .param pmc parent
54     .param pmc action
56     # create a new attribute grammar rule
57     .local pmc rule
58     rule = new ['TGE';'Rule']
59     setattribute rule, 'type', type
60     setattribute rule, 'name', name
61     setattribute rule, 'parent', parent
62     setattribute rule, 'action', action
64     # add the new rule to the grammar object
65     $P3 = getattribute self, 'rules'
66     push $P3, rule
67 .end
70 =head2 apply
72 Use a precompiled grammar on a data structure. This returns an
73 object on which you can call methods to fetch attributes on the
74 I<top node> of the data structure.
76 =cut
78 .sub 'apply' :method
79     .param pmc tree
80     .local pmc newtree
81     .local pmc visit
82     newtree = new ['TGE';'Tree']
83     setattribute newtree, 'data', tree
84     setattribute newtree, 'grammar', self
85     visit = getattribute newtree, 'visit'
86     # Build up the visit hash
87     .local pmc rules
88     .local int index
89     .local pmc currule
90     .local pmc cell
91     .local pmc typename
92     rules = getattribute self, 'rules'
94     index = rules
95 loop:
96     dec index
97     if index < 0 goto end_loop
98     currule = rules[index]
99     typename = getattribute currule, 'type'
100     $P2 = visit[typename]
101     $I1 = does $P2, 'array'
102     if $I1 goto array_exists
103     $P2 = new 'ResizablePMCArray'
104     visit[typename] = $P2
105 array_exists:
106     push $P2, currule
107     goto loop
108 end_loop:
110     newtree.'_scan_node'(tree, 'ROOT')
111     .return (newtree)
112 .end
114 =head2 add_symbol
116 Add a symbol to the lookup table.
118 =cut
120 .sub 'add_symbol' :method
121     .param pmc name
122     .param pmc value
124     # add the new symbol
125     .local pmc symbols
126     symbols = getattribute self, 'symbols'
128     $I0 = defined symbols[name]
129     if $I0 goto no_set
130     symbols[name] = value
131   no_set:
132     .return(1)
133 .end
135 =head2 symbol_iter
137 Return an iterator for the symbol lookup table.
139 =cut
141 .sub 'symbol_iter' :method
142     $P1 = getattribute self, 'symbols'
143     $P2 = iter $P1
145     .return($P2)
146 .end
148 =head2 dump
150 Produce a data dump of the current contents of the grammar object.
152 =cut
154 .sub 'dump' :method
155     $P0 = getattribute self, 'rules'
156     $I1 = $P0
158     print "VAR1 => { \n\t  'rules' =>\n"
159 LOOP:
160     dec $I1
161     $P1 = $P0[$I1]
162     print "\t\t     [\n"
163     $P1.'dump'()
164     print "\t\t     ],\n"
165     if $I1 > 0 goto LOOP
168     print "\t}\n"
169 .end
171 # Local Variables:
172 #   mode: pir
173 #   fill-column: 100
174 # End:
175 # vim: expandtab shiftwidth=4 ft=pir: