1 # parser for Unix yacc-based grammars
3 # Author: David Beazley (dave@dabeaz.com)
4 # Date : October 2, 2006
17 '''yacc : defsection rulesection'''
20 '''defsection : definitions SECTION
22 p
.lexer
.lastsection
= 1
23 print "tokens = ", repr(tokenlist
)
25 print "precedence = ", repr(preclist
)
27 print "# -------------- RULES ----------------"
31 '''rulesection : rules SECTION'''
33 print "# -------------- RULES END ----------------"
37 '''definitions : definitions definition
40 def p_definition_literal(p
):
41 '''definition : LITERAL'''
44 def p_definition_start(p
):
45 '''definition : START ID'''
46 print "start = '%s'" % p
[2]
48 def p_definition_token(p
):
49 '''definition : toktype opttype idlist optsemi '''
54 preclist
.append(('left',) + tuple(p
[3]))
55 elif p
[1] == '%right':
56 preclist
.append(('right',) + tuple(p
[3]))
57 elif p
[1] == '%nonassoc':
58 preclist
.append(('nonassoc',)+ tuple(p
[3]))
68 '''opttype : '<' ID '>'
72 '''idlist : idlist optcomma tokenid
95 def p_definition_type(p
):
96 '''definition : TYPE '<' ID '>' namelist optsemi'''
97 # type declarations are ignored
100 '''namelist : namelist optcomma ID
103 def p_definition_union(p
):
104 '''definition : UNION CODE optsemi'''
105 # Union declarations are ignored
108 '''rules : rules rule
115 # Print out a Python equivalent of this rule
117 embedded
= [ ] # Embedded actions (a mess)
123 # r contains one of the rule possibilities
124 print "def p_%s_%d(p):" % (rulename
,rulecount
)
127 for i
in range(len(r
)):
129 if item
[0] == '{': # A code block
135 embed_name
= "_embed%d_%s" % (embed_count
,rulename
)
136 prod
.append(embed_name
)
137 embedded
.append((embed_name
,item
))
141 print " '''%s : %s'''" % (rulename
, " ".join(prod
))
143 print_code(prodcode
,4)
147 for e
,code
in embedded
:
148 print "def p_%s(p):" % e
149 print " '''%s : '''" % e
154 '''rule : ID ':' rulelist ';' '''
158 '''rule : ID ':' rulelist morerules ';' '''
163 '''rule : ID ':' ';' '''
166 def p_rule_empty2(p
):
167 '''rule : ID ':' morerules ';' '''
173 '''morerules : morerules '|' rulelist
185 # print "morerules", len(p), p[0]
188 '''rulelist : rulelist ruleitem
212 def print_code(code
,indent
):
213 if not emit_code
: return
214 codelines
= code
.splitlines()
216 print "%s# %s" % (" "*indent
,c
)