, 규칙 중 일부는 같은 것 다음yacc - 연산자가없는 규칙의 우선 순위? (실제로 PLY을 사용하고 있습니다)은 yacc을 사용하여 정규 표현식을 구문 분석에 대한 생각
는expr : expr expr
expr : expr '|' expr
expr : expr '*'
문제는 첫 번째 규칙 (연결)은보다 우선되어야한다 두 번째 규칙은 있지만 세 번째 규칙은 아닙니다.
그러나 연결 규칙에는 연산자가 없습니다.
어떻게이 경우에 우선 순위를 올바르게 지정할 수 있습니까?
감사합니다.
편집 :
나는이 문제를 방지하기 위해 규칙을 수정,하지만 난 여전히 문제가 무엇인지 궁금합니다.
이tokens = ['PLEFT', 'PRIGHT', 'BAR', 'ASTERISK', 'NORMAL']
t_PLEFT = r'\('
t_PRIGHT = r'\)'
t_BAR = r'\|'
t_ASTERISK = '\*'
t_NORMAL = r'[a-zA-Z0-9]'
lex.lex()
precedence = (
('left', 'BAR'),
('left', 'CONCAT'),
('left', 'ASTERISK'),
)
def p_normal(p):
'''expr : NORMAL'''
p[0] = p[1]
def p_par(p):
'''expr : PLEFT expr PRIGHT'''
p[0] = p[2]
def p_or(p):
'''expr : expr BAR expr'''
p[0] = ('|', p[1], p[3])
def p_concat(p):
'''expr : expr expr %prec CONCAT'''
p[0] = ('CONCAT', p[1], p[2])
def p_repeat(p):
'''expr : expr ASTERISK'''
p[0] = ('*', p[1])
yacc.yacc()
'ab|cd*'
의 그것의 분석 결과가 ('CONCAT', ('|', ('CONCAT', 'a', 'b'), 'c'), ('*', 'd'))
입니다 : 여기
답변 해 주셔서 감사합니다. – noname
% prec를 시도했는데 이유가 확실하지 않지만 'ab | cd'는 '(ab) | (cd)'가 아니라 '((ab) | c) d'와 같이 작동합니다. 시프트/줄이기 충돌 경고가 없었습니다. – noname
@noname 우선권을 얻기가 까다로울 수 있습니다. 실제 문법을 게시하지 않으면 무엇이 잘못되었는지 알 수 없습니다.Ply/yacc는 우선 순위를 통해 해결 된 경우 충돌을보고하지 않습니다. 잘못된 것으로 간주 되더라도 (사용자가 의도 한 것을 쓴 것으로 가정하기 때문에) 충돌을보고합니다. 그러나 IMHO는 모호하지 않은 문법이 명확하고 문제가되지 않는다. – rici