/ Hex Artifact Content
Login

Artifact 58b764610fd934e189ffbb0bbfa33d171b9cb06019b55bdc04d090d6767e11d7:


0000: 2f 2f 20 41 20 74 65 73 74 20 63 61 73 65 20 66  // A test case f
0010: 6f 72 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72  or the LEMON par
0020: 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 20 20  ser generator.  
0030: 52 75 6e 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  Run as follows:.
0040: 2f 2f 0a 2f 2f 20 20 20 20 20 6c 65 6d 6f 6e 20  //.//     lemon 
0050: 6c 65 6d 6f 6e 2d 74 65 73 74 30 31 2e 79 20 26  lemon-test01.y &
0060: 26 20 67 63 63 20 2d 67 20 6c 65 6d 6f 6e 2d 74  & gcc -g lemon-t
0070: 65 73 74 30 31 2e 63 20 26 26 20 2e 2f 61 2e 6f  est01.c && ./a.o
0080: 75 74 0a 2f 2f 0a 25 74 6f 6b 65 6e 5f 70 72 65  ut.//.%token_pre
0090: 66 69 78 20 54 4b 5f 0a 25 74 6f 6b 65 6e 5f 74  fix TK_.%token_t
00a0: 79 70 65 20 20 20 69 6e 74 0a 25 64 65 66 61 75  ype   int.%defau
00b0: 6c 74 5f 74 79 70 65 20 69 6e 74 0a 25 69 6e 63  lt_type int.%inc
00c0: 6c 75 64 65 20 7b 0a 20 20 73 74 61 74 69 63 20  lude {.  static 
00d0: 69 6e 74 20 6e 53 79 6e 74 61 78 45 72 72 6f 72  int nSyntaxError
00e0: 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69   = 0;.  static i
00f0: 6e 74 20 6e 41 63 63 65 70 74 20 3d 20 30 3b 0a  nt nAccept = 0;.
0100: 20 20 73 74 61 74 69 63 20 69 6e 74 20 6e 46 61    static int nFa
0110: 69 6c 75 72 65 20 3d 20 30 3b 0a 7d 0a 0a 61 6c  ilure = 0;.}..al
0120: 6c 20 3a 3a 3d 20 20 41 20 42 2e 0a 61 6c 6c 20  l ::=  A B..all 
0130: 3a 3a 3d 20 20 65 72 72 6f 72 20 42 2e 0a 0a 25  ::=  error B...%
0140: 73 79 6e 74 61 78 5f 65 72 72 6f 72 20 7b 0a 20  syntax_error {. 
0150: 20 6e 53 79 6e 74 61 78 45 72 72 6f 72 2b 2b 3b   nSyntaxError++;
0160: 0a 7d 0a 25 70 61 72 73 65 5f 61 63 63 65 70 74  .}.%parse_accept
0170: 20 7b 0a 20 20 6e 41 63 63 65 70 74 2b 2b 3b 0a   {.  nAccept++;.
0180: 7d 0a 25 70 61 72 73 65 5f 66 61 69 6c 75 72 65  }.%parse_failure
0190: 20 7b 0a 20 20 6e 46 61 69 6c 75 72 65 2b 2b 3b   {.  nFailure++;
01a0: 0a 7d 0a 25 63 6f 64 65 20 7b 0a 20 20 23 69 6e  .}.%code {.  #in
01b0: 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e  clude <assert.h>
01c0: 0a 20 20 23 69 6e 63 6c 75 64 65 20 22 6c 65 6d  .  #include "lem
01d0: 6f 6e 2d 74 65 73 74 30 31 2e 68 22 0a 20 20 73  on-test01.h".  s
01e0: 74 61 74 69 63 20 69 6e 74 20 6e 54 65 73 74 20  tatic int nTest 
01f0: 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e  = 0;.  static in
0200: 74 20 6e 45 72 72 20 3d 20 30 3b 0a 20 20 73 74  t nErr = 0;.  st
0210: 61 74 69 63 20 69 6e 74 20 74 65 73 74 43 61 73  atic int testCas
0220: 65 28 69 6e 74 20 74 65 73 74 49 64 2c 20 69 6e  e(int testId, in
0230: 74 20 73 68 6f 75 6c 64 42 65 2c 20 69 6e 74 20  t shouldBe, int 
0240: 61 63 74 75 61 6c 29 7b 0a 20 20 20 20 6e 54 65  actual){.    nTe
0250: 73 74 2b 2b 3b 0a 20 20 20 20 69 66 28 20 73 68  st++;.    if( sh
0260: 6f 75 6c 64 42 65 3d 3d 61 63 74 75 61 6c 20 29  ouldBe==actual )
0270: 7b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22  {.      printf("
0280: 74 65 73 74 20 25 64 3a 20 6f 6b 5c 6e 22 2c 20  test %d: ok\n", 
0290: 74 65 73 74 49 64 29 3b 0a 20 20 20 20 7d 65 6c  testId);.    }el
02a0: 73 65 7b 0a 20 20 20 20 20 20 70 72 69 6e 74 66  se{.      printf
02b0: 28 22 74 65 73 74 20 25 64 3a 20 67 6f 74 20 25  ("test %d: got %
02c0: 64 2c 20 65 78 70 65 63 74 65 64 20 25 64 5c 6e  d, expected %d\n
02d0: 22 2c 20 74 65 73 74 49 64 2c 20 61 63 74 75 61  ", testId, actua
02e0: 6c 2c 20 73 68 6f 75 6c 64 42 65 29 3b 0a 20 20  l, shouldBe);.  
02f0: 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20      nErr++;.    
0300: 7d 0a 20 20 7d 0a 20 20 69 6e 74 20 6d 61 69 6e  }.  }.  int main
0310: 28 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20  (int argc, char 
0320: 2a 2a 61 72 67 76 29 7b 0a 20 20 20 20 79 79 50  **argv){.    yyP
0330: 61 72 73 65 72 20 78 70 3b 0a 20 20 20 20 50 61  arser xp;.    Pa
0340: 72 73 65 49 6e 69 74 28 26 78 70 29 3b 0a 20 20  rseInit(&xp);.  
0350: 20 20 50 61 72 73 65 28 26 78 70 2c 20 54 4b 5f    Parse(&xp, TK_
0360: 41 2c 20 30 29 3b 0a 20 20 20 20 50 61 72 73 65  A, 0);.    Parse
0370: 28 26 78 70 2c 20 54 4b 5f 42 2c 20 30 29 3b 0a  (&xp, TK_B, 0);.
0380: 20 20 20 20 50 61 72 73 65 28 26 78 70 2c 20 30      Parse(&xp, 0
0390: 2c 20 30 29 3b 0a 20 20 20 20 50 61 72 73 65 46  , 0);.    ParseF
03a0: 69 6e 61 6c 69 7a 65 28 26 78 70 29 3b 0a 20 20  inalize(&xp);.  
03b0: 20 20 74 65 73 74 43 61 73 65 28 31 30 30 2c 20    testCase(100, 
03c0: 30 2c 20 6e 53 79 6e 74 61 78 45 72 72 6f 72 29  0, nSyntaxError)
03d0: 3b 0a 20 20 20 20 74 65 73 74 43 61 73 65 28 31  ;.    testCase(1
03e0: 31 30 2c 20 31 2c 20 6e 41 63 63 65 70 74 29 3b  10, 1, nAccept);
03f0: 0a 20 20 20 20 74 65 73 74 43 61 73 65 28 31 32  .    testCase(12
0400: 30 2c 20 30 2c 20 6e 46 61 69 6c 75 72 65 29 3b  0, 0, nFailure);
0410: 0a 20 20 20 20 6e 53 79 6e 74 61 78 45 72 72 6f  .    nSyntaxErro
0420: 72 20 3d 20 6e 41 63 63 65 70 74 20 3d 20 6e 46  r = nAccept = nF
0430: 61 69 6c 75 72 65 20 3d 20 30 3b 0a 20 20 20 20  ailure = 0;.    
0440: 50 61 72 73 65 49 6e 69 74 28 26 78 70 29 3b 0a  ParseInit(&xp);.
0450: 20 20 20 20 50 61 72 73 65 28 26 78 70 2c 20 54      Parse(&xp, T
0460: 4b 5f 42 2c 20 30 29 3b 0a 20 20 20 20 50 61 72  K_B, 0);.    Par
0470: 73 65 28 26 78 70 2c 20 54 4b 5f 42 2c 20 30 29  se(&xp, TK_B, 0)
0480: 3b 0a 20 20 20 20 50 61 72 73 65 28 26 78 70 2c  ;.    Parse(&xp,
0490: 20 30 2c 20 30 29 3b 0a 20 20 20 20 50 61 72 73   0, 0);.    Pars
04a0: 65 46 69 6e 61 6c 69 7a 65 28 26 78 70 29 3b 0a  eFinalize(&xp);.
04b0: 20 20 20 20 74 65 73 74 43 61 73 65 28 32 30 30      testCase(200
04c0: 2c 20 31 2c 20 6e 53 79 6e 74 61 78 45 72 72 6f  , 1, nSyntaxErro
04d0: 72 29 3b 0a 20 20 20 20 74 65 73 74 43 61 73 65  r);.    testCase
04e0: 28 32 31 30 2c 20 31 2c 20 6e 41 63 63 65 70 74  (210, 1, nAccept
04f0: 29 3b 0a 20 20 20 20 74 65 73 74 43 61 73 65 28  );.    testCase(
0500: 32 32 30 2c 20 30 2c 20 6e 46 61 69 6c 75 72 65  220, 0, nFailure
0510: 29 3b 0a 20 20 20 20 6e 53 79 6e 74 61 78 45 72  );.    nSyntaxEr
0520: 72 6f 72 20 3d 20 6e 41 63 63 65 70 74 20 3d 20  ror = nAccept = 
0530: 6e 46 61 69 6c 75 72 65 20 3d 20 30 3b 0a 20 20  nFailure = 0;.  
0540: 20 20 50 61 72 73 65 49 6e 69 74 28 26 78 70 29    ParseInit(&xp)
0550: 3b 0a 20 20 20 20 50 61 72 73 65 28 26 78 70 2c  ;.    Parse(&xp,
0560: 20 54 4b 5f 41 2c 20 30 29 3b 0a 20 20 20 20 50   TK_A, 0);.    P
0570: 61 72 73 65 28 26 78 70 2c 20 54 4b 5f 41 2c 20  arse(&xp, TK_A, 
0580: 30 29 3b 0a 20 20 20 20 50 61 72 73 65 28 26 78  0);.    Parse(&x
0590: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 50 61  p, 0, 0);.    Pa
05a0: 72 73 65 46 69 6e 61 6c 69 7a 65 28 26 78 70 29  rseFinalize(&xp)
05b0: 3b 0a 20 20 20 20 74 65 73 74 43 61 73 65 28 32  ;.    testCase(2
05c0: 30 30 2c 20 31 2c 20 6e 53 79 6e 74 61 78 45 72  00, 1, nSyntaxEr
05d0: 72 6f 72 29 3b 0a 20 20 20 20 74 65 73 74 43 61  ror);.    testCa
05e0: 73 65 28 32 31 30 2c 20 30 2c 20 6e 41 63 63 65  se(210, 0, nAcce
05f0: 70 74 29 3b 0a 20 20 20 20 74 65 73 74 43 61 73  pt);.    testCas
0600: 65 28 32 32 30 2c 20 30 2c 20 6e 46 61 69 6c 75  e(220, 0, nFailu
0610: 72 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 45 72  re);.    if( nEr
0620: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 72  r==0 ){.      pr
0630: 69 6e 74 66 28 22 25 64 20 74 65 73 74 73 20 70  intf("%d tests p
0640: 61 73 73 5c 6e 22 2c 20 6e 54 65 73 74 29 3b 0a  ass\n", nTest);.
0650: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
0660: 20 70 72 69 6e 74 66 28 22 25 64 20 65 72 72 6f   printf("%d erro
0670: 72 73 20 6f 75 74 20 25 64 20 74 65 73 74 73 5c  rs out %d tests\
0680: 6e 22 2c 20 6e 45 72 72 2c 20 6e 54 65 73 74 29  n", nErr, nTest)
0690: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
06a0: 72 6e 20 6e 45 72 72 3b 0a 20 20 7d 0a 7d 0a     rn nErr;.  }.}.