2016-11-28 6 views
1

プライを使用して正規表現からASTを作成する必要があります。例えば、REが(a | b *)abcならば、( ':'、( ':'、( '|'、 'a'、( '- ':'は、文字列を2つに分割することを意味します。Pythonでplyのyaccの優先順位を設定する方法は?

ここに私のコードです。

tokens = (
    "SYMBOL", 
    "LBRACKET", 
    "RBRACKET", 
    "STAR", 
    "UNION" 
) 

t_ignore = ' \t\n' 
t_SYMBOL = r'[a-zA-Z0-9]' 
t_LBRACKET = r'\(' 
t_RBRACKET = r'\)' 
t_STAR = r'\*' 
t_UNION = r'\|' 

def t_error(t): 
    raise TypeError("Unknown text '%s'" % t.value) 

def p_multiple(p) : 
    '''string : SYMBOL SYMBOL 
       | string SYMBOL 
       | string string''' 
    p[0] = (':', p[1], p[2])  

def p_union(p) : 
    '''string : string UNION string''' 
    p[0] = ('|', p[1], p[3]) 

def p_star(p) : 
    '''string : string STAR''' 
    p[0] = ('*', p[1]) 

def p_brackets(p) : 
    '''string : LBRACKET string RBRACKET''' 
    p[0] = p[2] 


def p_symbol(p) : 
    '''string : SYMBOL''' 
    p[0] = p[1] 

def p_error(p): 
    print ("Syntax error at '%s'" % p.value) 

lex.lex() 
yacc.yacc() 

lex.input("(a|b*)abc") 
parsed = yacc.parse(RE) 
+0

可能な重複:

precedence = ( ('left', 'PLUS', 'MINUS'), ('left', 'TIMES', 'DIVIDE'), ) 

あなたはここに完全なチュートリアルやドキュメントを見つけることができます演算子?](http://stackoverflow.com/questions/40754644/yacc-precedence-of-a-rule-with-no-operator) – rici

答えて

-2

私はあなたの質問に直接答えることができません。しかし、おそらくgreeneryの使用を検討することができます。

>>> from greenery.lego import parse 
>>> thingy = parse('(a|b*)abc') 
>>> thingy.to_fsm() 
fsm(alphabet = {'b', 'c', anything_else, 'a'}, states = {0, 1, 2, 3, 4, 5}, initial = 0, finals = {5}, map = {0: {'b': 2, 'a': 1}, 1: {'b': 4, 'a': 3}, 2: {'b': 2, 'a': 3}, 3: {'b': 4}, 4: {'c': 5}, 5: {}}) 

私はあなたがマップ決勝状態のそれぞれから再帰的に逆方向に踏んで欲しいものを回復することができると思います。

落札した場合は理由を明記してください。

0

この質問を復活させるために、plyを使用すると、シンボルの優先順位を含む優先度変数を設定できます。例えば: - なしでのルールの優先順位[YACCの http://www.dabeaz.com/ply/ply.html#ply_nn27(私は右の場所を見つけるための機能を見つける使用していた)

関連する問題