SQLite

Check-in [ec9b19eb65]
Login

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview
Comment:The previous check-in had an error in the coverage reporting logic.
Downloads: Tarball | ZIP archive
Timelines: family | ancestors | descendants | both | lemon-improvements
Files: files | file ages | folders
SHA3-256: ec9b19eb652e81cd3c8a5595eb39aac3aca4abe72136c4b65c9cc257594a9c92
User & Date: drh 2017-12-27 17:36:58.482
Context
2017-12-27
18:19
Enhance the Lemon parser generator so that it creates a faster parser at the cost of slightly larger parser tables. Add the ability to measure coverage of the generated state machine when compiling with the -DYYCONVERGE option. In SQLite, add the SQLITE_TESTCTRL_PARSER_COVERAGE test-control to query the new parser coverage feature. (check-in: 1b22b42e59 user: drh tags: trunk)
17:36
The previous check-in had an error in the coverage reporting logic. (Closed-Leaf check-in: ec9b19eb65 user: drh tags: lemon-improvements)
17:14
Change the coverage measurement logic in the lemon-generated parser so that it only checks for coverage of state/lookahead pairs that are valid syntax. It turns out that some states are unreachable if the lookahead is not valid syntax, because the states are only reachable through a shift following a reduce, and the reduce does not happen if the lookahead is a syntax error. (check-in: 9dce465087 user: drh tags: lemon-improvements)
Changes
Unified Diff Ignore Whitespace Patch
Changes to tool/lempar.c.
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
#if defined(YYCOVERAGE)
int ParseCoverage(FILE *out){
  int stateno, iLookAhead, i;
  int nMissed = 0;
  for(stateno=0; stateno<YYNSTATE; stateno++){
    i = yy_shift_ofst[stateno];
    for(iLookAhead=0; iLookAhead<YYNTOKEN; iLookAhead++){
      if( yy_lookahead[i]!=iLookAhead ) continue;
      if( yycoverage[stateno][iLookAhead]==0 ) nMissed++;
      if( out ){
        fprintf(out,"State %d lookahead %s %s\n", stateno,
                yyTokenName[iLookAhead],
                yycoverage[stateno][iLookAhead] ? "ok" : "missed");
      }
    }







|







476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
#if defined(YYCOVERAGE)
int ParseCoverage(FILE *out){
  int stateno, iLookAhead, i;
  int nMissed = 0;
  for(stateno=0; stateno<YYNSTATE; stateno++){
    i = yy_shift_ofst[stateno];
    for(iLookAhead=0; iLookAhead<YYNTOKEN; iLookAhead++){
      if( yy_lookahead[i+iLookAhead]!=iLookAhead ) continue;
      if( yycoverage[stateno][iLookAhead]==0 ) nMissed++;
      if( out ){
        fprintf(out,"State %d lookahead %s %s\n", stateno,
                yyTokenName[iLookAhead],
                yycoverage[stateno][iLookAhead] ? "ok" : "missed");
      }
    }