2016-11-28 11 views
1

플라이를 사용하여 정규 표현식에서 AST를 작성해야합니다. 예를 들어, RE가 (a | b *) abc이면, (':', (':', ('|', 'a', (' '', 'b'), 'b'), 'c') < - ':'는 문자열을 두 부분으로 나눕니다.파이썬에서 플라이 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

가능한 복제 (I 정확한 지점을 찾을 수 없습니다하는 기능을 찾아 사용했다) - 규칙의 우선 순위를 더와 연산자?] (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를 사용하여 심볼의 우선 순위가 포함 된 선행 변수를 설정할 수 있습니다. 예를 들어 :

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

당신은 전체 튜토리얼 여기에 문서를 찾을 수 있습니다 http://www.dabeaz.com/ply/ply.html#ply_nn27 [Yacc에의