From f968d82d75503f627cfcd9379b6722e47dbe10d1 Mon Sep 17 00:00:00 2001 From: Ulya Trofimovich Date: Sun, 18 Jan 2015 15:56:06 +0000 Subject: [PATCH] Added some examples of "--input custom" usage. Had to modify .gitignore to unmask README in subfolders. --- re2c/.gitignore | 2 +- re2c/examples/input_custom/fixed.re | 35 +++++++++++++++ re2c/examples/input_custom/simple/README | 20 +++++++++ re2c/examples/input_custom/simple/default.re | 24 +++++++++++ re2c/examples/input_custom/simple/fgetc.re | 43 +++++++++++++++++++ .../input_custom/simple/istringstream.re | 27 ++++++++++++ 6 files changed, 150 insertions(+), 1 deletion(-) create mode 100644 re2c/examples/input_custom/fixed.re create mode 100644 re2c/examples/input_custom/simple/README create mode 100644 re2c/examples/input_custom/simple/default.re create mode 100644 re2c/examples/input_custom/simple/fgetc.re create mode 100644 re2c/examples/input_custom/simple/istringstream.re diff --git a/re2c/.gitignore b/re2c/.gitignore index 02d05bb9..d6c5ade0 100644 --- a/re2c/.gitignore +++ b/re2c/.gitignore @@ -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 index 00000000..51f3b2b0 --- /dev/null +++ b/re2c/examples/input_custom/fixed.re @@ -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 index 00000000..60e5948e --- /dev/null +++ b/re2c/examples/input_custom/simple/README @@ -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 ) + +- 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 index 00000000..90781642 --- /dev/null +++ b/re2c/examples/input_custom/simple/default.re @@ -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 index 00000000..b6c3ef1d --- /dev/null +++ b/re2c/examples/input_custom/simple/fgetc.re @@ -0,0 +1,43 @@ +#include + +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 index 00000000..35f4b002 --- /dev/null +++ b/re2c/examples/input_custom/simple/istringstream.re @@ -0,0 +1,27 @@ +#include + +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)); +} -- 2.40.0