2011-05-04 4 views
2

오류 생성은 일반적으로 어떻게 추가됩니까? 내 오류 제작물이 너무 얕다는 문제가 발생합니다. 구문 분석기가 문에서 오류가 발생하여 팝업 상태를 시작하면 해당 구문이 위치한 섹션의 오류 생성이 발생할 때까지 팝업되고 잘못된 오류가 인쇄됩니다 메시지.문법에 오류 생성물을 추가하는 전략은 무엇입니까?

모든 비 터미널에 설명적인 오류 생성을 추가하는 것이 좋습니다.

답변

3

오류 프로덕션은 오류를 복구하려고하는데, 합리적이거나 유용한 오류 메시지를 인쇄하는 것이 아니라 입력 처리를 계속하려고합니다. 따라서 입력 스트림을 제대로 인식하고 재 동기화 할 수있는 문법의 지점에서 사용해야합니다. 예를 들어, 언어가 ; 문자로 끝나는 일련의 구문으로 구성되어있는 경우 오류 발생률은 construct: error ';'과 비슷하며 construct (그 무엇이든)의 오류를 입력으로 건너 뛰고 ;으로 복구하고 거기에서 계속됩니다.

많은 오류 복구 규칙을 적용하는 것은 일반적으로 나쁜 생각입니다. 파서는 가장 가까운 것이고 가장 자주 사용되는 최상위 레벨의 것들이 가장 유용 할 것이고 더 세밀하게 사용하려고하기 때문입니다 오류 복구 규칙은 입력과 적절하게 재 동기화 할 수 없으므로 세분성은 오류 캐스케이드로 이어질 것입니다.

+0

또한 'construct : error'; '규칙에는 파서를 오류 복구 모드에서 제외시키기 위해'yyerrok;'를 호출하는 작업이 있어야합니다. – Kaz

+0

@Kaz :'yyerrok'는 유용 할 수 있지만 필수는 아닙니다. 사용하면 다른 오류가 발생하면 무시되지 않습니다 (다른 구문 오류 메시지가 나타남). 그렇지 않을 수도 있음 당신이 원하는. 이를 사용하지 않으면 오류 복구 모드를 종료하기 위해 2 개 이상의 토큰 (';'을 포함하여 3 개)을 이동해야합니다. –

관련 문제