summaryrefslogtreecommitdiffstats
path: root/test/lemon-test01.y
diff options
context:
space:
mode:
Diffstat (limited to 'test/lemon-test01.y')
-rw-r--r--test/lemon-test01.y75
1 files changed, 75 insertions, 0 deletions
diff --git a/test/lemon-test01.y b/test/lemon-test01.y
new file mode 100644
index 0000000..0fd514f
--- /dev/null
+++ b/test/lemon-test01.y
@@ -0,0 +1,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;
+ }
+}