yparse.py

来自「M5,一个功能强大的多处理器系统模拟器.很多针对处理器架构,性能的研究都使用它作」· Python 代码 · 共 218 行

PY
218
字号
# parser for Unix yacc-based grammars## Author: David Beazley (dave@dabeaz.com)# Date  : October 2, 2006import ylextokens = ylex.tokensfrom ply import *tokenlist = []preclist  = []emit_code = 1def p_yacc(p):    '''yacc : defsection rulesection'''def p_defsection(p):    '''defsection : definitions SECTION                  | SECTION'''    p.lexer.lastsection = 1    print "tokens = ", repr(tokenlist)    print    print "precedence = ", repr(preclist)    print    print "# -------------- RULES ----------------"    printdef p_rulesection(p):    '''rulesection : rules SECTION'''    print "# -------------- RULES END ----------------"    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)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 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]))def p_toktype(p):    '''toktype : TOKEN               | LEFT               | RIGHT               | NONASSOC'''    p[0] = p[1]def p_opttype(p):    '''opttype : '<' ID '>'               | empty'''def p_idlist(p):    '''idlist  : idlist optcomma tokenid               | tokenid'''    if len(p) == 2:        p[0] = [p[1]]    else:        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 ignoreddef p_namelist(p):    '''namelist : namelist optcomma ID                | ID'''def p_definition_union(p):    '''definition : UNION CODE optsemi'''    # Union declarations are ignoreddef p_rules(p):    '''rules   : rules rule               | rule'''    if len(p) == 2:       rule = p[1]    else:       rule = p[2]    # Print out a Python equivalent of this rule    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)        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)        print "    '''%s : %s'''" % (rulename, " ".join(prod))        # Emit code        print_code(prodcode,4)        print        rulecount += 1    for e,code in embedded:        print "def p_%s(p):" % e        print "    '''%s : '''" % e        print_code(code,4)        printdef p_rule(p):   '''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])def p_rule_empty(p):   '''rule : ID ':' ';' '''   p[0] = (p[1],[[]])def p_rule_empty2(p):   '''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])#   print "morerules", len(p), p[0]def p_rulelist(p):   '''rulelist : rulelist ruleitem               | ruleitem'''   if len(p) == 2:        p[0] = [p[1]]   else:        p[0] = p[1]        p[1].append(p[2])def p_ruleitem(p):   '''ruleitem : ID               | QLITERAL               | CODE               | PREC'''   p[0] = p[1]def p_empty(p):    '''empty : '''def p_error(p):    passyacc.yacc(debug=0)def print_code(code,indent):    if not emit_code: return    codelines = code.splitlines()    for c in codelines:         print "%s# %s" % (" "*indent,c)

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?