yacc에서 파서 스택 오버플로를 실행 중입니다. 현재 구문 분석기 스택 크기가 어떻게 결정되는지 잘 모르겠습니다. 현재 파서 스택 크기를 얻는 방법이 있습니까? 그래서 토큰 수가 최대 스택 깊이에 도달하면 오류를보고 할 수 있습니까? 이 정보를 보유하고있는 yacc에 변수가 있습니까?yacc에서 스택으로 파싱 된 현재 토큰 수를 얻을 수있는 방법이 있나요?
0
A
답변
1
구문 분석기가 스택 오버플로 오류 (segfaulting 또는 정의되지 않은 동작 호출없이)를 생성 할 수 있기 때문에 내부적으로 사용할 수는 있지만 파서 스택 크기를 가져 오는 표준 방법은 없습니다. 직접 확인하지 않아도됩니다. yyerror
에 제공된 오류 메시지를 인쇄하기 만하면됩니다. 스택 오버플로가 발생하면 오류 메시지에 그 사실이 표시됩니다.
스택의 크기를 조정하지 않는 yàcc 버전으로 끝낼 수있는 몇 가지 방법이 있습니다. 하나는 공개 도메인 Berkeley yacc의 사용이며, 흔히 byacc
이라고합니다. (1993 년부터) 기본 스택 크기를 500으로 설정합니다.
Gnu bison
을 사용하여 결과를 C++ 컴파일러로 컴파일하는 것도 가능합니다. 디폴트로, bison
은 의미 론적 가치 조합이 간단하게 복사 가능한지 여부를 알지 못하므로 스택을 비 - 재배치 가능하게 만듭니다. (바이슨의 최신 버전에는이 제한이 없을 수 있습니다.) 기본적으로 초기 바이슨 스택 크기는 200입니다.
스택을 날려 버리는 가장 일반적인 방법은 긴 목록에 올바른 재귀를 사용하는 것입니다. 특히 "프로그램"이 너무 길면 파서 스택 오버플로가 발생할 수 있습니다 :
program: /* empty */
| statement program
;
. 대개 왼쪽 재귀로 변경하면 충분합니다.
program: /* empty */
| program statement
;