플라이를 사용하여 정규 표현식에서 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)
가능한 복제 (I 정확한 지점을 찾을 수 없습니다하는 기능을 찾아 사용했다) - 규칙의 우선 순위를 더와 연산자?] (http://stackoverflow.com/questions/40754644/yacc-precedence-of-a-rule-with-no-operator) – rici