summaryrefslogtreecommitdiff
path: root/examples/clang.c
diff options
context:
space:
mode:
Diffstat (limited to 'examples/clang.c')
-rw-r--r--examples/clang.c456
1 files changed, 456 insertions, 0 deletions
diff --git a/examples/clang.c b/examples/clang.c
new file mode 100644
index 0000000..c8fb683
--- /dev/null
+++ b/examples/clang.c
@@ -0,0 +1,456 @@
+
+#line 1 "clang.rl"
+/*
+ * A mini C-like language scanner.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+
+#line 91 "clang.rl"
+
+
+
+#line 17 "clang.c"
+static const int clang_start = 10;
+static const int clang_error = 0;
+
+static const int clang_en_c_comment = 8;
+static const int clang_en_main = 10;
+
+
+#line 94 "clang.rl"
+
+#define BUFSIZE 128
+
+void scanner()
+{
+ static char buf[BUFSIZE];
+ int cs, act, have = 0, curline = 1;
+ char *ts, *te = 0;
+ int done = 0;
+
+
+#line 37 "clang.c"
+ {
+ cs = clang_start;
+ ts = 0;
+ te = 0;
+ act = 0;
+ }
+
+#line 105 "clang.rl"
+
+ 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;
+ }
+
+
+#line 68 "clang.c"
+ {
+ if ( p == pe )
+ goto _test_eof;
+ switch ( cs )
+ {
+tr2:
+#line 50 "clang.rl"
+ {te = p+1;{
+ printf( "double_lit(%i): ", curline );
+ fwrite( ts, 1, te-ts, stdout );
+ printf("\n");
+ }}
+ goto st10;
+tr6:
+#line 42 "clang.rl"
+ {te = p+1;{
+ printf( "single_lit(%i): ", curline );
+ fwrite( ts, 1, te-ts, stdout );
+ printf("\n");
+ }}
+ goto st10;
+tr8:
+#line 28 "clang.rl"
+ {{p = ((te))-1;}{
+ printf( "symbol(%i): %c\n", curline, ts[0] );
+ }}
+ goto st10;
+tr10:
+#line 12 "clang.rl"
+ {curline += 1;}
+#line 62 "clang.rl"
+ {te = p+1;}
+ goto st10;
+tr11:
+#line 68 "clang.rl"
+ {{p = ((te))-1;}{
+ printf( "int(%i): ", curline );
+ fwrite( ts, 1, te-ts, stdout );
+ printf("\n");
+ }}
+ goto st10;
+tr18:
+#line 57 "clang.rl"
+ {te = p+1;}
+ goto st10;
+tr19:
+#line 12 "clang.rl"
+ {curline += 1;}
+#line 57 "clang.rl"
+ {te = p+1;}
+ goto st10;
+tr20:
+#line 28 "clang.rl"
+ {te = p+1;{
+ printf( "symbol(%i): %c\n", curline, ts[0] );
+ }}
+ goto st10;
+tr25:
+#line 28 "clang.rl"
+ {te = p;p--;{
+ printf( "symbol(%i): %c\n", curline, ts[0] );
+ }}
+ goto st10;
+tr26:
+#line 64 "clang.rl"
+ {te = p+1;{ {goto st8;} }}
+ goto st10;
+tr27:
+#line 68 "clang.rl"
+ {te = p;p--;{
+ printf( "int(%i): ", curline );
+ fwrite( ts, 1, te-ts, stdout );
+ printf("\n");
+ }}
+ goto st10;
+tr30:
+#line 76 "clang.rl"
+ {te = p;p--;{
+ printf( "float(%i): ", curline );
+ fwrite( ts, 1, te-ts, stdout );
+ printf("\n");
+ }}
+ goto st10;
+tr31:
+#line 84 "clang.rl"
+ {te = p;p--;{
+ printf( "hex(%i): ", curline );
+ fwrite( ts, 1, te-ts, stdout );
+ printf("\n");
+ }}
+ goto st10;
+tr32:
+#line 34 "clang.rl"
+ {te = p;p--;{
+ printf( "ident(%i): ", curline );
+ fwrite( ts, 1, te-ts, stdout );
+ printf("\n");
+ }}
+ goto st10;
+st10:
+#line 1 "NONE"
+ {ts = 0;}
+ if ( ++p == pe )
+ goto _test_eof10;
+case 10:
+#line 1 "NONE"
+ {ts = p;}
+#line 176 "clang.c"
+ switch( (*p) ) {
+ case 10: goto tr19;
+ case 34: goto st1;
+ case 39: goto st3;
+ case 47: goto tr21;
+ case 48: goto tr22;
+ case 95: goto st16;
+ }
+ if ( (*p) < 65 ) {
+ if ( (*p) < 49 ) {
+ if ( 33 <= (*p) && (*p) <= 46 )
+ goto tr20;
+ } else if ( (*p) > 57 ) {
+ if ( 58 <= (*p) && (*p) <= 64 )
+ goto tr20;
+ } else
+ goto tr23;
+ } else if ( (*p) > 90 ) {
+ if ( (*p) < 97 ) {
+ if ( 91 <= (*p) && (*p) <= 96 )
+ goto tr20;
+ } else if ( (*p) > 122 ) {
+ if ( 123 <= (*p) && (*p) <= 126 )
+ goto tr20;
+ } else
+ goto st16;
+ } else
+ goto st16;
+ goto tr18;
+tr1:
+#line 12 "clang.rl"
+ {curline += 1;}
+ goto st1;
+st1:
+ if ( ++p == pe )
+ goto _test_eof1;
+case 1:
+#line 214 "clang.c"
+ switch( (*p) ) {
+ case 10: goto tr1;
+ case 34: goto tr2;
+ case 92: goto st2;
+ }
+ goto st1;
+st2:
+ if ( ++p == pe )
+ goto _test_eof2;
+case 2:
+ if ( (*p) == 10 )
+ goto tr1;
+ goto st1;
+tr5:
+#line 12 "clang.rl"
+ {curline += 1;}
+ goto st3;
+st3:
+ if ( ++p == pe )
+ goto _test_eof3;
+case 3:
+#line 236 "clang.c"
+ switch( (*p) ) {
+ case 10: goto tr5;
+ case 39: goto tr6;
+ case 92: goto st4;
+ }
+ goto st3;
+st4:
+ if ( ++p == pe )
+ goto _test_eof4;
+case 4:
+ if ( (*p) == 10 )
+ goto tr5;
+ goto st3;
+tr21:
+#line 1 "NONE"
+ {te = p+1;}
+ goto st11;
+st11:
+ if ( ++p == pe )
+ goto _test_eof11;
+case 11:
+#line 258 "clang.c"
+ switch( (*p) ) {
+ case 42: goto tr26;
+ case 47: goto st5;
+ }
+ goto tr25;
+st5:
+ if ( ++p == pe )
+ goto _test_eof5;
+case 5:
+ if ( (*p) == 10 )
+ goto tr10;
+ goto st5;
+tr22:
+#line 1 "NONE"
+ {te = p+1;}
+ goto st12;
+st12:
+ if ( ++p == pe )
+ goto _test_eof12;
+case 12:
+#line 279 "clang.c"
+ switch( (*p) ) {
+ case 46: goto st6;
+ case 120: goto st7;
+ }
+ if ( 48 <= (*p) && (*p) <= 57 )
+ goto tr23;
+ goto tr27;
+st6:
+ if ( ++p == pe )
+ goto _test_eof6;
+case 6:
+ if ( 48 <= (*p) && (*p) <= 57 )
+ goto st13;
+ goto tr11;
+st13:
+ if ( ++p == pe )
+ goto _test_eof13;
+case 13:
+ if ( 48 <= (*p) && (*p) <= 57 )
+ goto st13;
+ goto tr30;
+tr23:
+#line 1 "NONE"
+ {te = p+1;}
+ goto st14;
+st14:
+ if ( ++p == pe )
+ goto _test_eof14;
+case 14:
+#line 309 "clang.c"
+ if ( (*p) == 46 )
+ goto st6;
+ if ( 48 <= (*p) && (*p) <= 57 )
+ goto tr23;
+ goto tr27;
+st7:
+ if ( ++p == pe )
+ goto _test_eof7;
+case 7:
+ if ( (*p) < 65 ) {
+ if ( 48 <= (*p) && (*p) <= 57 )
+ goto st15;
+ } else if ( (*p) > 70 ) {
+ if ( 97 <= (*p) && (*p) <= 102 )
+ goto st15;
+ } else
+ goto st15;
+ goto tr11;
+st15:
+ if ( ++p == pe )
+ goto _test_eof15;
+case 15:
+ if ( (*p) < 65 ) {
+ if ( 48 <= (*p) && (*p) <= 57 )
+ goto st15;
+ } else if ( (*p) > 70 ) {
+ if ( 97 <= (*p) && (*p) <= 102 )
+ goto st15;
+ } else
+ goto st15;
+ goto tr31;
+st16:
+ if ( ++p == pe )
+ goto _test_eof16;
+case 16:
+ if ( (*p) == 95 )
+ goto st16;
+ if ( (*p) < 65 ) {
+ if ( 48 <= (*p) && (*p) <= 57 )
+ goto st16;
+ } else if ( (*p) > 90 ) {
+ if ( 97 <= (*p) && (*p) <= 122 )
+ goto st16;
+ } else
+ goto st16;
+ goto tr32;
+tr15:
+#line 12 "clang.rl"
+ {curline += 1;}
+ goto st8;
+st8:
+#line 1 "NONE"
+ {ts = 0;}
+ if ( ++p == pe )
+ goto _test_eof8;
+case 8:
+#line 366 "clang.c"
+ switch( (*p) ) {
+ case 10: goto tr15;
+ case 42: goto st9;
+ }
+ goto st8;
+st9:
+ if ( ++p == pe )
+ goto _test_eof9;
+case 9:
+ switch( (*p) ) {
+ case 10: goto tr15;
+ case 42: goto st9;
+ case 47: goto tr17;
+ }
+ goto st8;
+tr17:
+#line 16 "clang.rl"
+ {{goto st10;}}
+ goto st17;
+st17:
+ if ( ++p == pe )
+ goto _test_eof17;
+case 17:
+#line 390 "clang.c"
+ goto st0;
+st0:
+cs = 0;
+ goto _out;
+ }
+ _test_eof10: cs = 10; goto _test_eof;
+ _test_eof1: cs = 1; goto _test_eof;
+ _test_eof2: cs = 2; goto _test_eof;
+ _test_eof3: cs = 3; goto _test_eof;
+ _test_eof4: cs = 4; goto _test_eof;
+ _test_eof11: cs = 11; goto _test_eof;
+ _test_eof5: cs = 5; goto _test_eof;
+ _test_eof12: cs = 12; goto _test_eof;
+ _test_eof6: cs = 6; goto _test_eof;
+ _test_eof13: cs = 13; goto _test_eof;
+ _test_eof14: cs = 14; goto _test_eof;
+ _test_eof7: cs = 7; goto _test_eof;
+ _test_eof15: cs = 15; goto _test_eof;
+ _test_eof16: cs = 16; goto _test_eof;
+ _test_eof8: cs = 8; goto _test_eof;
+ _test_eof9: cs = 9; goto _test_eof;
+ _test_eof17: cs = 17; goto _test_eof;
+
+ _test_eof: {}
+ if ( p == eof )
+ {
+ switch ( cs ) {
+ case 11: goto tr25;
+ case 5: goto tr8;
+ case 12: goto tr27;
+ case 6: goto tr11;
+ case 13: goto tr30;
+ case 14: goto tr27;
+ case 7: goto tr11;
+ case 15: goto tr31;
+ case 16: goto tr32;
+ }
+ }
+
+ _out: {}
+ }
+
+#line 127 "clang.rl"
+
+ if ( cs == clang_error ) {
+ fprintf(stderr, "PARSE ERROR\n" );
+ break;
+ }
+
+ if ( ts == 0 )
+ have = 0;
+ else {
+ /* There is a prefix to preserve, shift it over. */
+ have = pe - ts;
+ memmove( buf, ts, have );
+ te = buf + (te-ts);
+ ts = buf;
+ }
+ }
+}
+
+int main()
+{
+ scanner();
+ return 0;
+}
+