2011-11-22 13 views
4

파이썬 용 PLY 라이브러리에 제공된 yacc 파서를 사용하여 문자열을 구문 분석하려고합니다. 파서 자체는 매우 길지만 문제는 내가 어떤 종류의 문자열을 넣든 상관없이 항상 동일한 오류를 제공한다는 것입니다. 오류는 다음과 같습니다.파서 YACC에서 EOF 오류

yacc : 입력 오류를 구문 분석합니다. EOF

그리고 렉서가 완벽하게 실행되므로 파서가 문제라고 생각합니다. 하지만이 오류를 이해하지 못하므로이 문제를 해결하기 위해 먼저 어디를 먼저 봐야할지 모르겠다.

아이디어가 있으십니까? 대단히 감사합니다!

+0

파서가 다음 토큰을 얻는 방법은 무엇입니까? 당신이 그것을 "손으로"부르면 그 메커니즘이 효과가 있습니까? – sarnold

+0

어떻게 손으로 부를 수 있습니까? – camelCase

+0

''python' 대화식 REPL 내에서 가져올 패키지 중에서'yy_scan_string ("입력 문자열")'(또는 Python 버전에서 호출되는 것)을 호출하십시오. – sarnold

답변

5

PLY에 지정된 모든 파서에는 전체 입력 텍스트를 구문 분석 한 결과로 축소되는 단일 최상위 규칙이 있어야합니다. 프로그램을 분석 예를 들어, 최상위 레벨 규칙이 같은 수 있습니다 :

def p_program(p): 
    ''' 
    program : declarations 
    ''' 

def p_declarations(p): 
    ''' 
    declarations : declarations declaration 
       | declaration 
    ''' 
... 

당신이 파서에서 "EOF"오류가 발생하면, 그것은이 저하없이 입력의 끝에 도달한다는 것을 의미 최상위 문법 규칙. 즉, 구문 분석 스택이 비어 있지 않으므로 줄일 수있는 규칙이 더 이상 없습니다. 스택이 비어 있지 않기 때문에 파서는 더 많은 심볼을 이동하려고 시도하고 EOF로 인해 실패합니다.

이 오류의 잠재적 원인 중 하나는 문법에 부적절하게 지정된 시작 규칙을 갖는 것입니다. 파일의 첫 번째 p_rule (p) 함수가 시작 규칙인지 확인하십시오.