Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Add a simple test case for Lemon. Always include assert.h in the Lemon-generated parser. |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA3-256: |
9c9c46dcbe92aeabe3d5675bb69681b6 |
User & Date: | drh 2018-11-27 14:34:33 |
Context
2018-11-27
| ||
14:41 | Remove the sqlite3PagerUseWal() routine which was made obsolete by the [81629ba91475938b6ad] change. (check-in: 4331b499 user: drh tags: trunk) | |
14:34 | Add a simple test case for Lemon. Always include assert.h in the Lemon-generated parser. (check-in: 9c9c46dc user: drh tags: trunk) | |
14:03 | Fix to the error handling logic in the Lemon parser template. This does not affect SQLite since SQLite does not use that part of the Lemon parser template. (check-in: c6dfc59e user: drh tags: trunk) | |
Changes
Changes to doc/lemon.html.
︙ | ︙ | |||
772 773 774 775 776 777 778 779 780 781 782 783 784 785 | <p><pre> %include {#include <unistd.h>} </pre></p> <p>This might be needed, for example, if some of the C actions in the grammar call functions that are prototyped in unistd.h.</p> <a name='pleft'></a> <h4>The <tt>%left</tt> directive</h4> The <tt>%left</tt> directive is used (along with the <tt><a href='#pright'>%right</a></tt> and <tt><a href='#pnonassoc'>%nonassoc</a></tt> directives) to declare | > > > | 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 | <p><pre> %include {#include <unistd.h>} </pre></p> <p>This might be needed, for example, if some of the C actions in the grammar call functions that are prototyped in unistd.h.</p> <p>Use the <tt><a href="#pcode">%code</a></tt> directive to add code to the end of the generated parser.</p> <a name='pleft'></a> <h4>The <tt>%left</tt> directive</h4> The <tt>%left</tt> directive is used (along with the <tt><a href='#pright'>%right</a></tt> and <tt><a href='#pnonassoc'>%nonassoc</a></tt> directives) to declare |
︙ | ︙ |
Added test/lemon-test01.y.
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | // A test case for the LEMON parser generator. Run as follows: // // lemon lemon-test01.y && gcc -g lemon-test01.c && ./a.out // %token_prefix TK_ %token_type int %default_type int %include { static int nSyntaxError = 0; static int nAccept = 0; static int nFailure = 0; } all ::= A B. all ::= error B. %syntax_error { nSyntaxError++; } %parse_accept { nAccept++; } %parse_failure { nFailure++; } %code { #include <assert.h> #include "lemon-test01.h" static int nTest = 0; static int nErr = 0; static int testCase(int testId, int shouldBe, int actual){ nTest++; if( shouldBe==actual ){ printf("test %d: ok\n", testId); }else{ printf("test %d: got %d, expected %d\n", testId, actual, shouldBe); nErr++; } } int main(int argc, char **argv){ yyParser xp; ParseInit(&xp); Parse(&xp, TK_A, 0); Parse(&xp, TK_B, 0); Parse(&xp, 0, 0); ParseFinalize(&xp); testCase(100, 0, nSyntaxError); testCase(110, 1, nAccept); testCase(120, 0, nFailure); nSyntaxError = nAccept = nFailure = 0; ParseInit(&xp); Parse(&xp, TK_B, 0); Parse(&xp, TK_B, 0); Parse(&xp, 0, 0); ParseFinalize(&xp); testCase(200, 1, nSyntaxError); testCase(210, 1, nAccept); testCase(220, 0, nFailure); nSyntaxError = nAccept = nFailure = 0; ParseInit(&xp); Parse(&xp, TK_A, 0); Parse(&xp, TK_A, 0); Parse(&xp, 0, 0); ParseFinalize(&xp); testCase(200, 1, nSyntaxError); testCase(210, 0, nAccept); testCase(220, 0, nFailure); if( nErr==0 ){ printf("%d tests pass\n", nTest); }else{ printf("%d errors out %d tests\n", nErr, nTest); } return nErr; } } |
Changes to tool/lempar.c.
︙ | ︙ | |||
19 20 21 22 23 24 25 26 27 28 29 30 31 32 | ** of this template is copied straight through into the generate parser ** source file. ** ** The following is the concatenation of all %include directives from the ** input grammar file: */ #include <stdio.h> /************ Begin %include sections from the grammar ************************/ %% /**************** End of %include directives **********************************/ /* These constants specify the various numeric values for terminal symbols ** in a format understandable to "makeheaders". This section is blank unless ** "lemon" is run with the "-m" command-line option. ***************** Begin makeheaders token definitions *************************/ | > | 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | ** of this template is copied straight through into the generate parser ** source file. ** ** The following is the concatenation of all %include directives from the ** input grammar file: */ #include <stdio.h> #include <assert.h> /************ Begin %include sections from the grammar ************************/ %% /**************** End of %include directives **********************************/ /* These constants specify the various numeric values for terminal symbols ** in a format understandable to "makeheaders". This section is blank unless ** "lemon" is run with the "-m" command-line option. ***************** Begin makeheaders token definitions *************************/ |
︙ | ︙ |