Add ragel parser for the input file
authorMichael Spang <mspang@csclub.uwaterloo.ca>
Thu, 19 Nov 2009 05:18:31 +0000 (00:18 -0500)
committerMichael Spang <mspang@csclub.uwaterloo.ca>
Tue, 22 Dec 2009 03:09:49 +0000 (22:09 -0500)
Signed-off-by: Michael Spang <mspang@csclub.uwaterloo.ca>
Makefile
awesome.rl [new file with mode: 0644]

index f9fbc31..6f0111f 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,5 +1,15 @@
+all: magic awesome awesome.png
 magic: magic.cc
        g++ -o magic -g3 -Wall -Werror -lapt-pkg -lapt-inst magic.cc
+awesome: awesome.c
+       g++ -o awesome -g3 -Wall -Werror -lapt-pkg -lapt-inst awesome.c
+awesome.c: awesome.rl
+       ragel awesome.rl
+awesome.dot: awesome.rl
+       ragel -V awesome.rl -o awesome.dot
+awesome.png: awesome.dot
+       dot -Tpng -o awesome.png awesome.dot
+
 clean:
        rm -f magic
 
diff --git a/awesome.rl b/awesome.rl
new file mode 100644 (file)
index 0000000..4b04c7d
--- /dev/null
@@ -0,0 +1,82 @@
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+%%{
+    machine inapt;
+
+    action pkgstart {
+      ts = p;
+    }
+
+    action pkgend {
+      te = p;
+
+      char *q;
+      printf("package: ");
+      for (q = ts; q <= te; q++) {
+        putchar(*q);
+      }
+      printf("\n");
+    }
+
+    package = ((lower | digit) (lower | digit | '+' | '-' | '.')+) >pkgstart %pkgend;
+    main := (package space+)*;
+}%%
+
+%% write data nofinal;
+
+#define BUFSIZE 128
+
+void scanner()
+{
+    static char buf[BUFSIZE];
+    int cs, have = 0;
+    int done = 0;
+    char *ts = 0, *te = 0;
+
+    %% write init;
+
+    while ( !done ) {
+        char *p = buf + have, *pe, *eof = 0;
+        int len, space = BUFSIZE - have;
+
+        if ( space == 0 ) {
+            /* We've used up the entire buffer storing an already-parsed token
+             * prefix that must be preserved. */
+            fprintf(stderr, "OUT OF BUFFER SPACE\n" );
+            exit(1);
+        }
+
+        len = fread( p, 1, space, stdin );
+        pe = p + len;
+
+        /* Check if this is the end of file. */
+        if ( len < space ) {
+            eof = pe;
+            done = 1;
+        }
+
+        %% write exec;
+
+        if ( cs == inapt_error ) {
+            fprintf(stderr, "PARSE ERROR\n" );
+            break;
+        }
+
+        have = 0;
+
+        if (ts) {
+            have = pe -ts;
+            memmove(buf, ts, have);
+            te = buf + (te - ts);
+            ts = buf;
+        }
+    }
+}
+
+int main()
+{
+    scanner();
+    return 0;
+}