Added some examples of "--input custom" usage.
authorUlya Trofimovich <skvadrik@gmail.com>
Sun, 18 Jan 2015 15:56:06 +0000 (15:56 +0000)
committerUlya Trofimovich <skvadrik@gmail.com>
Sun, 18 Jan 2015 15:56:06 +0000 (15:56 +0000)
Had to modify .gitignore to unmask README in subfolders.

re2c/.gitignore
re2c/examples/input_custom/fixed.re [new file with mode: 0644]
re2c/examples/input_custom/simple/README [new file with mode: 0644]
re2c/examples/input_custom/simple/default.re [new file with mode: 0644]
re2c/examples/input_custom/simple/fgetc.re [new file with mode: 0644]
re2c/examples/input_custom/simple/istringstream.re [new file with mode: 0644]

index 02d05bb94daff3e608aec036a68fa50646159981..d6c5ade07a7364f87a97b9878a333c20f4459ab5 100644 (file)
@@ -7,7 +7,7 @@ re2c.spec
 autom4te.cache
 configure
 install-sh
-README
+/README
 aclocal.m4
 Makefile
 Makefile.in
diff --git a/re2c/examples/input_custom/fixed.re b/re2c/examples/input_custom/fixed.re
new file mode 100644 (file)
index 0000000..51f3b2b
--- /dev/null
@@ -0,0 +1,35 @@
+// Build with "--input custom" re2c switch.
+//
+// This is an example of handling fixed-length buffer with "--input custom":
+// on each YYPEEK we check for the end of input, thus YYFILL generation
+// can be safely suppressed.
+//
+// Note that YYLIMIT points not to terminating NULL, but to the previous
+// character: we emulate the case when input has no terminating NULL.
+//
+// For a real-life example see https://github.com/sopyer/mjson
+// or mjson.re from re2c test collection.
+
+bool lex (const char * cursor, const char * const limit)
+{
+    const char * marker;
+    const char * ctxmarker;
+#   define YYCTYPE        char
+#   define YYPEEK()       (cursor >= limit ? 0 : *cursor)
+#   define YYSKIP()       ++cursor
+#   define YYBACKUP()     marker = cursor
+#   define YYBACKUPCTX()  ctxmarker = cursor
+#   define YYRESTORE()    cursor = marker
+#   define YYRESTORECTX() cursor = ctxmarker
+    /*!re2c
+        re2c:yyfill:enable = 0;
+        "int buffer " / "[" [0-9]+ "]" { return true; }
+        *                              { return false; }
+    */
+}
+
+int main ()
+{
+    char buffer [] = "int buffer [1024]";
+    return !lex (buffer, buffer + sizeof (buffer) - 1);
+}
diff --git a/re2c/examples/input_custom/simple/README b/re2c/examples/input_custom/simple/README
new file mode 100644 (file)
index 0000000..60e5948
--- /dev/null
@@ -0,0 +1,20 @@
+Build with "--input custom" re2c switch.
+
+These are three examples of "--input custom" usage:
+
+- input_custom_default.re:
+    implements default re2c input model (pointers to plain buffer)
+
+- input_custom_fgetc:
+    implements C-style file input (using <stdio.h>)
+
+- input_custom_fgetc:
+    implements std::istringstream input
+
+Note that these examples are very simple and don't need
+to implement YYFILL; the only reason they don't use
+"re2c:yyfill:enable = 0;" is to keep YYEOI and YYLIMIT
+(for the sake of example).
+
+In real-life programs one will need to care for correct
+end-of-input handling.
diff --git a/re2c/examples/input_custom/simple/default.re b/re2c/examples/input_custom/simple/default.re
new file mode 100644 (file)
index 0000000..9078164
--- /dev/null
@@ -0,0 +1,24 @@
+bool lex (const char * cursor, const char * const limit)
+{
+    const char * marker;
+    const char * ctxmarker;
+#   define YYCTYPE        char
+#   define YYPEEK()       *cursor
+#   define YYSKIP()       ++cursor
+#   define YYBACKUP()     marker = cursor
+#   define YYBACKUPCTX()  ctxmarker = cursor
+#   define YYRESTORE()    cursor = marker
+#   define YYRESTORECTX() cursor = ctxmarker
+#   define YYEOI(n)       limit - cursor < n
+#   define YYFILL(n)      {}
+    /*!re2c
+        "int buffer " / "[" [0-9]+ "]" { return true; }
+        *                              { return false; }
+    */
+}
+
+int main ()
+{
+    char buffer [] = "int buffer [1024]";
+    return !lex (buffer, buffer + sizeof (buffer));
+}
diff --git a/re2c/examples/input_custom/simple/fgetc.re b/re2c/examples/input_custom/simple/fgetc.re
new file mode 100644 (file)
index 0000000..b6c3ef1
--- /dev/null
@@ -0,0 +1,43 @@
+#include <stdio.h>
+
+char peek (FILE * f)
+{
+    char c = fgetc (f);
+    ungetc (c, f);
+    return c;
+}
+
+bool lex (FILE * f, const long limit)
+{
+    long marker;
+    long ctxmarker;
+#   define YYCTYPE        char
+#   define YYPEEK()       peek (f)
+#   define YYSKIP()       fgetc (f)
+#   define YYBACKUP()     marker = ftell (f)
+#   define YYBACKUPCTX()  ctxmarker = ftell (f)
+#   define YYRESTORE()    fseek (f, marker, SEEK_SET)
+#   define YYRESTORECTX() fseek (f, ctxmarker, SEEK_SET)
+#   define YYEOI(n)       limit - ftell (f) < n
+#   define YYFILL(n)      {}
+    /*!re2c
+        "int buffer " / "[" [0-9]+ "]" { return true; }
+        *                              { return false; }
+    */
+}
+
+int main ()
+{
+    const char buffer [] = "int buffer [1024]";
+    const char fn [] = "input.txt";
+
+    FILE * f = fopen (fn, "w");
+    fwrite (buffer, 1, sizeof (buffer), f);
+    fclose (f);
+
+    f = fopen (fn, "rb");
+    int result = !lex (f, sizeof (buffer));
+    fclose (f);
+
+    return result;
+}
diff --git a/re2c/examples/input_custom/simple/istringstream.re b/re2c/examples/input_custom/simple/istringstream.re
new file mode 100644 (file)
index 0000000..35f4b00
--- /dev/null
@@ -0,0 +1,27 @@
+#include <sstream>
+
+bool lex (std::istringstream & is, const std::streampos limit)
+{
+    std::streampos marker;
+    std::streampos ctxmarker;
+#   define YYCTYPE        char
+#   define YYPEEK()       is.peek ()
+#   define YYSKIP()       is.ignore ()
+#   define YYBACKUP()     marker = is.tellg ()
+#   define YYBACKUPCTX()  ctxmarker = is.tellg ()
+#   define YYRESTORE()    is.seekg (marker)
+#   define YYRESTORECTX() is.seekg (ctxmarker)
+#   define YYEOI(n)       limit - is.tellg () < n
+#   define YYFILL(n)      {}
+    /*!re2c
+        "int buffer " / "[" [0-9]+ "]" { return true; }
+        *                              { return false; }
+    */
+}
+
+int main ()
+{
+    const char buffer [] = "int buffer [1024]";
+    std::istringstream is (buffer);
+    return !lex (is, sizeof (buffer));
+}