gitlab.com/CoiaPrant/sqlite3@v1.19.1/testdata/tcl/lemon-test01.y (about)

     1  // A test case for the LEMON parser generator.  Run as follows:
     2  //
     3  //     lemon lemon-test01.y && gcc -g lemon-test01.c && ./a.out
     4  //
     5  %token_prefix TK_
     6  %token_type   int
     7  %default_type int
     8  %include {
     9    static int nSyntaxError = 0;
    10    static int nAccept = 0;
    11    static int nFailure = 0;
    12  }
    13  
    14  all ::=  A B.
    15  all ::=  error B.
    16  
    17  %syntax_error {
    18    nSyntaxError++;
    19  }
    20  %parse_accept {
    21    nAccept++;
    22  }
    23  %parse_failure {
    24    nFailure++;
    25  }
    26  %code {
    27    #include <assert.h>
    28    #include "lemon-test01.h"
    29    static int nTest = 0;
    30    static int nErr = 0;
    31    static int testCase(int testId, int shouldBe, int actual){
    32      nTest++;
    33      if( shouldBe==actual ){
    34        printf("test %d: ok\n", testId);
    35      }else{
    36        printf("test %d: got %d, expected %d\n", testId, actual, shouldBe);
    37        nErr++;
    38      }
    39    }
    40    int main(int argc, char **argv){
    41      yyParser xp;
    42      ParseInit(&xp);
    43      Parse(&xp, TK_A, 0);
    44      Parse(&xp, TK_B, 0);
    45      Parse(&xp, 0, 0);
    46      ParseFinalize(&xp);
    47      testCase(100, 0, nSyntaxError);
    48      testCase(110, 1, nAccept);
    49      testCase(120, 0, nFailure);
    50      nSyntaxError = nAccept = nFailure = 0;
    51      ParseInit(&xp);
    52      Parse(&xp, TK_B, 0);
    53      Parse(&xp, TK_B, 0);
    54      Parse(&xp, 0, 0);
    55      ParseFinalize(&xp);
    56      testCase(200, 1, nSyntaxError);
    57      testCase(210, 1, nAccept);
    58      testCase(220, 0, nFailure);
    59      nSyntaxError = nAccept = nFailure = 0;
    60      ParseInit(&xp);
    61      Parse(&xp, TK_A, 0);
    62      Parse(&xp, TK_A, 0);
    63      Parse(&xp, 0, 0);
    64      ParseFinalize(&xp);
    65      testCase(200, 1, nSyntaxError);
    66      testCase(210, 0, nAccept);
    67      testCase(220, 0, nFailure);
    68      if( nErr==0 ){
    69        printf("%d tests pass\n", nTest);
    70      }else{
    71        printf("%d errors out %d tests\n", nErr, nTest);
    72      }
    73      return nErr;
    74    }
    75  }