2016-10-07 5 views
0

이것은 SQLite의 레몬 파서에서 잠재적 인 버그가 아니라 파서가 어떻게 줄 었는지에 대한 오해 일 수 있습니다. 나는 데이터베이스 입력 파일을위한 간단한 문법을 ​​실험 해왔다. 데이터베이스는 적어도 하나의 엔트리 세트 목록, "명령"또는 "맵"또는 ...으로 구성됩니다.집합에 단 하나의 항목 만있는 경우 레몬 파서 어설 션 오류가 발생했습니다.

다음은 작동하지 않는 문법입니다 - 항목 세트를 작성하기 시작했습니다. 나는이는 "명령"입니다 :

database ::= entrylist. 

entrylist ::= entrylist entryset. 
entrylist ::= entryset. 

entryset ::= command. 

/* Commands are in the form %command [arguments] \n */ 

command ::= CMDNAME cmdargs EOL. 
cmdargs ::= cmdargs cmdarg. 
cmdargs ::= . 

cmdarg ::= INTEGER. 
cmdarg ::= TEXT. 

난 그냥 토큰에 공급하는 테스트 프로그램이 실행하면 내가 얻을 :

$ test 
Debug: Input 'CMDNAME' 
Debug: Shift 'CMDNAME', go to state 3 
Debug: Return. Stack=[CMDNAME] 
Debug: Input 'INTEGER' 
Assertion failed: stateno <= YY_SHIFT_COUNT, file testpar.c, line 513 

나는 entryset에게 추가로 다른 줄 경우

entryset ::= command. 
entryset ::= map. 
... 
map ::= MAPNAME EOL. 

모든 것이 예상대로 작동합니다. 나는 아마 당신이 a = b와 b :: = c 상황을 만들 수 없다고 생각한다. b :: = c |가 있어야합니다. 적어도. 이것이 내 실수인지 이해하고 싶습니다. SQLite는 메일 링리스트에 기록

+0

테스트 프로그램의 출처를 제공 할 수 있습니까? –

+0

사과 - SQLite 사용자 메일 링리스트에 버그를 기록했습니다 (http://www.mail-archive.com/[email protected]/msg99716.html). – carveone

답변

1

레몬 테이블의 끝에서 기본 동작을 제거하기 위해 시프트 테이블을 압축합니다. 아마도 기본 동작은 다른 곳에서 처리되어야하지만 그렇지 않습니다. 예를 들어 테이블이 압축되어 기본 동작이 발생하면 YY_MAX_SHIFTYY_SHIFT_COUNT이 동기화되지 않고 어설 션이 트리거됩니다.

while(n>0 && lemp->sorted[n-1]->iTknOfst==NO_OFFSET) n--; 

압축을 방지하고 버그를 방지하기 위해 : lemon.c에서

, 라인 4235 주위에, 당신은이 라인을 주석 처리 할 수 ​​있습니다. 압축

생성 된 코드 :

#define YY_MAX_SHIFT   3 
#define YY_SHIFT_COUNT (2) 
#define YY_SHIFT_USE_DFLT (13) 
static const unsigned char yy_shift_ofst[] = { 
/*  0 */  7, 1, 6, 
}; 

생성 된 코드를 압축하지 않고는 :

#define YY_MAX_SHIFT   3 
#define YY_SHIFT_COUNT (3) 
#define YY_SHIFT_USE_DFLT (13) 
static const unsigned char yy_shift_ofst[] = { 
/*  0 */  7, 1, 6, 13, 
}; 

나는 올해 초 SQLite는 메일 링리스트에 세부 사항을 제출하지만 아무것도 아직 일어나지 않았다. 올바른 해결책은 압축을 계속하는 것이지만 템플릿의 기본 동작을 처리하는 것입니다.