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)