2017-03-26 1 views
0

토큰 '오류'의 의미는 무엇입니까? 없이 오류를 감지하는 방법;Yacc - '오류'는 무엇을 의미합니까?

+0

'error'는 다음과 같은 의미입니다. 파서 오류. 자신이 직접 처리 할 수 ​​있도록 오류를 포착하여 복구 또는 사용자 정의보고를 수행 할 수 있습니다. '프로그램 \t \t \t : –

답변

2

의사 터미널이 일치하면 bison 파서는 "처리 할 수없는"토큰을 버리는 것을 제외하고 정상적인 방식으로 구문 분석을 계속합니다.

error 토큰 바로 뒤에있는 토큰을 발견하면 해당 토큰을 이동할 수 있습니다. 즉, 토큰 삭제를 중지합니다.

그러나 파서가 토큰을 처리 할 수있는 유일한 방법은 아닙니다. 또한 축소를 수행하여 처리 할 수도 있습니다.

축소 처리 작업이 미리보기 토큰을 실제로 받아들이지 않기 때문에 "처리됨"이라는 단어가 느슨하게 해석됩니다. 그럼에도 불구하고 오류 생성을 줄이는 것으로 충분합니다.

이러한 경우에는 이 아니라yyerrok으로 전화해야합니다. 오류 처리가 yyerrok으로 취소되고 미리보기 토큰을 이동할 수 없으면 오류 처리기가 다시 실행되고 무한 루프가 될 수 있습니다. 예를 들어

,

commands: %empty | commands command 

command : exp ';' { printf("Value is %d\n", $1); } 
     | error ';' { printf("Bad expression\n"); yyerrok; } 
     | error  { printf("Missing semicolon\n"); } 

command 생산 인쇄 될 올바른 표현의 결과를 야기한다. 두 번째 제품은 여전히 ​​세미콜론이있는 구문 오류를 처리합니다. ;이 이미 이동되었으므로 오류 처리를 취소 할 수 있으므로 오류 처리를 다시 시작하는 것이 좋습니다.

세 번째 제품에서는 세미콜론이 누락되었습니다. lookahead 토큰이 과 같이 불법 토큰 일 수 있기 때문에 여기서 yyerrok이라고 부를 수 없습니다!. yyerrok에 전화하면 오류 상태가 지워지고 오류 처리가 lookahead 토큰과 동일한 느낌표로 즉시 다시 입력되어 무한 루프가 발생합니다. 그러나 없이 yyerrok 인 경우 파서는 여전히 오류 처리 모드에 있으며 문제가되는 토큰은 삭제됩니다.

참고 : 위의 내용은 error 제품이 error 토큰 다음에 아무런 영향을 미치지 않는 문제에 대한 답변을 제공하기위한 것입니다. "질문 : 예를 들어"어떻게해야합니까? X "과 같은 질문에 대답하지 않으려 고합니다. (다양한 값인 X). 제공된 예는 약간 인공적입니다. 원래는 표현식 종결 자로 개행 문자를 사용 했으므로 두 번째 오류 처리 프로덕션을 포함 할 필요가 없었습니다. EOF를 제외하고 종료하는 개행 문자를 제외하는 것이 실제로 불가능하기 때문입니다. 혼란의

+0

그러나 글로벌 장식 처리 할 수 ​​\t ExtDefList을 \t \t \t \t \t {} \t \t \t \t; ExtDefList \t \t : \t \t \t {} \t \t \t \t \t ExtDef ExtDefList | \t/* 빈 */\t \t \t \t \t {} \t \t \t \t; ExtDef \t \t \t : \t 지정자 ExtDecList 세미 \t {} \t \t \t \t ... \t \t \t \t | \t 오류 SEMI \t \t \t \t \t {printf ("bad expression % s \ n", yytext); yyerrok;} \t \t \t \t | \t 오류 \t \t \t \t \t \t {의 printf ("반 \ n을 누락되었습니다");} \t \t \t \t,' – Rachel

+0

@rachel을 : 그 코멘트는 일반적으로 당신이 새로운 질문을해야한다는 의미 읽을 본질적으로 불가능하다 더 자세한 사항. (목표가 정확히 무엇인지, 정확히 무엇을 시도했는지는 요구 사항을 충족시키지 못했습니다.)하지만 동기화 토큰이없는 경우 누락 된 토큰을 인식하는 것이 항상 쉬운 것은 아닙니다. – rici

1

하나의 일반적인 Source (소스) - error 토큰이 오류 복구입니다, 감지 에러 없습니다. 구문 오류는 파서가 자동으로 감지하여보고합니다. 액션의 다른 오류를 감지하고 YYERROR 매크로를 사용하여 bison에게 알릴 수 있습니다.

개념적으로, error 토큰은 유효하지 않은 입력 스트림을 유효한 것으로 변환하기 위해 0 개 이상의 입력 토큰 시퀀스를 대체합니다.오류가 발생하면 bison 생성 구문 분석기는 오류 복구 모드로 진행하여 error 의사 토큰을 이동할 수있는 위치에 도달 할 때까지 토큰 및 상태를 삭제합니다. 그런 다음 오류 토큰을 이동시키고 거기에서 계속 시도합니다.

관련 문제