summaryrefslogtreecommitdiff
path: root/example/yply/yparse.py
diff options
context:
space:
mode:
Diffstat (limited to 'example/yply/yparse.py')
-rw-r--r--example/yply/yparse.py153
1 files changed, 90 insertions, 63 deletions
diff --git a/example/yply/yparse.py b/example/yply/yparse.py
index ab5b884..fff887a 100644
--- a/example/yply/yparse.py
+++ b/example/yply/yparse.py
@@ -9,13 +9,15 @@ tokens = ylex.tokens
from ply import *
tokenlist = []
-preclist = []
+preclist = []
emit_code = 1
+
def p_yacc(p):
'''yacc : defsection rulesection'''
+
def p_defsection(p):
'''defsection : definitions SECTION
| SECTION'''
@@ -25,37 +27,43 @@ def p_defsection(p):
print "precedence = ", repr(preclist)
print
print "# -------------- RULES ----------------"
- print
+ print
+
def p_rulesection(p):
'''rulesection : rules SECTION'''
print "# -------------- RULES END ----------------"
- print_code(p[2],0)
+ print_code(p[2], 0)
+
def p_definitions(p):
'''definitions : definitions definition
| definition'''
+
def p_definition_literal(p):
'''definition : LITERAL'''
- print_code(p[1],0)
+ print_code(p[1], 0)
+
def p_definition_start(p):
'''definition : START ID'''
print "start = '%s'" % p[2]
+
def p_definition_token(p):
'''definition : toktype opttype idlist optsemi '''
for i in p[3]:
- if i[0] not in "'\"":
- tokenlist.append(i)
+ if i[0] not in "'\"":
+ tokenlist.append(i)
if p[1] == '%left':
preclist.append(('left',) + tuple(p[3]))
elif p[1] == '%right':
preclist.append(('right',) + tuple(p[3]))
elif p[1] == '%nonassoc':
- preclist.append(('nonassoc',)+ tuple(p[3]))
+ preclist.append(('nonassoc',) + tuple(p[3]))
+
def p_toktype(p):
'''toktype : TOKEN
@@ -64,10 +72,12 @@ def p_toktype(p):
| NONASSOC'''
p[0] = p[1]
+
def p_opttype(p):
'''opttype : '<' ID '>'
| empty'''
+
def p_idlist(p):
'''idlist : idlist optcomma tokenid
| tokenid'''
@@ -77,141 +87,158 @@ def p_idlist(p):
p[0] = p[1]
p[1].append(p[3])
+
def p_tokenid(p):
'''tokenid : ID
| ID NUMBER
| QLITERAL
| QLITERAL NUMBER'''
p[0] = p[1]
-
+
+
def p_optsemi(p):
'''optsemi : ';'
| empty'''
+
def p_optcomma(p):
'''optcomma : ','
| empty'''
+
def p_definition_type(p):
'''definition : TYPE '<' ID '>' namelist optsemi'''
# type declarations are ignored
+
def p_namelist(p):
'''namelist : namelist optcomma ID
| ID'''
+
def p_definition_union(p):
'''definition : UNION CODE optsemi'''
# Union declarations are ignored
+
def p_rules(p):
'''rules : rules rule
| rule'''
if len(p) == 2:
- rule = p[1]
+ rule = p[1]
else:
- rule = p[2]
+ rule = p[2]
# Print out a Python equivalent of this rule
- embedded = [ ] # Embedded actions (a mess)
+ embedded = [] # Embedded actions (a mess)
embed_count = 0
rulename = rule[0]
rulecount = 1
for r in rule[1]:
# r contains one of the rule possibilities
- print "def p_%s_%d(p):" % (rulename,rulecount)
+ print "def p_%s_%d(p):" % (rulename, rulecount)
prod = []
prodcode = ""
for i in range(len(r)):
- item = r[i]
- if item[0] == '{': # A code block
- if i == len(r) - 1:
- prodcode = item
- break
- else:
- # an embedded action
- embed_name = "_embed%d_%s" % (embed_count,rulename)
- prod.append(embed_name)
- embedded.append((embed_name,item))
- embed_count += 1
- else:
- prod.append(item)
+ item = r[i]
+ if item[0] == '{': # A code block
+ if i == len(r) - 1:
+ prodcode = item
+ break
+ else:
+ # an embedded action
+ embed_name = "_embed%d_%s" % (embed_count, rulename)
+ prod.append(embed_name)
+ embedded.append((embed_name, item))
+ embed_count += 1
+ else:
+ prod.append(item)
print " '''%s : %s'''" % (rulename, " ".join(prod))
# Emit code
- print_code(prodcode,4)
+ print_code(prodcode, 4)
print
rulecount += 1
- for e,code in embedded:
+ for e, code in embedded:
print "def p_%s(p):" % e
print " '''%s : '''" % e
- print_code(code,4)
+ print_code(code, 4)
print
+
def p_rule(p):
- '''rule : ID ':' rulelist ';' '''
- p[0] = (p[1],[p[3]])
+ '''rule : ID ':' rulelist ';' '''
+ p[0] = (p[1], [p[3]])
+
def p_rule2(p):
- '''rule : ID ':' rulelist morerules ';' '''
- p[4].insert(0,p[3])
- p[0] = (p[1],p[4])
+ '''rule : ID ':' rulelist morerules ';' '''
+ p[4].insert(0, p[3])
+ p[0] = (p[1], p[4])
+
def p_rule_empty(p):
- '''rule : ID ':' ';' '''
- p[0] = (p[1],[[]])
+ '''rule : ID ':' ';' '''
+ p[0] = (p[1], [[]])
+
def p_rule_empty2(p):
- '''rule : ID ':' morerules ';' '''
-
- p[3].insert(0,[])
- p[0] = (p[1],p[3])
+ '''rule : ID ':' morerules ';' '''
+
+ p[3].insert(0, [])
+ p[0] = (p[1], p[3])
+
def p_morerules(p):
- '''morerules : morerules '|' rulelist
- | '|' rulelist
- | '|' '''
-
- if len(p) == 2:
- p[0] = [[]]
- elif len(p) == 3:
- p[0] = [p[2]]
- else:
- p[0] = p[1]
- p[0].append(p[3])
+ '''morerules : morerules '|' rulelist
+ | '|' rulelist
+ | '|' '''
+
+ if len(p) == 2:
+ p[0] = [[]]
+ elif len(p) == 3:
+ p[0] = [p[2]]
+ else:
+ p[0] = p[1]
+ p[0].append(p[3])
# print "morerules", len(p), p[0]
+
def p_rulelist(p):
- '''rulelist : rulelist ruleitem
- | ruleitem'''
+ '''rulelist : rulelist ruleitem
+ | ruleitem'''
- if len(p) == 2:
+ if len(p) == 2:
p[0] = [p[1]]
- else:
+ else:
p[0] = p[1]
p[1].append(p[2])
+
def p_ruleitem(p):
- '''ruleitem : ID
- | QLITERAL
- | CODE
- | PREC'''
- p[0] = p[1]
+ '''ruleitem : ID
+ | QLITERAL
+ | CODE
+ | PREC'''
+ p[0] = p[1]
+
def p_empty(p):
'''empty : '''
+
def p_error(p):
pass
yacc.yacc(debug=0)
-def print_code(code,indent):
- if not emit_code: return
+
+def print_code(code, indent):
+ if not emit_code:
+ return
codelines = code.splitlines()
for c in codelines:
- print "%s# %s" % (" "*indent,c)
-
+ print "%s# %s" % (" " * indent, c)