2016-11-18 1 views
1

나는 바이슨 파서의 플렉스 파서를 사용하여 입력 파일의 어휘를 구문 분석합니다. flex parser에서 일부 오류 (닫지 않은 대괄호 또는 허용되지 않는 기호)가 감지되었습니다. flex에서 bison 파서에 오류가 발생했음을 알리고 구문 구문 분석에 실패했음을 알리고 싶습니다. 라고는 yylex (나는 어떤 값을 반환하지 않기 때문에) 빈 어휘를 획득하고 그것을 무시하면 지금은 .L 파일들소에 플렉스 에러를 발생시키는 방법

RegExpForInvalidChars: {yyerror("Unaccaptable char")}; 

그러나 들소에 같은 코드를 사용합니다. 그래서 나쁜 기호는 그냥 건너 뛰고 구문 분석이 진행 중입니다.

. { return *yytext; } 

당신 렉서 규칙의 끝에 :

답변

1

일반적인 방법은 규칙을 가지고있다. 그렇게하면 유효한 어휘의 일부가 아닌 하나의 문자가 bison 문법으로 직접 반환되어 구문 오류가 발생할 수 있습니다. bison의 자세한 오류 메시지를 사용 가능하게 설정하면 구문 오류에 실제 유효하지 않은 문자가 포함됩니다.

0

가장 간단한 방법은 bison에 인식 할 수없는 어휘를 전달하는 것입니다.

.|\n  { return yytext[0]; } 

그 규칙은 단지 알 수없는 토큰 문자열의 첫 번째 문자를 반환하기 때문에 : 당신은 표준 대체 규칙을 사용하는 경우에 더 많거나 적은 자동 될 것입니다.

구문 분석기가 인식 할 수없는 토큰 값을 받으면 즉시 구문 오류를보고합니다.

거의 모든 응용 프로그램에서 렉서가 파서가 감지 할 오류를 인식하려고 시도 할 필요가 없으며 모범 사례도 아닙니다. 예를 들어, 대부분의 문법은 불균형 괄호가 포함 된 입력에서 실패하므로 괄호 수를 유지하는 논리로 렉서를 추가하는 것은 불필요합니다. 또한 파서에서 오류 복구를 구현하려고 결국 결정하면 스캐너에서 구현 된 상태 추적과 심하게 상호 작용하는 것을 알 수 있습니다.

관련 문제