You can subscribe to this list here.
2006 |
Jan
|
Feb
|
Mar
|
Apr
|
May
(4) |
Jun
(35) |
Jul
(11) |
Aug
(5) |
Sep
|
Oct
(1) |
Nov
(2) |
Dec
|
---|---|---|---|---|---|---|---|---|---|---|---|---|
2007 |
Jan
(10) |
Feb
(33) |
Mar
(8) |
Apr
(60) |
May
(40) |
Jun
(13) |
Jul
(3) |
Aug
(10) |
Sep
|
Oct
|
Nov
|
Dec
|
2008 |
Jan
(19) |
Feb
(14) |
Mar
(38) |
Apr
(3) |
May
(10) |
Jun
|
Jul
|
Aug
(6) |
Sep
(2) |
Oct
|
Nov
(13) |
Dec
(1) |
2009 |
Jan
(5) |
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2011 |
Jan
(1) |
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
(2) |
Oct
|
Nov
|
Dec
|
2012 |
Jan
|
Feb
(1) |
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2013 |
Jan
(1) |
Feb
|
Mar
|
Apr
|
May
|
Jun
(4) |
Jul
(1) |
Aug
|
Sep
(1) |
Oct
|
Nov
|
Dec
(6) |
2014 |
Jan
(2) |
Feb
(3) |
Mar
|
Apr
|
May
|
Jun
|
Jul
(11) |
Aug
(1) |
Sep
|
Oct
|
Nov
|
Dec
|
2015 |
Jan
(13) |
Feb
(5) |
Mar
(1) |
Apr
|
May
(1) |
Jun
|
Jul
(12) |
Aug
|
Sep
|
Oct
|
Nov
(2) |
Dec
(1) |
2016 |
Jan
(3) |
Feb
(5) |
Mar
(1) |
Apr
|
May
|
Jun
|
Jul
|
Aug
(2) |
Sep
|
Oct
(1) |
Nov
|
Dec
|
2017 |
Jan
(1) |
Feb
|
Mar
(2) |
Apr
(3) |
May
(2) |
Jun
|
Jul
(1) |
Aug
(1) |
Sep
(1) |
Oct
|
Nov
|
Dec
(2) |
2018 |
Jan
|
Feb
|
Mar
(1) |
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2019 |
Jan
|
Feb
(2) |
Mar
(1) |
Apr
(1) |
May
(2) |
Jun
|
Jul
|
Aug
(2) |
Sep
|
Oct
|
Nov
|
Dec
|
2020 |
Jan
(2) |
Feb
(3) |
Mar
|
Apr
(1) |
May
(4) |
Jun
|
Jul
(3) |
Aug
(1) |
Sep
(5) |
Oct
(9) |
Nov
(5) |
Dec
(3) |
2021 |
Jan
(1) |
Feb
(3) |
Mar
(2) |
Apr
(3) |
May
(1) |
Jun
|
Jul
|
Aug
|
Sep
(1) |
Oct
(1) |
Nov
(2) |
Dec
(1) |
2022 |
Jan
(2) |
Feb
(4) |
Mar
(4) |
Apr
(2) |
May
(2) |
Jun
(4) |
Jul
(3) |
Aug
(5) |
Sep
(1) |
Oct
(3) |
Nov
(1) |
Dec
(2) |
2023 |
Jan
(2) |
Feb
|
Mar
(2) |
Apr
|
May
(3) |
Jun
(2) |
Jul
(1) |
Aug
(1) |
Sep
|
Oct
(1) |
Nov
(1) |
Dec
(1) |
2024 |
Jan
(1) |
Feb
(4) |
Mar
(7) |
Apr
(1) |
May
(1) |
Jun
(2) |
Jul
(1) |
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: <he...@us...> - 2007-03-01 00:38:24
|
Revision: 654 http://svn.sourceforge.net/re2c/?rev=654&view=rev Author: helly Date: 2007-02-28 16:38:23 -0800 (Wed, 28 Feb 2007) Log Message: ----------- - Drop 0.11.3 header for now Modified Paths: -------------- trunk/re2c/htdocs/index.html Modified: trunk/re2c/htdocs/index.html =================================================================== --- trunk/re2c/htdocs/index.html 2007-03-01 00:35:12 UTC (rev 653) +++ trunk/re2c/htdocs/index.html 2007-03-01 00:38:23 UTC (rev 654) @@ -79,7 +79,6 @@ </ul> <hr /> <h1>Changelog</h1> -<h2>2007-??-??: 0.11.2</h2> <h2>2007-03-01: 0.11.2</h2> <ul> <li>Added inplace configuration 're2c:yyfill:parameter'.</li> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <he...@us...> - 2007-03-01 00:35:14
|
Revision: 653 http://svn.sourceforge.net/re2c/?rev=653&view=rev Author: helly Date: 2007-02-28 16:35:12 -0800 (Wed, 28 Feb 2007) Log Message: ----------- - Set release date Modified Paths: -------------- tags/RELEASE_0_11_2/re2c/CHANGELOG Modified: tags/RELEASE_0_11_2/re2c/CHANGELOG =================================================================== --- tags/RELEASE_0_11_2/re2c/CHANGELOG 2007-02-28 23:09:26 UTC (rev 652) +++ tags/RELEASE_0_11_2/re2c/CHANGELOG 2007-03-01 00:35:12 UTC (rev 653) @@ -1,4 +1,4 @@ -Version 0.11.2 (????-??-??) +Version 0.11.2 (2007-03-01) --------------------------- - Added inplace configuration 're2c:yyfill:parameter'. - Added inplace configuration 're2c:yych:conversion'. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <he...@us...> - 2007-02-28 23:09:28
|
Revision: 652 http://svn.sourceforge.net/re2c/?rev=652&view=rev Author: helly Date: 2007-02-28 15:09:26 -0800 (Wed, 28 Feb 2007) Log Message: ----------- - This is 0.11.3.dev now Modified Paths: -------------- trunk/re2c/config_w32.h Modified: trunk/re2c/config_w32.h =================================================================== --- trunk/re2c/config_w32.h 2007-02-28 23:07:14 UTC (rev 651) +++ trunk/re2c/config_w32.h 2007-02-28 23:09:26 UTC (rev 652) @@ -63,13 +63,13 @@ #define PACKAGE_NAME "re2c" /* Define to the full name and version of this package. */ -#define PACKAGE_STRING "re2c 0.11.2.dev" +#define PACKAGE_STRING "re2c 0.11.3.dev" /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "re2c" /* Define to the version of this package. */ -#define PACKAGE_VERSION "0.11.2.dev" +#define PACKAGE_VERSION "0.11.3.dev" /* The size of a `char', as computed by sizeof. */ #define SIZEOF_CHAR 1 @@ -87,7 +87,7 @@ #define STDC_HEADERS 1 /* Version number of package */ -#define VERSION "0.11.2.dev" +#define VERSION "0.11.3.dev" /* Define to empty if `const' does not conform to ANSI C. */ /* #undef const */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <he...@us...> - 2007-02-28 23:07:22
|
Revision: 651 http://svn.sourceforge.net/re2c/?rev=651&view=rev Author: helly Date: 2007-02-28 15:07:14 -0800 (Wed, 28 Feb 2007) Log Message: ----------- - Set release date and repackage Modified Paths: -------------- tags/RELEASE_0_11_2/re2c/htdocs/index.html tags/RELEASE_0_11_2/re2c/htdocs/manual.html tags/RELEASE_0_11_2/re2c/re2c-0.11.2-1.src.rpm tags/RELEASE_0_11_2/re2c/re2c-0.11.2-src.zip tags/RELEASE_0_11_2/re2c/re2c-0.11.2.tar.gz Modified: tags/RELEASE_0_11_2/re2c/htdocs/index.html =================================================================== --- tags/RELEASE_0_11_2/re2c/htdocs/index.html 2007-02-28 23:05:33 UTC (rev 650) +++ tags/RELEASE_0_11_2/re2c/htdocs/index.html 2007-02-28 23:07:14 UTC (rev 651) @@ -79,8 +79,11 @@ </ul> <hr /> <h1>Changelog</h1> -<h2>2007-??-??: 0.11.2</h2> +<h2>2007-03-01: 0.11.2</h2> <ul> +<li>Added inplace configuration 're2c:yyfill:parameter'.</li> +<li>Added inplace configuration 're2c:yych:conversion'.</li> +<li>Fixed -u switch code generation.</li> <li>Added ability to avoid defines and overwrite generated variable names.</li> </ul> <h2>2007-02-20: 0.11.1</h2> Modified: tags/RELEASE_0_11_2/re2c/htdocs/manual.html =================================================================== --- tags/RELEASE_0_11_2/re2c/htdocs/manual.html 2007-02-28 23:05:33 UTC (rev 650) +++ tags/RELEASE_0_11_2/re2c/htdocs/manual.html 2007-02-28 23:07:14 UTC (rev 651) @@ -7,7 +7,7 @@ <body> <h1>RE2C</h1> Section: User Commands (1)<br /> -Updated: 20 Feb 2007<br /> +Updated: 01 Mar 2007<br /> <a href="#index">Index</a> <hr /> <a name="lbAB" id="lbAB"> </a> @@ -513,6 +513,6 @@ <br /> <hr /> <p>This document was created by man2html, using the manual pages.<br /> -Time: 00:00:00 GMT, February 20, 2007</p> +Time: 00:00:00 GMT, March 01, 2007</p> </body> </html> Modified: tags/RELEASE_0_11_2/re2c/re2c-0.11.2-1.src.rpm =================================================================== (Binary files differ) Modified: tags/RELEASE_0_11_2/re2c/re2c-0.11.2-src.zip =================================================================== (Binary files differ) Modified: tags/RELEASE_0_11_2/re2c/re2c-0.11.2.tar.gz =================================================================== (Binary files differ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <he...@us...> - 2007-02-28 23:05:34
|
Revision: 650 http://svn.sourceforge.net/re2c/?rev=650&view=rev Author: helly Date: 2007-02-28 15:05:33 -0800 (Wed, 28 Feb 2007) Log Message: ----------- - Update bootsrap Modified Paths: -------------- tags/RELEASE_0_11_2/re2c/bootstrap/scanner.cc Modified: tags/RELEASE_0_11_2/re2c/bootstrap/scanner.cc =================================================================== --- tags/RELEASE_0_11_2/re2c/bootstrap/scanner.cc 2007-02-28 23:00:19 UTC (rev 649) +++ tags/RELEASE_0_11_2/re2c/bootstrap/scanner.cc 2007-02-28 23:05:33 UTC (rev 650) @@ -1,4 +1,4 @@ -/* Generated by re2c 0.11.0.dev on Sat Jul 29 22:25:10 2006 */ +/* Generated by re2c 0.11.2 on Wed Feb 28 18:03:46 2007 */ #line 1 "scanner.re" /* $Id$ */ #include <stdlib.h> @@ -350,7 +350,7 @@ goto value; } { - static unsigned char yybm[] = { + static const unsigned char yybm[] = { 112, 112, 112, 112, 112, 112, 112, 112, 112, 114, 0, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, @@ -822,7 +822,7 @@ code: { - static unsigned char yybm[] = { + static const unsigned char yybm[] = { 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 0, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, @@ -1028,7 +1028,7 @@ config: { - static unsigned char yybm[] = { + static const unsigned char yybm[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -1123,7 +1123,7 @@ value: { - static unsigned char yybm[] = { + static const unsigned char yybm[] = { 248, 248, 248, 248, 248, 248, 248, 248, 248, 192, 0, 248, 248, 192, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <he...@us...> - 2007-02-28 23:00:23
|
Revision: 649 http://svn.sourceforge.net/re2c/?rev=649&view=rev Author: helly Date: 2007-02-28 15:00:19 -0800 (Wed, 28 Feb 2007) Log Message: ----------- - This is 0.11.3.dev now Modified Paths: -------------- trunk/re2c/CHANGELOG trunk/re2c/configure.in trunk/re2c/htdocs/index.html trunk/re2c/htdocs/manual.html Modified: trunk/re2c/CHANGELOG =================================================================== --- trunk/re2c/CHANGELOG 2007-02-28 22:57:31 UTC (rev 648) +++ trunk/re2c/CHANGELOG 2007-02-28 23:00:19 UTC (rev 649) @@ -1,5 +1,8 @@ -Version 0.11.2 (????-??-??) +Version 0.11.3 (????-??-??) --------------------------- + +Version 0.11.2 (2007-03-01) +--------------------------- - Added inplace configuration 're2c:yyfill:parameter'. - Added inplace configuration 're2c:yych:conversion'. - Fixed -u switch code generation. Modified: trunk/re2c/configure.in =================================================================== --- trunk/re2c/configure.in 2007-02-28 22:57:31 UTC (rev 648) +++ trunk/re2c/configure.in 2007-02-28 23:00:19 UTC (rev 649) @@ -1,5 +1,5 @@ AC_PREREQ([2.57]) -AC_INIT(re2c, 0.11.2.dev, re2...@li...) +AC_INIT(re2c, 0.11.3.dev, re2...@li...) AM_INIT_AUTOMAKE(re2c, $PACKAGE_VERSION) AC_CONFIG_SRCDIR(actions.cc) AM_CONFIG_HEADER(config.h) Modified: trunk/re2c/htdocs/index.html =================================================================== --- trunk/re2c/htdocs/index.html 2007-02-28 22:57:31 UTC (rev 648) +++ trunk/re2c/htdocs/index.html 2007-02-28 23:00:19 UTC (rev 649) @@ -80,7 +80,11 @@ <hr /> <h1>Changelog</h1> <h2>2007-??-??: 0.11.2</h2> +<h2>2007-03-01: 0.11.2</h2> <ul> +<li>Added inplace configuration 're2c:yyfill:parameter'.</li> +<li>Added inplace configuration 're2c:yych:conversion'.</li> +<li>Fixed -u switch code generation.</li> <li>Added ability to avoid defines and overwrite generated variable names.</li> </ul> <h2>2007-02-20: 0.11.1</h2> Modified: trunk/re2c/htdocs/manual.html =================================================================== --- trunk/re2c/htdocs/manual.html 2007-02-28 22:57:31 UTC (rev 648) +++ trunk/re2c/htdocs/manual.html 2007-02-28 23:00:19 UTC (rev 649) @@ -489,7 +489,7 @@ <br /> <a name="lbAO" id="lbAO"> </a> <h2>VERSION INFORMATION</h2> -<p>This manpage describes <b>re2c</b>, version 0.11.2.</p> +<p>This manpage describes <b>re2c</b>, version 0.11.3.</p> <hr /> <a name="index" id="index"> </a> <h2>Index</h2> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <he...@us...> - 2007-02-28 22:57:40
|
Revision: 648 http://svn.sourceforge.net/re2c/?rev=648&view=rev Author: helly Date: 2007-02-28 14:57:31 -0800 (Wed, 28 Feb 2007) Log Message: ----------- - Add release 0.11.2 Added Paths: ----------- tags/RELEASE_0_11_2/ tags/RELEASE_0_11_2/re2c/ tags/RELEASE_0_11_2/re2c/CHANGELOG tags/RELEASE_0_11_2/re2c/Makefile.am tags/RELEASE_0_11_2/re2c/code.cc tags/RELEASE_0_11_2/re2c/code_names.h tags/RELEASE_0_11_2/re2c/config_w32.h tags/RELEASE_0_11_2/re2c/configure.in tags/RELEASE_0_11_2/re2c/globals.h tags/RELEASE_0_11_2/re2c/htdocs/index.html tags/RELEASE_0_11_2/re2c/htdocs/manual.html tags/RELEASE_0_11_2/re2c/lessons/001_upn_calculator/calc_001.c tags/RELEASE_0_11_2/re2c/lessons/001_upn_calculator/calc_001.re tags/RELEASE_0_11_2/re2c/lessons/001_upn_calculator/calc_002.c tags/RELEASE_0_11_2/re2c/lessons/001_upn_calculator/calc_002.re tags/RELEASE_0_11_2/re2c/lessons/001_upn_calculator/calc_003.c tags/RELEASE_0_11_2/re2c/lessons/001_upn_calculator/calc_003.re tags/RELEASE_0_11_2/re2c/lessons/001_upn_calculator/calc_004.c tags/RELEASE_0_11_2/re2c/lessons/001_upn_calculator/calc_004.re tags/RELEASE_0_11_2/re2c/lessons/001_upn_calculator/calc_005.c tags/RELEASE_0_11_2/re2c/lessons/001_upn_calculator/calc_005.re tags/RELEASE_0_11_2/re2c/lessons/001_upn_calculator/calc_006.s.c tags/RELEASE_0_11_2/re2c/lessons/001_upn_calculator/calc_006.s.re tags/RELEASE_0_11_2/re2c/lessons/001_upn_calculator/calc_007.b.c tags/RELEASE_0_11_2/re2c/lessons/001_upn_calculator/calc_007.b.re tags/RELEASE_0_11_2/re2c/lessons/001_upn_calculator/calc_008.b.c tags/RELEASE_0_11_2/re2c/lessons/001_upn_calculator/calc_008.b.re tags/RELEASE_0_11_2/re2c/lessons/001_upn_calculator/windows/main.b.c tags/RELEASE_0_11_2/re2c/lessons/001_upn_calculator/windows/main.b.re tags/RELEASE_0_11_2/re2c/lessons/002_strip_comments/strip_001.s.c tags/RELEASE_0_11_2/re2c/lessons/002_strip_comments/strip_001.s.re tags/RELEASE_0_11_2/re2c/lessons/002_strip_comments/strip_002.s.c tags/RELEASE_0_11_2/re2c/lessons/002_strip_comments/strip_002.s.re tags/RELEASE_0_11_2/re2c/lessons/002_strip_comments/strip_003.b.c tags/RELEASE_0_11_2/re2c/lessons/002_strip_comments/strip_003.b.re tags/RELEASE_0_11_2/re2c/main.cc tags/RELEASE_0_11_2/re2c/re2c-0.11.2-1.src.rpm tags/RELEASE_0_11_2/re2c/re2c-0.11.2-bin.zip tags/RELEASE_0_11_2/re2c/re2c-0.11.2-src.zip tags/RELEASE_0_11_2/re2c/re2c-0.11.2.tar.gz tags/RELEASE_0_11_2/re2c/re2c.1.in tags/RELEASE_0_11_2/re2c/test/bug1472770.b.c tags/RELEASE_0_11_2/re2c/test/bug1479044.b.c tags/RELEASE_0_11_2/re2c/test/config10.c tags/RELEASE_0_11_2/re2c/test/config10.re tags/RELEASE_0_11_2/re2c/test/config8.c tags/RELEASE_0_11_2/re2c/test/config8.re tags/RELEASE_0_11_2/re2c/test/config9.b.c tags/RELEASE_0_11_2/re2c/test/config9.b.re tags/RELEASE_0_11_2/re2c/test/ctx.b.c tags/RELEASE_0_11_2/re2c/test/cvsignore.b.c tags/RELEASE_0_11_2/re2c/test/cvsignore.u.c tags/RELEASE_0_11_2/re2c/test/cvsignore.u.re tags/RELEASE_0_11_2/re2c/test/cvsignore.ub.c tags/RELEASE_0_11_2/re2c/test/cvsignore.ub.re tags/RELEASE_0_11_2/re2c/test/cvsignore.wb.c tags/RELEASE_0_11_2/re2c/test/input11.b.c tags/RELEASE_0_11_2/re2c/test/parse_date.b.c tags/RELEASE_0_11_2/re2c/test/parse_date.db.c tags/RELEASE_0_11_2/re2c/test/parse_date.g.c tags/RELEASE_0_11_2/re2c/test/push.fb.c tags/RELEASE_0_11_2/re2c/test/push.fg.c Removed Paths: ------------- tags/RELEASE_0_11_2/re2c/CHANGELOG tags/RELEASE_0_11_2/re2c/Makefile.am tags/RELEASE_0_11_2/re2c/code.cc tags/RELEASE_0_11_2/re2c/config_w32.h tags/RELEASE_0_11_2/re2c/configure.in tags/RELEASE_0_11_2/re2c/globals.h tags/RELEASE_0_11_2/re2c/htdocs/index.html tags/RELEASE_0_11_2/re2c/htdocs/manual.html tags/RELEASE_0_11_2/re2c/lessons/001_upn_calculator/calc_001.c tags/RELEASE_0_11_2/re2c/lessons/001_upn_calculator/calc_001.re tags/RELEASE_0_11_2/re2c/lessons/001_upn_calculator/calc_002.c tags/RELEASE_0_11_2/re2c/lessons/001_upn_calculator/calc_002.re tags/RELEASE_0_11_2/re2c/lessons/001_upn_calculator/calc_003.c tags/RELEASE_0_11_2/re2c/lessons/001_upn_calculator/calc_003.re tags/RELEASE_0_11_2/re2c/lessons/001_upn_calculator/calc_004.c tags/RELEASE_0_11_2/re2c/lessons/001_upn_calculator/calc_004.re tags/RELEASE_0_11_2/re2c/lessons/001_upn_calculator/calc_005.c tags/RELEASE_0_11_2/re2c/lessons/001_upn_calculator/calc_005.re tags/RELEASE_0_11_2/re2c/lessons/001_upn_calculator/calc_006.s.c tags/RELEASE_0_11_2/re2c/lessons/001_upn_calculator/calc_006.s.re tags/RELEASE_0_11_2/re2c/lessons/001_upn_calculator/calc_007.b.c tags/RELEASE_0_11_2/re2c/lessons/001_upn_calculator/calc_007.b.re tags/RELEASE_0_11_2/re2c/lessons/001_upn_calculator/windows/main.b.c tags/RELEASE_0_11_2/re2c/lessons/001_upn_calculator/windows/main.b.re tags/RELEASE_0_11_2/re2c/lessons/002_strip_comments/strip_001.s.c tags/RELEASE_0_11_2/re2c/lessons/002_strip_comments/strip_001.s.re tags/RELEASE_0_11_2/re2c/lessons/002_strip_comments/strip_002.s.c tags/RELEASE_0_11_2/re2c/lessons/002_strip_comments/strip_002.s.re tags/RELEASE_0_11_2/re2c/lessons/002_strip_comments/strip_003.b.c tags/RELEASE_0_11_2/re2c/lessons/002_strip_comments/strip_003.b.re tags/RELEASE_0_11_2/re2c/main.cc tags/RELEASE_0_11_2/re2c/re2c.1.in tags/RELEASE_0_11_2/re2c/test/bug1472770.b.c tags/RELEASE_0_11_2/re2c/test/bug1479044.b.c tags/RELEASE_0_11_2/re2c/test/ctx.b.c tags/RELEASE_0_11_2/re2c/test/cvsignore.b.c tags/RELEASE_0_11_2/re2c/test/cvsignore.u.c tags/RELEASE_0_11_2/re2c/test/cvsignore.u.re tags/RELEASE_0_11_2/re2c/test/cvsignore.wb.c tags/RELEASE_0_11_2/re2c/test/input11.b.c tags/RELEASE_0_11_2/re2c/test/parse_date.b.c tags/RELEASE_0_11_2/re2c/test/parse_date.db.c tags/RELEASE_0_11_2/re2c/test/parse_date.g.c tags/RELEASE_0_11_2/re2c/test/push.fb.c tags/RELEASE_0_11_2/re2c/test/push.fg.c Copied: tags/RELEASE_0_11_2/re2c (from rev 613, trunk/re2c) Deleted: tags/RELEASE_0_11_2/re2c/CHANGELOG =================================================================== --- trunk/re2c/CHANGELOG 2007-01-02 17:01:21 UTC (rev 613) +++ tags/RELEASE_0_11_2/re2c/CHANGELOG 2007-02-28 22:57:31 UTC (rev 648) @@ -1,159 +0,0 @@ -Version 0.11.0 (2007-01-01) ---------------------------- -- Added -u switch to support unicode. - -Version 0.10.6 (2006-08-05) ---------------------------- -- Fixed #1529351 Segv bug on unterminated code blocks. -- Fixed #1528269 Invalid code generation. - -Version 0.10.5 (2006-06-11) ---------------------------- -- Fixed long form of -1 switch to --single-pass as noted in man page and help. -- Added MSVC 2003 project files and renamed old 2002 ones. - -Version 0.10.4 (2006-06-01) ---------------------------- -- Fix whitespace in generated code. - -Version 0.10.3 (2006-05-14) ---------------------------- -- Fixed issue with -wb and -ws. -- Added -g switch to support gcc's computed goto's. -- Changed to use nested if's instead of "switch(yyaccept)" in -s mode. - -Version 0.10.2 (2006-05-01) ---------------------------- -- Changed to generate YYMARKER only when needed or in single pass mode. -- Added -1 switch to force single pass generation and make two pass the default. -- Fixed -i switch. -- Added configuration 'yyfill:enable' to allow suppression of YYFILL() blocks. -- Added tutorial like lessons to re2c. -- Added /*!ignore:re2c */ to support documenting of re2c source. -- Fixed issue with multiline re2c comments (/*!max:re2c ... */ and alike). -- Fixed generation of YYDEBUG() when using -d switch. -- Added /*!getstate:re2c */ which triggers generation of the YYGETSTATE() block. -- Added configuration 'state:abort'. -- Changed to not generate yyNext unless configuration 'state:nextlabel' is used. -- Changed to not generate yyaccept code unless needed. -- Changed to use if- instead of switch-expression when yyaccpt has only one case. -- Added docu, examples and tests to .src.zip package (0.10.1 zip was repackaged). -- Fixed #1479044 incorrect code generated when using -b. -- Fixed #1472770 re2c creates an infinite loop. -- Fixed #1454253 Piece of code saving a backtracking point not generated. -- Fixed #1463639 Missing forward declaration. -- Implemented #1187127 savable state support for multiple re2c blocks. - -Version 0.10.1 (2006-02-28) ---------------------------- -- Added support for Solaris and native SUN compiler. -- Applied #1438160 expose YYCTXMARKER. - -Version 0.10.0 (2006-02-18) ---------------------------- -- Added make target zip to create windows source packages as zip files. -- Added re2c:startlabel configuration. -- Fixed code generation to not generate unreachable code for initial state. -- Added support for c/c++ compatible \u and \U unicode notation. -- Added ability to control indendation. -- Made scanner error out in case an ambiguous /* is found. -- Fixed indendation of generated code. -- Added support for DOS line endings. -- Added experimental unicode support. -- Added config_w32.h to build out of the box on windows (using msvc 2002+). -- Added Microsoft Visual C .NET 2005 build files. -- Applied #1411087 variable length trailing context. -- Applied #1408326 do not generate goto next state. -- Applied #1408282 CharSet initialization fix. -- Applied #1408278 readsome with MSVC. -- Applied #1307467 Unicode patch for 0.9.7. - -Version 0.9.12 (2005-12-28) ---------------------------- -- Fixed bug #1390174 re2c cannot accept {0,}. - -Version 0.9.11 (2005-12-18) ---------------------------- -- Fixed #1313083 -e (EBCDIC cross compile) broken. -- Fixed #1297658 underestimation of n in YYFILL(n). -- Applied #1339483 Avoid rebuilds of re2c when running subtargets. -- Implemented #1335305 symbol table reimplementation, just slightly modifed. - -Version 0.9.10 (2005-09-04) ---------------------------- -- Added -i switch to avoid generating #line information. -- Fixed bug #1251653 re2c generate some invalid #line on WIN32. - -Version 0.9.9 (2005-07-21) --------------------------- -- Implemented #1232777 negated char classes '[^...]' and the dot operator '.'. -- Added hexadecimal character definitions. -- Added consistency check for octal character definitions. - -Version 0.9.8 (2005-06-26) --------------------------- -- Fixed code generation for -b switch. -- Added Microsoft Visual C .NET build files. - -Version 0.9.7 (2005-04-30) --------------------------- -- Applied #1181535 storable state patch. -- Added -d flag which outputs a debugable parser. -- Fixed generation of '#line' directives (according to ISO-C99). -- Fixed bug #1187785 Re2c fails to generate valid code. -- Fixed bug #1187452 unused variable `yyaccept'. - -Version 0.9.6 (2005-04-14) --------------------------- -- Fixed build with gcc >= 3.4. - -Version 0.9.5 (2005-04-08) --------------------------- -- Added /*!max:re2c */ which emits a '#define YYMAXFILL <max>\n' line - This allows to define buffers of the minimum required length. Occurence - must follow '/*re2c */ and cannot preceed it. -- Changed re2c to two pass generation to output warning free code. -- Fixed bug #1163046 re2c hangs when processing valid re-file. -- Fixed bug #1022799 re2c scanner has buffering bug. - -Version 0.9.4 (2005-03-12) --------------------------- -- Added --vernum support. -- Fixed bug #1054496 incorrect code generated with -b option. -- Fixed bug #1012748 re2c does not emit last line if '\n' missing. -- Fixed bug #999104 --output=output option does not work as documented. -- Fixed bug #999103 Invalid options prefixed with two dashes cause program crash. - -Version 0.9.3 (2004-05-26) --------------------------- -- Fixes one small possible bug in the generated output. ych instead of yych is - output in certain circumstances - -Version 0.9.2 (2004-05-26) --------------------------- -- Added -o option to specify the output file which also will set the #line - directives to something useful. -- Print version to cout instead cerr. -- Added -h and -- style options. -- Moved development to http://sourceforge.net/projects/re2c . -- Fixed bug #960144 minor cosmetic problem. -- Fixed bug #953181 cannot compile with. -- Fixed bug #939277 Windows support. -- Fixed bug #914462 automake build patch -- Fixed bug #891940 braced quantifiers: {\d+(,|,\d+)?} style. -- Fixed bug #869298 Add case insensitive string literals. -- Fixed bug #869297 Input buffer overrun. - -Version 0.9.1 (2003-12-13) --------------------------- -- Removed rcs comments in source files. - -Version 0.9 ------------ -- Redistribution based on version 0.5. -- Added parentheses to assignment expressions in 'if' statements. -- Rearranged class members to match initialization order. -- Substr fix. -- Use array delete [] when necessary. -- Other minor fixes for subduing compiler warnings. - Copied: tags/RELEASE_0_11_2/re2c/CHANGELOG (from rev 641, trunk/re2c/CHANGELOG) =================================================================== --- tags/RELEASE_0_11_2/re2c/CHANGELOG (rev 0) +++ tags/RELEASE_0_11_2/re2c/CHANGELOG 2007-02-28 22:57:31 UTC (rev 648) @@ -0,0 +1,174 @@ +Version 0.11.2 (????-??-??) +--------------------------- +- Added inplace configuration 're2c:yyfill:parameter'. +- Added inplace configuration 're2c:yych:conversion'. +- Fixed -u switch code generation. +- Added ability to avoid defines and overwrite variable and label names. + +Version 0.11.1 (2007-02-20) +--------------------------- +- Applied #1647875 add const to yybm vector. + +Version 0.11.0 (2007-01-01) +--------------------------- +- Added -u switch to support unicode. + +Version 0.10.7 (2007-02-20) +--------------------------- +- Applied #1647875 add const to yybm vector. + +Version 0.10.6 (2006-08-05) +--------------------------- +- Fixed #1529351 Segv bug on unterminated code blocks. +- Fixed #1528269 Invalid code generation. + +Version 0.10.5 (2006-06-11) +--------------------------- +- Fixed long form of -1 switch to --single-pass as noted in man page and help. +- Added MSVC 2003 project files and renamed old 2002 ones. + +Version 0.10.4 (2006-06-01) +--------------------------- +- Fix whitespace in generated code. + +Version 0.10.3 (2006-05-14) +--------------------------- +- Fixed issue with -wb and -ws. +- Added -g switch to support gcc's computed goto's. +- Changed to use nested if's instead of "switch(yyaccept)" in -s mode. + +Version 0.10.2 (2006-05-01) +--------------------------- +- Changed to generate YYMARKER only when needed or in single pass mode. +- Added -1 switch to force single pass generation and make two pass the default. +- Fixed -i switch. +- Added configuration 'yyfill:enable' to allow suppression of YYFILL() blocks. +- Added tutorial like lessons to re2c. +- Added /*!ignore:re2c */ to support documenting of re2c source. +- Fixed issue with multiline re2c comments (/*!max:re2c ... */ and alike). +- Fixed generation of YYDEBUG() when using -d switch. +- Added /*!getstate:re2c */ which triggers generation of the YYGETSTATE() block. +- Added configuration 'state:abort'. +- Changed to not generate yyNext unless configuration 'state:nextlabel' is used. +- Changed to not generate yyaccept code unless needed. +- Changed to use if- instead of switch-expression when yyaccpt has only one case. +- Added docu, examples and tests to .src.zip package (0.10.1 zip was repackaged). +- Fixed #1479044 incorrect code generated when using -b. +- Fixed #1472770 re2c creates an infinite loop. +- Fixed #1454253 Piece of code saving a backtracking point not generated. +- Fixed #1463639 Missing forward declaration. +- Implemented #1187127 savable state support for multiple re2c blocks. + +Version 0.10.1 (2006-02-28) +--------------------------- +- Added support for Solaris and native SUN compiler. +- Applied #1438160 expose YYCTXMARKER. + +Version 0.10.0 (2006-02-18) +--------------------------- +- Added make target zip to create windows source packages as zip files. +- Added re2c:startlabel configuration. +- Fixed code generation to not generate unreachable code for initial state. +- Added support for c/c++ compatible \u and \U unicode notation. +- Added ability to control indendation. +- Made scanner error out in case an ambiguous /* is found. +- Fixed indendation of generated code. +- Added support for DOS line endings. +- Added experimental unicode support. +- Added config_w32.h to build out of the box on windows (using msvc 2002+). +- Added Microsoft Visual C .NET 2005 build files. +- Applied #1411087 variable length trailing context. +- Applied #1408326 do not generate goto next state. +- Applied #1408282 CharSet initialization fix. +- Applied #1408278 readsome with MSVC. +- Applied #1307467 Unicode patch for 0.9.7. + +Version 0.9.12 (2005-12-28) +--------------------------- +- Fixed bug #1390174 re2c cannot accept {0,}. + +Version 0.9.11 (2005-12-18) +--------------------------- +- Fixed #1313083 -e (EBCDIC cross compile) broken. +- Fixed #1297658 underestimation of n in YYFILL(n). +- Applied #1339483 Avoid rebuilds of re2c when running subtargets. +- Implemented #1335305 symbol table reimplementation, just slightly modifed. + +Version 0.9.10 (2005-09-04) +--------------------------- +- Added -i switch to avoid generating #line information. +- Fixed bug #1251653 re2c generate some invalid #line on WIN32. + +Version 0.9.9 (2005-07-21) +-------------------------- +- Implemented #1232777 negated char classes '[^...]' and the dot operator '.'. +- Added hexadecimal character definitions. +- Added consistency check for octal character definitions. + +Version 0.9.8 (2005-06-26) +-------------------------- +- Fixed code generation for -b switch. +- Added Microsoft Visual C .NET build files. + +Version 0.9.7 (2005-04-30) +-------------------------- +- Applied #1181535 storable state patch. +- Added -d flag which outputs a debugable parser. +- Fixed generation of '#line' directives (according to ISO-C99). +- Fixed bug #1187785 Re2c fails to generate valid code. +- Fixed bug #1187452 unused variable `yyaccept'. + +Version 0.9.6 (2005-04-14) +-------------------------- +- Fixed build with gcc >= 3.4. + +Version 0.9.5 (2005-04-08) +-------------------------- +- Added /*!max:re2c */ which emits a '#define YYMAXFILL <max>\n' line + This allows to define buffers of the minimum required length. Occurence + must follow '/*re2c */ and cannot preceed it. +- Changed re2c to two pass generation to output warning free code. +- Fixed bug #1163046 re2c hangs when processing valid re-file. +- Fixed bug #1022799 re2c scanner has buffering bug. + +Version 0.9.4 (2005-03-12) +-------------------------- +- Added --vernum support. +- Fixed bug #1054496 incorrect code generated with -b option. +- Fixed bug #1012748 re2c does not emit last line if '\n' missing. +- Fixed bug #999104 --output=output option does not work as documented. +- Fixed bug #999103 Invalid options prefixed with two dashes cause program crash. + +Version 0.9.3 (2004-05-26) +-------------------------- +- Fixes one small possible bug in the generated output. ych instead of yych is + output in certain circumstances + +Version 0.9.2 (2004-05-26) +-------------------------- +- Added -o option to specify the output file which also will set the #line + directives to something useful. +- Print version to cout instead cerr. +- Added -h and -- style options. +- Moved development to http://sourceforge.net/projects/re2c . +- Fixed bug #960144 minor cosmetic problem. +- Fixed bug #953181 cannot compile with. +- Fixed bug #939277 Windows support. +- Fixed bug #914462 automake build patch +- Fixed bug #891940 braced quantifiers: {\d+(,|,\d+)?} style. +- Fixed bug #869298 Add case insensitive string literals. +- Fixed bug #869297 Input buffer overrun. + +Version 0.9.1 (2003-12-13) +-------------------------- +- Removed rcs comments in source files. + +Version 0.9 +----------- +- Redistribution based on version 0.5. +- Added parentheses to assignment expressions in 'if' statements. +- Rearranged class members to match initialization order. +- Substr fix. +- Use array delete [] when necessary. +- Other minor fixes for subduing compiler warnings. + Deleted: tags/RELEASE_0_11_2/re2c/Makefile.am =================================================================== --- trunk/re2c/Makefile.am 2007-01-02 17:01:21 UTC (rev 613) +++ tags/RELEASE_0_11_2/re2c/Makefile.am 2007-02-28 22:57:31 UTC (rev 648) @@ -1,80 +0,0 @@ -# $Id$ - -bin_PROGRAMS = re2c -win_BINARIES = Release-2005/re2c.exe -re2c_SOURCES = code.cc dfa.cc main.cc parser.cc actions.cc scanner.re substr.cc\ - translate.cc scanner.cc mbo_getopt.cc \ - basics.h dfa.h globals.h ins.h parser.h re.h scanner.h \ - substr.h token.h mbo_getopt.h code.h stream_lc.h -BUILT_SOURCES = parser.cc scanner.cc - -man_MANS = re2c.1 - -#CXXFLAGS = -O2 -Wall -Wno-unused -Wno-parentheses -Wno-deprecated -#CXXFLAGS = -O2 -Wall -Wextra -pedantic -Wconversion -Wpointer-arith -Wwrite-strings -Wredundant-decls -Werror -Wunused-function -DPEDANTIC -YFLAGS = -d - -RE2C = re2c$(EXEEXT) -RE2CFLAGS = -b - -CLEANFILES = parser.cc y.tab.c y.tab.h scanner.cc re2c.1 .version - -DISTCLEANFILES = makerpm re2c.spec README scanner.cc re2c$(EXEEXT) - -EXTRA_SRC = $(man_MANS) README parser.y scanner.re y.tab.h CHANGELOG \ - doc examples test bootstrap/*.cc bootstrap/*.h lessons -EXTRA_DIST = $(EXTRA_SRC) makerpm.in re2c.spec.in re2c.spec README.in config_w32.h.in -EXTRA_ZIP = $(EXTRA_SRC) config_w32.h *.sln *.vcproj - -dist-hook: re2c.spec - rm -rf `find $(distdir)/doc -name .svn` - rm -rf `find $(distdir)/examples -name .svn` - rm -rf `find $(distdir)/test -name .svn -o -name .cvsignore` - rm -rf `find $(distdir)/lessons -name .svn -o -name .cvsignore` - -rpm-files: $(bin_PROGRAMS) $(EXTRA_DIST) - -rpm: dist - rpmbuild -ta re2c-$(PACKAGE_VERSION).tar.gz - -src-rpm: dist - rpmbuild -ts re2c-$(PACKAGE_VERSION).tar.gz - cp -f `rpm --eval "%{_srcrpmdir}"`/re2c-$(PACKAGE_VERSION)-$(PACKAGE_RELEASE).src.rpm . - -zip: $(bin_PROGRAMS) $(EXTRA_ZIP) - if test -f re2c-$(PACKAGE_VERSION)-src.zip; then rm -f re2c-$(PACKAGE_VERSION)-src.zip; fi - zip -q -o -9 -r re2c-$(PACKAGE_VERSION)-src.zip $(re2c_SOURCES) $(EXTRA_ZIP) - zipinfo -1 re2c-$(PACKAGE_VERSION)-src.zip | grep .svn | xargs zip -d re2c-$(PACKAGE_VERSION)-src.zip >/dev/null - zipinfo -1 re2c-$(PACKAGE_VERSION)-src.zip | grep .cvsignore | xargs zip -d re2c-$(PACKAGE_VERSION)-src.zip >/dev/null - if test -f re2c-$(PACKAGE_VERSION)-bin.zip; then rm -f re2c-$(PACKAGE_VERSION)-bin.zip; fi - if test -f Release-2005/re2c.exe; then \ - zip -q -o -9 -j re2c-$(PACKAGE_VERSION)-bin.zip $(win_BINARIES); \ - fi; - -release: dist zip src-rpm - -parser.cc: $(top_srcdir)/parser.y - $(YACC) $(YFLAGS) $< || exit - cat y.tab.c | sed 's/"y\.tab\.c"/"parser.cc"/g' > $(top_srcdir)/parser.cc - rm -f y.tab.c - if cmp -s $(top_srcdir)/parser.cc $(top_srcdir)/bootstrap/parser.cc; then :; else cp -f $(top_srcdir)/parser.cc $(top_srcdir)/bootstrap/parser.cc; fi - if cmp -s y.tab.h $(top_srcdir)/y.tab.h; then :; else mv -f y.tab.h $(top_srcdir)/y.tab.h; fi - if cmp -s $(top_srcdir)/y.tab.h $(top_srcdir)/bootstrap/y.tab.h; then :; else cp -f $(top_srcdir)/y.tab.h $(top_srcdir)/bootstrap/y.tab.h; fi - -scanner.cc: $(top_srcdir)/scanner.re - @if test -x ./re2c$(EXEEXT); then \ - echo "re2c $(RE2CFLAGS) -o $@ $<"; \ - ./re2c $(RE2CFLAGS) -o $@ $< && cp $@ $(top_srcdir)/bootstrap/; \ - else \ - echo "cp -f $(top_srcdir)/bootstrap/$@ $@"; \ - cp -f $(top_srcdir)/bootstrap/$@ $@; \ - fi - -.version: - echo $(PACKAGE_VERSION) > .version - -TESTS = run_tests.sh - -test: all $(TESTS) - test -x $(TESTS) || chmod +x $(TESTS) - ./$(TESTS) Copied: tags/RELEASE_0_11_2/re2c/Makefile.am (from rev 628, trunk/re2c/Makefile.am) =================================================================== --- tags/RELEASE_0_11_2/re2c/Makefile.am (rev 0) +++ tags/RELEASE_0_11_2/re2c/Makefile.am 2007-02-28 22:57:31 UTC (rev 648) @@ -0,0 +1,80 @@ +# $Id$ + +bin_PROGRAMS = re2c +win_BINARIES = Release-2005/re2c.exe +re2c_SOURCES = code.cc dfa.cc main.cc parser.cc actions.cc scanner.re substr.cc\ + translate.cc scanner.cc mbo_getopt.cc \ + basics.h dfa.h globals.h ins.h parser.h re.h scanner.h \ + substr.h token.h mbo_getopt.h code.h stream_lc.h code_names.h +BUILT_SOURCES = parser.cc scanner.cc + +man_MANS = re2c.1 + +#CXXFLAGS = -O2 -Wall -Wno-unused -Wno-parentheses -Wno-deprecated +#CXXFLAGS = -O2 -Wall -Wextra -pedantic -Wconversion -Wpointer-arith -Wwrite-strings -Wredundant-decls -Werror -Wunused-function -DPEDANTIC +YFLAGS = -d + +RE2C = re2c$(EXEEXT) +RE2CFLAGS = -b + +CLEANFILES = parser.cc y.tab.c y.tab.h scanner.cc re2c.1 .version + +DISTCLEANFILES = makerpm re2c.spec README scanner.cc re2c$(EXEEXT) + +EXTRA_SRC = $(man_MANS) README parser.y scanner.re y.tab.h CHANGELOG \ + doc examples test bootstrap/*.cc bootstrap/*.h lessons +EXTRA_DIST = $(EXTRA_SRC) makerpm.in re2c.spec.in re2c.spec README.in config_w32.h.in +EXTRA_ZIP = $(EXTRA_SRC) config_w32.h *.sln *.vcproj + +dist-hook: re2c.spec + rm -rf `find $(distdir)/doc -name .svn` + rm -rf `find $(distdir)/examples -name .svn` + rm -rf `find $(distdir)/test -name .svn -o -name .cvsignore` + rm -rf `find $(distdir)/lessons -name .svn -o -name .cvsignore` + +rpm-files: $(bin_PROGRAMS) $(EXTRA_DIST) + +rpm: dist + rpmbuild -ta re2c-$(PACKAGE_VERSION).tar.gz + +src-rpm: dist + rpmbuild -ts re2c-$(PACKAGE_VERSION).tar.gz + cp -f `rpm --eval "%{_srcrpmdir}"`/re2c-$(PACKAGE_VERSION)-$(PACKAGE_RELEASE).src.rpm . + +zip: $(bin_PROGRAMS) $(EXTRA_ZIP) + if test -f re2c-$(PACKAGE_VERSION)-src.zip; then rm -f re2c-$(PACKAGE_VERSION)-src.zip; fi + zip -q -o -9 -r re2c-$(PACKAGE_VERSION)-src.zip $(re2c_SOURCES) $(EXTRA_ZIP) + zipinfo -1 re2c-$(PACKAGE_VERSION)-src.zip | grep .svn | xargs zip -d re2c-$(PACKAGE_VERSION)-src.zip >/dev/null + zipinfo -1 re2c-$(PACKAGE_VERSION)-src.zip | grep .cvsignore | xargs zip -d re2c-$(PACKAGE_VERSION)-src.zip >/dev/null + if test -f re2c-$(PACKAGE_VERSION)-bin.zip; then rm -f re2c-$(PACKAGE_VERSION)-bin.zip; fi + if test -f Release-2005/re2c.exe; then \ + zip -q -o -9 -j re2c-$(PACKAGE_VERSION)-bin.zip $(win_BINARIES); \ + fi; + +release: dist zip src-rpm + +parser.cc: $(top_srcdir)/parser.y + $(YACC) $(YFLAGS) $< || exit + cat y.tab.c | sed 's/"y\.tab\.c"/"parser.cc"/g' > $(top_srcdir)/parser.cc + rm -f y.tab.c + if cmp -s $(top_srcdir)/parser.cc $(top_srcdir)/bootstrap/parser.cc; then :; else cp -f $(top_srcdir)/parser.cc $(top_srcdir)/bootstrap/parser.cc; fi + if cmp -s y.tab.h $(top_srcdir)/y.tab.h; then :; else mv -f y.tab.h $(top_srcdir)/y.tab.h; fi + if cmp -s $(top_srcdir)/y.tab.h $(top_srcdir)/bootstrap/y.tab.h; then :; else cp -f $(top_srcdir)/y.tab.h $(top_srcdir)/bootstrap/y.tab.h; fi + +scanner.cc: $(top_srcdir)/scanner.re + @if test -x ./re2c$(EXEEXT); then \ + echo "re2c $(RE2CFLAGS) -o $@ $<"; \ + ./re2c $(RE2CFLAGS) -o $@ $< && cp $@ $(top_srcdir)/bootstrap/; \ + else \ + echo "cp -f $(top_srcdir)/bootstrap/$@ $@"; \ + cp -f $(top_srcdir)/bootstrap/$@ $@; \ + fi + +.version: + echo $(PACKAGE_VERSION) > .version + +TESTS = run_tests.sh + +test: all $(TESTS) + test -x $(TESTS) || chmod +x $(TESTS) + ./$(TESTS) Deleted: tags/RELEASE_0_11_2/re2c/code.cc =================================================================== --- trunk/re2c/code.cc 2007-01-02 17:01:21 UTC (rev 613) +++ tags/RELEASE_0_11_2/re2c/code.cc 2007-02-28 22:57:31 UTC (rev 648) @@ -1,1720 +0,0 @@ -/* $Id$ */ -#include <stdlib.h> -#include <string.h> -#include <ctype.h> -#include <iomanip> -#include <iostream> -#include "substr.h" -#include "globals.h" -#include "dfa.h" -#include "parser.h" -#include "code.h" - -namespace re2c -{ - -// there must be at least one span in list; all spans must cover -// same range - -std::string indent(uint ind) -{ - std::string str; - - while (ind-- > 0) - { - str += indString; - } - return str; -} - -static std::string space(uint this_label) -{ - int nl = next_label > 9999 ? 4 : next_label > 999 ? 3 : next_label > 99 ? 2 : next_label > 9 ? 1 : 0; - int tl = this_label > 9999 ? 4 : this_label > 999 ? 3 : this_label > 99 ? 2 : this_label > 9 ? 1 : 0; - - return std::string(std::max(1, nl - tl + 1), ' '); -} - -void Go::compact() -{ - // arrange so that adjacent spans have different targets - uint i = 0; - - for (uint j = 1; j < nSpans; ++j) - { - if (span[j].to != span[i].to) - { - ++i; - span[i].to = span[j].to; - } - - span[i].ub = span[j].ub; - } - - nSpans = i + 1; -} - -void Go::unmap(Go *base, const State *x) -{ - Span *s = span, *b = base->span, *e = &b[base->nSpans]; - uint lb = 0; - s->ub = 0; - s->to = NULL; - - for (; b != e; ++b) - { - if (b->to == x) - { - if ((s->ub - lb) > 1) - { - s->ub = b->ub; - } - } - else - { - if (b->to != s->to) - { - if (s->ub) - { - lb = s->ub; - ++s; - } - - s->to = b->to; - } - - s->ub = b->ub; - } - } - - s->ub = e[ -1].ub; - ++s; - nSpans = s - span; -} - -void doGen(const Go *g, const State *s, uint *bm, uint f, uint m) -{ - Span *b = g->span, *e = &b[g->nSpans]; - uint lb = 0; - - for (; b < e; ++b) - { - if (b->to == s) - { - for (; lb < b->ub && lb < 256; ++lb) - { - bm[lb-f] |= m; - } - } - - lb = b->ub; - } -} - -void prt(std::ostream& o, const Go *g, const State *s) -{ - Span *b = g->span, *e = &b[g->nSpans]; - uint lb = 0; - - for (; b < e; ++b) - { - if (b->to == s) - { - printSpan(o, lb, b->ub); - } - - lb = b->ub; - } -} - -bool matches(const Go *g1, const State *s1, const Go *g2, const State *s2) -{ - Span *b1 = g1->span, *e1 = &b1[g1->nSpans]; - uint lb1 = 0; - Span *b2 = g2->span, *e2 = &b2[g2->nSpans]; - uint lb2 = 0; - - for (;;) - { - for (; b1 < e1 && b1->to != s1; ++b1) - { - lb1 = b1->ub; - } - - for (; b2 < e2 && b2->to != s2; ++b2) - { - lb2 = b2->ub; - } - - if (b1 == e1) - { - return b2 == e2; - } - - if (b2 == e2) - { - return false; - } - - if (lb1 != lb2 || b1->ub != b2->ub) - { - return false; - } - - ++b1; - ++b2; - } -} - -BitMap *BitMap::first = NULL; - -BitMap::BitMap(const Go *g, const State *x) - : go(g) - , on(x) - , next(first) - , i(0) - , m(0) -{ - first = this; -} - -BitMap::~BitMap() -{ - delete next; -} - -const BitMap *BitMap::find(const Go *g, const State *x) -{ - for (const BitMap *b = first; b; b = b->next) - { - if (matches(b->go, b->on, g, x)) - { - return b; - } - } - - return new BitMap(g, x); -} - -const BitMap *BitMap::find(const State *x) -{ - for (const BitMap *b = first; b; b = b->next) - { - if (b->on == x) - { - return b; - } - } - - return NULL; -} - -void BitMap::gen(std::ostream &o, uint ind, uint lb, uint ub) -{ - BitMap *b = first; - - if (b && bLastPass) - { - o << indent(ind) << "static unsigned char yybm[] = {"; - - uint c = 1, n = ub - lb; - - while((b = const_cast<BitMap*>(b->next)) != NULL) { - ++c; - } - b = first; - - uint *bm = new uint[n]; - - for (uint i = 0, t = 1; b; i += n, t += 8) - { - memset(bm, 0, n * sizeof(uint)); - - for (uint m = 0x80; b && m; m >>= 1) - { - b->i = i; - b->m = m; - doGen(b->go, b->on, bm, lb, m); - b = const_cast<BitMap*>(b->next); - } - - if (c > 8) - { - o << "\n" << indent(ind+1) << "/* table " << t << " .. " << std::min(c, t+7) << ": " << i << " */"; - } - - for (uint j = 0; j < n; ++j) - { - if (j % 8 == 0) - { - o << "\n" << indent(ind+1); - } - - if (yybmHexTable) - { - prtHex(o, bm[j], false); - } - else - { - o << std::setw(3) << (uint)bm[j]; - } - o << ", "; - } - } - - o << "\n" << indent(ind) << "};\n"; - /* stats(); */ - - delete[] bm; - } -} - -void BitMap::stats() -{ - uint n = 0; - - for (const BitMap *b = first; b; b = b->next) - { - prt(std::cerr, b->go, b->on); - std::cerr << std::endl; - ++n; - } - - std::cerr << n << " bitmaps\n"; - first = NULL; -} - -void genGoTo(std::ostream &o, uint ind, const State *from, const State *to, bool & readCh) -{ - if (readCh && from->label + 1 != to->label) - { - o << indent(ind) << "yych = *YYCURSOR;\n"; - readCh = false; - } - - o << indent(ind) << "goto yy" << to->label << ";\n"; - vUsedLabels.insert(to->label); -} - -void genIf(std::ostream &o, uint ind, const char *cmp, uint v, bool &readCh) -{ - if (readCh) - { - o << indent(ind) << "if((yych = *YYCURSOR) "; - readCh = false; - } - else - { - o << indent(ind) << "if(yych "; - } - - o << cmp << " "; - prtChOrHex(o, v); - o << ") "; -} - -static void need(std::ostream &o, uint ind, uint n, bool & readCh, bool bSetMarker) -{ - uint fillIndex = next_fill_index; - - if (fFlag) - { - next_fill_index++; - o << indent(ind) << "YYSETSTATE(" << fillIndex << ");\n"; - } - - if (bUseYYFill) - { - if (n == 1) - { - o << indent(ind) << "if(YYLIMIT == YYCURSOR) YYFILL(1);\n"; - } - else - { - o << indent(ind) << "if((YYLIMIT - YYCURSOR) < " << n << ") YYFILL(" << n << ");\n"; - } - } - - if (fFlag) - { - o << "yyFillLabel" << fillIndex << ":\n"; - } - - if (bSetMarker) - { - o << indent(ind) << "yych = *(YYMARKER = YYCURSOR);\n"; - } - else - { - o << indent(ind) << "yych = *YYCURSOR;\n"; - } - readCh = false; -} - -void Match::emit(std::ostream &o, uint ind, bool &readCh) const -{ - if (state->link) - { - o << indent(ind) << "++YYCURSOR;\n"; - } - else if (!readAhead()) - { - /* do not read next char if match */ - o << indent(ind) << "++YYCURSOR;\n"; - readCh = true; - } - else - { - o << indent(ind) << "yych = *++YYCURSOR;\n"; - readCh = false; - } - - if (state->link) - { - need(o, ind, state->depth, readCh, false); - } -} - -void Enter::emit(std::ostream &o, uint ind, bool &readCh) const -{ - if (state->link) - { - o << indent(ind) << "++YYCURSOR;\n"; - if (vUsedLabels.count(label)) - { - o << "yy" << label << ":\n"; - } - need(o, ind, state->depth, readCh, false); - } - else - { - /* we shouldn't need 'rule-following' protection here */ - o << indent(ind) << "yych = *++YYCURSOR;\n"; - if (vUsedLabels.count(label)) - { - o << "yy" << label << ":\n"; - } - readCh = false; - } -} - -void Initial::emit(std::ostream &o, uint ind, bool &readCh) const -{ - if (!startLabelName.empty()) - { - o << startLabelName << ":\n"; - } - - if (vUsedLabels.count(1)) - { - if (state->link) - { - o << indent(ind) << "++YYCURSOR;\n"; - } - else - { - o << indent(ind) << "yych = *++YYCURSOR;\n"; - } - } - - if (vUsedLabels.count(label)) - { - o << "yy" << label << ":\n"; - } - else if (!label) - { - o << "\n"; - } - - if (dFlag) - { - o << indent(ind) << "YYDEBUG(" << label << ", *YYCURSOR);\n"; - } - - if (state->link) - { - need(o, ind, state->depth, readCh, setMarker && bUsedYYMarker); - } - else - { - if (setMarker && bUsedYYMarker) - { - o << indent(ind) << "YYMARKER = YYCURSOR;\n"; - } - readCh = false; - } -} - -void Save::emit(std::ostream &o, uint ind, bool &readCh) const -{ - if (bUsedYYAccept) - { - o << indent(ind) << "yyaccept = " << selector << ";\n"; - } - - if (state->link) - { - if (bUsedYYMarker) - { - o << indent(ind) << "YYMARKER = ++YYCURSOR;\n"; - } - need(o, ind, state->depth, readCh, false); - } - else - { - if (bUsedYYMarker) - { - o << indent(ind) << "yych = *(YYMARKER = ++YYCURSOR);\n"; - } - else - { - o << indent(ind) << "yych = *++YYCURSOR;\n"; - } - readCh = false; - } -} - -Move::Move(State *s) : Action(s) -{ - ; -} - -void Move::emit(std::ostream &, uint, bool &) const -{ - ; -} - -Accept::Accept(State *x, uint n, uint *s, State **r) - : Action(x), nRules(n), saves(s), rules(r) -{ - ; -} - -void Accept::genRuleMap() -{ - for (uint i = 0; i < nRules; ++i) - { - if (saves[i] != ~0u) - { - mapRules[saves[i]] = rules[i]; - } - } -} - -void Accept::emitBinary(std::ostream &o, uint ind, uint l, uint r, bool &readCh) const -{ - if (l < r) - { - uint m = (l + r) >> 1; - - o << indent(ind) << "if(yyaccept <= " << m << ") {\n"; - emitBinary(o, ++ind, l, m, readCh); - o << indent(--ind) << "} else {\n"; - emitBinary(o, ++ind, m + 1, r, readCh); - o << indent(--ind) << "}\n"; - } - else - { - genGoTo(o, ind, state, mapRules.find(l)->second, readCh); - } -} - -void Accept::emit(std::ostream &o, uint ind, bool &readCh) const -{ - if (mapRules.size() > 0) - { - bUsedYYMarker = true; - o << indent(ind) << "YYCURSOR = YYMARKER;\n"; - - if (readCh) // shouldn't be necessary, but might become at some point - { - o << indent(ind) << "yych = *YYCURSOR;\n"; - readCh = false; - } - - if (mapRules.size() > 1) - { - bUsedYYAccept = true; - - if (gFlag && mapRules.size() >= cGotoThreshold) - { - o << indent(ind++) << "{\n"; - o << indent(ind++) << "static void *yytarget[" << mapRules.size() << "] = {\n"; - for (RuleMap::const_iterator it = mapRules.begin(); it != mapRules.end(); ++it) - { - o << indent(ind) << "&&yy" << it->second->label << ",\n"; - vUsedLabels.insert(it->second->label); - } - o << indent(--ind) << "};\n"; - o << indent(ind) << "goto *yytarget[yyaccept];\n"; - o << indent(--ind) << "}\n"; - } - else if (sFlag) - { - emitBinary(o, ind, 0, mapRules.size() - 1, readCh); - } - else - { - o << indent(ind) << "switch(yyaccept) {\n"; - - for (RuleMap::const_iterator it = mapRules.begin(); it != mapRules.end(); ++it) - { - o << indent(ind) << "case " << it->first << ": \t"; - genGoTo(o, 0, state, it->second, readCh); - } - - o << indent(ind) << "}\n"; - } - } - else - { - // no need to write if statement here since there is only case 0. - genGoTo(o, ind, state, mapRules.find(0)->second, readCh); - } - } -} - -Rule::Rule(State *s, RuleOp *r) : Action(s), rule(r) -{ - ; -} - -void Rule::emit(std::ostream &o, uint ind, bool &) const -{ - uint back = rule->ctx->fixedLength(); - - if (back != 0u) - { - o << indent(ind) << "YYCURSOR = YYCTXMARKER;\n"; - } - - RuleLine rl(*rule); - - o << file_info(sourceFileInfo, &rl); - o << indent(ind); - o << rule->code->text; - o << "\n"; - o << outputFileInfo; -} - -void doLinear(std::ostream &o, uint ind, Span *s, uint n, const State *from, const State *next, bool &readCh, uint mask) -{ - for (;;) - { - State *bg = s[0].to; - - while (n >= 3 && s[2].to == bg && (s[1].ub - s[0].ub) == 1) - { - if (s[1].to == next && n == 3) - { - if (!mask || (s[0].ub > 0x00FF)) - { - genIf(o, ind, "!=", s[0].ub, readCh); - genGoTo(o, 0, from, bg, readCh); - } - if (next->label != from->label + 1) - { - genGoTo(o, ind, from, next, readCh); - } - return ; - } - else - { - if (!mask || (s[0].ub > 0x00FF)) - { - genIf(o, ind, "==", s[0].ub, readCh); - genGoTo(o, 0, from, s[1].to, readCh); - } - } - - n -= 2; - s += 2; - } - - if (n == 1) - { - // if(bg != next){ - if (s[0].to->label != from->label + 1) - { - genGoTo(o, ind, from, s[0].to, readCh); - } - // } - return ; - } - else if (n == 2 && bg == next) - { - if (!mask || (s[0].ub > 0x00FF)) - { - genIf(o, ind, ">=", s[0].ub, readCh); - genGoTo(o, 0, from, s[1].to, readCh); - } - if (next->label != from->label + 1) - { - genGoTo(o, ind, from, next, readCh); - } - return ; - } - else - { - if (!mask || ((s[0].ub - 1) > 0x00FF)) - { - genIf(o, ind, "<=", s[0].ub - 1, readCh); - genGoTo(o, 0, from, bg, readCh); - } - n -= 1; - s += 1; - } - } - - if (next->label != from->label + 1) - { - genGoTo(o, ind, from, next, readCh); - } -} - -void Go::genLinear(std::ostream &o, uint ind, const State *from, const State *next, bool &readCh, uint mask) const -{ - doLinear(o, ind, span, nSpans, from, next, readCh, mask); -} - -bool genCases(std::ostream &o, uint ind, uint lb, Span *s, bool &newLine, uint mask) -{ - bool used = false; - - if (!newLine) - { - o << "\n"; - } - newLine = true; - if (lb < s->ub) - { - for (;;) - { - if (!mask || lb > 0x00FF) - { - o << indent(ind) << "case "; - prtChOrHex(o, lb); - o << ":"; - newLine = false; - used = true; - } - - if (++lb == s->ub) - { - break; - } - - o << "\n"; - newLine = true; - } - } - return used; -} - -void Go::genSwitch(std::ostream &o, uint ind, const State *from, const State *next, bool &readCh, uint mask) const -{ - bool newLine = true; - - if ((mask ? wSpans : nSpans) <= 2) - { - genLinear(o, ind, from, next, readCh, mask); - } - else - { - State *def = span[nSpans - 1].to; - Span **sP = new Span * [nSpans - 1], **r, **s, **t; - - t = &sP[0]; - - for (uint i = 0; i < nSpans; ++i) - { - if (span[i].to != def) - { - *(t++) = &span[i]; - } - } - - if (dFlag) - { - o << indent(ind) << "YYDEBUG(-1, yych);\n"; - } - - if (readCh) - { - o << indent(ind) << "switch((yych = *YYCURSOR)) {\n"; - readCh = false; - } - else - { - o << indent(ind) << "switch(yych) {\n"; - } - - while (t != &sP[0]) - { - bool used = false; - - r = s = &sP[0]; - - if (*s == &span[0]) - { - used |= genCases(o, ind, 0, *s, newLine, mask); - } - else - { - used |= genCases(o, ind, (*s)[ -1].ub, *s, newLine, mask); - } - - State *to = (*s)->to; - - while (++s < t) - { - if ((*s)->to == to) - { - used |= genCases(o, ind, (*s)[ -1].ub, *s, newLine, mask); - } - else - { - *(r++) = *s; - } - } - - if (used) - { - genGoTo(o, newLine ? ind+1 : 1, from, to, readCh); - newLine = true; - } - t = r; - } - - o << indent(ind) << "default:"; - genGoTo(o, 1, from, def, readCh); - o << indent(ind) << "}\n"; - - delete [] sP; - } -} - -void doBinary(std::ostream &o, uint ind, Span *s, uint n, const State *from, const State *next, bool &readCh, uint mask) -{ - if (n <= 4) - { - doLinear(o, ind, s, n, from, next, readCh, mask); - } - else - { - uint h = n / 2; - - genIf(o, ind, "<=", s[h - 1].ub - 1, readCh); - o << "{\n"; - doBinary(o, ind+1, &s[0], h, from, next, readCh, mask); - o << indent(ind) << "} else {\n"; - doBinary(o, ind+1, &s[h], n - h, from, next, readCh, mask); - o << indent(ind) << "}\n"; - } -} - -void Go::genBinary(std::ostream &o, uint ind, const State *from, const State *next, bool &readCh, uint mask) const -{ - if (mask) - { - Span * sc = new Span[wSpans]; - - for (uint i = 0, j = 0; i < nSpans; i++) - { - if (span[i].ub > 0xFF) - { - sc[j++] = span[i]; - } - } - - doBinary(o, ind, sc, wSpans, from, next, readCh, mask); - - delete[] sc; - } - else - { - doBinary(o, ind, span, nSpans, from, next, readCh, mask); - } -} - -void Go::genBase(std::ostream &o, uint ind, const State *from, const State *next, bool &readCh, uint mask) const -{ - if ((mask ? wSpans : nSpans) == 0) - { - return ; - } - - if (!sFlag) - { - genSwitch(o, ind, from, next, readCh, mask); - return ; - } - - if ((mask ? wSpans : nSpans) > 8) - { - Span *bot = &span[0], *top = &span[nSpans - 1]; - uint util; - - if (bot[0].to == top[0].to) - { - util = (top[ -1].ub - bot[0].ub) / (nSpans - 2); - } - else - { - if (bot[0].ub > (top[0].ub - top[ -1].ub)) - { - util = (top[0].ub - bot[0].ub) / (nSpans - 1); - } - else - { - util = top[ -1].ub / (nSpans - 1); - } - } - - if (util <= 2) - { - genSwitch(o, ind, from, next, readCh, mask); - return ; - } - } - - if ((mask ? wSpans : nSpans) > 5) - { - genBinary(o, ind, from, next, readCh, mask); - } - else - { - genLinear(o, ind, from, next, readCh, mask); - } -} - -void Go::genCpGoto(std::ostream &o, uint ind, const State *from, const State *next, bool &readCh) const -{ - const char * sYych = readCh ? "(yych = *YYCURSOR)" : "yych"; - - readCh = false; - if (wFlag) - { - o << indent(ind) << "if(" << sYych <<" & 0xFF00) {\n"; - genBase(o, ind+1, from, next, readCh, 1); - o << indent(ind++) << "} else {\n"; - sYych = "yych"; - } - else - { - o << indent(ind++) << "{\n"; - } - o << indent(ind++) << "static void *yytarget[256] = {\n"; - o << indent(ind); - - uint ch = 0; - for (uint i = 0; i < lSpans; ++i) - { - vUsedLabels.insert(span[i].to->label); - for(; ch < span[i].ub; ++ch) - { - o << "&&yy" << span[i].to->label; - if (ch == 255) - { - o << "\n"; - i = lSpans; - break; - } - else if (ch % 8 == 7) - { - o << ",\n" << indent(ind); - } - else - { - o << "," << space(span[i].to->label); - } - } - } - o << indent(--ind) << "};\n"; - o << indent(ind) << "goto *yytarget[" << sYych << "];\n"; - o << indent(--ind) << "}\n"; -} - -void Go::genGoto(std::ostream &o, uint ind, const State *from, const State *next, bool &readCh) -{ - if ((gFlag || wFlag) && wSpans == ~0u) - { - uint nBitmaps = 0; - std::set<uint> vTargets; - wSpans = 0; - lSpans = 1; - dSpans = 0; - for (uint i = 0; i < nSpans; ++i) - { - if (span[i].ub > 0xFF) - { - wSpans++; - } - if (span[i].ub < 0x100 || !wFlag) - { - lSpans++; - - State *to = span[i].to; - - if (to && to->isBase) - { - const BitMap *b = BitMap::find(to); - - if (b && matches(b->go, b->on, this, to)) - { - nBitmaps++; - } - else - { - dSpans++; - vTargets.insert(to->label); - } - } - else - { - dSpans++; - vTargets.insert(to->label); - } - } - } - lTargets = vTargets.size() >> nBitmaps; - } - - if (gFlag && (lTargets >= cGotoThreshold || dSpans >= cGotoThreshold)) - { - genCpGoto(o, ind, from, next, readCh); - return; - } - else if (bFlag) - { - for (uint i = 0; i < nSpans; ++i) - { - State *to = span[i].to; - - if (to && to->isBase) - { - const BitMap *b = BitMap::find(to); - const char * sYych; - - if (b && matches(b->go, b->on, this, to)) - { - Go go; - go.span = new Span[nSpans]; - go.unmap(this, to); - sYych = readCh ? "(yych = *YYCURSOR)" : "yych"; - readCh = false; - if (wFlag) - { - o << indent(ind) << "if(" << sYych << " & 0xFF00) {\n"; - sYych = "yych"; - genBase(o, ind+1, from, next, readCh, 1); - o << indent(ind) << "} else "; - } - else - { - o << indent(ind); - } - o << "if(yybm[" << b->i << "+" << sYych << "] & "; - if (yybmHexTable) - { - prtHex(o, b->m, false); - } - else - { - o << (uint) b->m; - } - o << ") {\n"; - genGoTo(o, ind+1, from, to, readCh); - o << indent(ind) << "}\n"; - go.genBase(o, ind, from, next, readCh, 0); - delete [] go.span; - return ; - } - } - } - } - - genBase(o, ind, from, next, readCh, 0); -} - -void State::emit(std::ostream &o, uint ind, bool &readCh) const -{ - if (vUsedLabels.count(label)) - { - o << "yy" << label << ":\n"; - } - if (dFlag && !action->isInitial()) - { - o << indent(ind) << "YYDEBUG(" << label << ", *YYCURSOR);\n"; - } - if (isPreCtxt) - { - o << indent(ind) << "YYCTXMARKER = YYCURSOR + 1;\n"; - } - action->emit(o, ind, readCh); -} - -uint merge(Span *x0, State *fg, State *bg) -{ - Span *x = x0, *f = fg->go.span, *b = bg->go.span; - uint nf = fg->go.nSpans, nb = bg->go.nSpans; - State *prev = NULL, *to; - // NB: we assume both spans are for same range - - for (;;) - { - if (f->ub == b->ub) - { - to = f->to == b->to ? bg : f->to; - - if (to == prev) - { - --x; - } - else - { - x->to = prev = to; - } - - x->ub = f->ub; - ++x; - ++f; - --nf; - ++b; - --nb; - - if (nf == 0 && nb == 0) - { - return x - x0; - } - } - - while (f->ub < b->ub) - { - to = f->to == b->to ? bg : f->to; - - if (to == prev) - { - --x; - } - else - { - x->to = prev = to; - } - - x->ub = f->ub; - ++x; - ++f; - --nf; - } - - while (b->ub < f->ub) - { - to = b->to == f->to ? bg : f->to; - - if (to == prev) - { - --x; - } - else - { - x->to = prev = to; - } - - x->ub = b->ub; - ++x; - ++b; - --nb; - } - } -} - -const uint cInfinity = ~0; - -class SCC -{ - -public: - State **top, **stk; - -public: - SCC(uint); - ~SCC(); - void traverse(State*); - -#ifdef PEDANTIC -private: - SCC(const SCC& oth) - : top(oth.top) - , stk(oth.stk) - { - } - SCC& operator = (const SCC& oth) - { - new(this) SCC(oth); - return *this; - } -#endif -}; - -SCC::SCC(uint size) - : top(new State * [size]) - , stk(top) -{ -} - -SCC::~SCC() -{ - delete [] stk; -} - -void SCC::traverse(State *x) -{ - *top = x; - uint k = ++top - stk; - x->depth = k; - - for (uint i = 0; i < x->go.nSpans; ++i) - { - State *y = x->go.span[i].to; - - if (y) - { - if (y->depth == 0) - { - traverse(y); - } - - if (y->depth < x->depth) - { - x->depth = y->depth; - } - } - } - - if (x->depth == k) - { - do - { - (*--top)->depth = cInfinity; - (*top)->link = x; - } - while (*top != x); - } -} - -static bool state_is_in_non_trivial_SCC(const State* s) -{ - - // does not link to self - if (s->link != s) - { - return true; - } - - // or exists i: (s->go.spans[i].to->link == s) - // - // Note: (s->go.spans[i].to == s) is allowed, corresponds to s - // looping back to itself. - // - for (uint i = 0; i < s->go.nSpans; ++i) - { - const State* t = s->go.span[i].to; - - if (t && t->link == s) - { - return true; - } - } - // otherwise no - return false; -} - -uint maxDist(State *s) -{ - if (s->depth != cInfinity) - { - // Already calculated, just return result. - return s->depth; - } - uint mm = 0; - - for (uint i = 0; i < s->go.nSpans; ++i) - { - State *t = s->go.span[i].to; - - if (t) - { - uint m = 1; - - if (!t->link) // marked as non-key state - { - if (t->depth == cInfinity) - { - t->depth = maxDist(t); - } - m += t->depth; - } - - if (m > mm) - { - mm = m; - } - } - } - - s->depth = mm; - return mm; -} - -void calcDepth(State *head) -{ - State* s; - - // mark non-key states by s->link = NULL ; - for (s = head; s; s = s->next) - { - if (s != head && !state_is_in_non_trivial_SCC(s)) - { - s->link = NULL; - } - //else: key state, leave alone - } - - for (s = head; s; s = s->next) - { - s->depth = cInfinity; - } - - // calculate max number of transitions before guarantied to reach - // a key state. - for (s = head; s; s = s->next) - { - maxDist(s); - } -} - -void DFA::findSCCs() -{ - SCC scc(nStates); - State *s; - - for (s = head; s; s = s->next) - { - s->depth = 0; - s->link = NULL; - } - - for (s = head; s; s = s->next) - { - if (!s->depth) - { - scc.traverse(s); - } - } - - calcDepth(head); -} - -void DFA::split(State *s) -{ - State *move = new State; - (void) new Move(move); - addState(&s->next, move); - move->link = s->link; - move->rule = s->rule; - move->go = s->go; - s->rule = NULL; - s->go.nSpans = 1; - s->go.span = new Span[1]; - s->go.span[0].ub = ubChar; - s->go.span[0].to = move; -} - -void DFA::findBaseState() -{ - Span *span = new Span[ubChar - lbChar]; - - for (State *s = head; s; s = s->next) - { - if (!s->link) - { - for (uint i = 0; i < s->go.nSpans; ++i) - { - State *to = s->go.span[i].to; - - if (to && to->isBase) - { - to = to->go.span[0].to; - uint nSpans = merge(span, s, to); - - if (nSpans < s->go.nSpans) - { - delete [] s->go.span; - s->go.nSpans = nSpans; - s->go.span = new Span[nSpans]; - memcpy(s->go.span, span, nSpans*sizeof(Span)); - } - - break; - } - } - } - } - - delete [] span; -} - -void DFA::emit(std::ostream &o, uint ind) -{ - State *s; - uint i, bitmap_brace = 0; - - findSCCs(); - head->link = head; - - uint nRules = 0; - - for (s = head; s; s = s->next) - { - s->depth = maxDist(s); - if (maxFill < s->depth) - { - maxFill = s->depth; - } - if (s->rule && s->rule->accept >= nRules) - { - nRules = s->rule->accept + 1; - } - } - - uint nSaves = 0; - uint *saves = new uint[nRules]; - memset(saves, ~0, (nRules)*sizeof(*saves)); - - // mark backtracking points - bool bSaveOnHead = false; - - for (s = head; s; s = s->next) - { - if (s->rule) - { - for (i = 0; i < s->go.nSpans; ++i) - { - if (s->go.span[i].to && !s->go.span[i].to->rule) - { - delete s->action; - s->action = NULL; - - if (saves[s->rule->accept] == ~0u) - { - saves[s->rule->accept] = nSaves++; - } - - bSaveOnHead |= s == head; - (void) new Save(s, saves[s->rule->accept]); // sets s->action - } - } - } - } - - // insert actions - State **rules = new State * [nRules]; - - memset(rules, 0, (nRules)*sizeof(*rules)); - - State *accept = NULL; - Accept *accfixup = NULL; - - for (s = head; s; s = s->next) - { - State * ow; - - if (!s->rule) - { - ow = accept; - } - else - { - if (!rules[s->rule->accept]) - { - State *n = new State; - (void) new Rule(n, s->rule); - rules[s->rule->accept] = n; - addState(&s->next, n); - } - - ow = rules[s->rule->accept]; - } - - for (i = 0; i < s->go.nSpans; ++i) - { - if (!s->go.span[i].to) - { - if (!ow) - { - ow = accept = new State; - accfixup = new Accept(accept, nRules, saves, rules); - addState(&s->next, accept); - } - - s->go.span[i].to = ow; - } - } - } - - if (accfixup) - { - accfixup->genRuleMap(); - } - - // split ``base'' states into two parts - for (s = head; s; s = s->next) - { - s->isBase = false; - - if (s->link) - { - for (i = 0; i < s->go.nSpans; ++i) - { - if (s->go.span[i].to == s) - { - s->isBase = true; - split(s); - - if (bFlag) - { - BitMap::find(&s->next->go, s); - } - - s = s->next; - break; - } - } - } - } - - // find ``base'' state, if possible - findBaseState(); - - delete head->action; - head->action = NULL; - - if (bFlag) - { - o << indent(ind++) << "{\n"; - bitmap_brace = 1; - BitMap::gen(o, ind, lbChar, ubChar <= 256 ? ubChar : 256); - } - - bUsedYYAccept = false; - - uint start_label = next_label; - - (void) new Initial(head, next_label++, bSaveOnHead); - - if (bUseStartLabel) - { - if (startLabelName.empty()) - { - vUsedLabels.insert(start_label); - } - } - - for (s = head; s; s = s->next) - { - s->label = next_label++; - } - - // Save 'next_fill_index' and compute information about code generation - // while writing to null device. - uint save_fill_index = next_fill_index; - null_stream null_dev; - - for (s = head; s; s = s->next) - { - bool readCh = false; - s->emit(null_dev, ind, readCh); - s->go.genGoto(null_dev, ind, s, s->next, readCh); - } - if (last_fill_index < next_fill_index) - { - last_fill_index = next_fill_index; - } - next_fill_index = save_fill_index; - - // Generate prolog - o << "\n" << outputFileInfo; - o << indent(ind++) << "{\n"; - - if (!fFlag) - { - o << indent(ind) << "YYCTYPE yych;\n"; - if (bUsedYYAccept) - { - o << indent(ind) << "unsigned int yyaccept = 0;\n"; - } - } - else - { - o << "\n"; - } - - genGetState(o, ind, start_label); - - if (vUsedLabels.count(1)) - { - vUsedLabels.insert(0); - o << indent(ind) << "goto yy0;\n"; - } - - // Generate code - for (s = head; s; s = s->next) - { - bool readCh = false; - s->emit(o, ind, readCh); - s->go.genGoto(o, ind, s, s->next, readCh); - } - - // Generate epilog - o << indent(--ind) << "}\n"; - if (bitmap_brace) - { - o << indent(--ind) << "}\n"; - } - - // Cleanup - if (BitMap::first) - { - delete BitMap::first; - BitMap::first = NULL; - } - - delete [] saves; - delete [] rules; - - bUseStartLabel = false; -} - -void genGetState(std::ostream &o, uint& ind, uint start_label) -{ - if (fFlag && !bWroteGetState) - { - vUsedLabels.insert(start_label); - o << indent(ind) << "switch(YYGETSTATE()) {\n"; - if (bUseStateAbort) - { - o << indent(ind) << "default: abort();\n"; - o << indent(ind) << "case -1: goto yy" << start_label << ";\n"; - } - else - { - o << indent(ind) << "default: goto yy" << start_label << ";\n"; - } - - for (size_t i=0; i<last_fill_index; ++i) - { - o << indent(ind) << "case " << i << ": goto yyFillLabel" << i << ";\n"; - } - - o << indent(ind) << "}\n"; - if (bUseStateNext) - { - o << "yyNext:\n"; - } - bWroteGetState = true; - } -} - -std::ostream& operator << (std::ostream& o, const file_info& li) -{ - if (li.ln && !iFlag) - { - o << "#line " << li.ln->get_line() << " \"" << li.fname << "\"\n"; - } - return o; -} - -uint Scanner::get_line() const -{ - return cline; -} - -void Scanner::config(const Str& cfg, int num) -{ - if (cfg.to_string() == "indent:top") - { - if (num < 0) - { - fatal("configuration 'indent:top' must be a positive integer"); - } - topIndent = num; - } - else if (cfg.to_string() == "yybm:hex") - { - yybmHexTable = num != 0; - } - else if (cfg.to_string() == "startlabel") - { - bUseStartLabel = num != 0; - startLabelName = ""; - } - else if (cfg.to_string() == "state:abort") - { - bUseStateAbort = num != 0; - } - else if (cfg.to_string() == "state:nextlabel") - { - bUseStateNext = num != 0; - } - else if (cfg.to_string() == "yyfill:enable") - { - bUseYYFill = num != 0; - } - else if (cfg.to_string() == "cgoto:threshold") - { - cGotoThreshold = num; - } - else - { - fatal("unrecognized configuration name or illegal integer value"); - } -} - -void Scanner::config(const Str& cfg, const Str& val) -{ - if (cfg.to_string() == "indent:string") - { - if (val.len >= 2 && val.str[0] == val.str[val.len-1] - && (val.str[0] == '"' || val.str[0] == '\'')) - { - SubStr tmp(val.str + 1, val.len - 2); - unescape(tmp, indString); - } - else - { - indString = val.to_string(); - } - return; - } - else if (cfg.to_string() == "startlabel") - { - if (val.len >= 2 && val.str[0] == val.str[val.len-1] - && (val.str[0] == '"' || val.str[0] == '\'')) - { - SubStr tmp(val.str + 1, val.len - 2); - unescape(tmp, startLabelName); - } - else - { - startLabelName = val.to_string(); - } - bUseStartLabel = !startLabelName.empty(); - } - else - { - fatal("unrecognized configuration name or illegal string value"); - } -} - -} // end namespace re2c Copied: tags/RELEASE_0_11_2/re2c/code.cc (from rev 641, trunk/re2c/code.cc) =================================================================== --- tags/RELEASE_0_11_2/re2c/code.cc (rev 0) +++ tags/RELEASE_0_11_2/re2c/code.cc 2007-02-28 22:57:31 UTC (rev 648) @@ -0,0 +1,1810 @@ +/* $Id$ */ +#include <stdlib.h> +#include <string.h> +#include <ctype.h> +#include <iomanip> +#include <iostream> +#include "substr.h" +#include "globals.h" +#include "dfa.h" +#include "parser.h" +#include "code.h" + +namespace re2c +{ + +// there must be at least one span in list; all spans must cover +// same range + +std::string indent(uint ind) +{ + std::string str; + + while (ind-- > 0) + { + str += indString; + } + return str; +} + +static std::string space(uint this_label) +{ + int nl = next_label > 9999 ? 4 : next_label > 999 ? 3 : next_label > 99 ? 2 : next_label > 9 ? 1 : 0; + int tl = this_label > 9999 ? 4 : this_label > 999 ? 3 : this_label > 99 ? 2 : this_label > 9 ? 1 : 0; + + return std::string(std::max(1, nl - tl + 1), ' '); +} + +void Go::compact() +{ + // arrange so that adjacent spans have different targets + uint i = 0; + + for (uint j = 1; j < nSpans; ++j) + { + if (span[j].to != span[i].to) + { + ++i; + span[i].to = span[j].to; + } + + span[i].ub = span[j].ub; + } + + nSpans = i + 1; +} + +void Go::unmap(Go *base, const State *x) +{ + Span *s = span, *b = base->span, *e = &b[base->nSpans]; + uint lb = 0; + s->ub = 0; + s->to = NULL; + + for (; b != e; ++b) + { + if (b->to == x) + { + if ((s->ub - lb) > 1) + { + s->ub = b->ub; + } + } + else + { + if (b->to != s->to) + { + if (s->ub) + { + lb = s->ub; + ++s; + } + + s->to = b->to; + } + + s->ub = b->ub; + } + } + + s->ub = e[ -1].ub; + ++s; + nSpans = s - span; +} + +void doGen(const Go *g, const State *s, uint *bm, uint f, uint m) +{ + Span *b = g->span, *e = &b[g->nSpans]; + uint lb = 0; + + for (; b < e; ++b) + { + if (b->to == s) + { + for (; lb < b->ub && lb < 256; ++lb) + { + bm[lb-f] |= m; + } + } + + lb = b->ub; + } +} + +void prt(std::ostream& o, const Go *g, const State *s) +{ + Span *b = g->span, *e = &b[g->nSpans]; + uint lb = 0; + + for (; b < e; ++b) + { + if (b->to == s) + { + printSpan(o, lb, b->ub); + } + + lb = b->ub; + } +} + +bool matches(const Go *g1, const State *s1, const Go *g2, const State *s2) +{ + Span *b1 = g1->span, *e1 = &b1[g1->nSpans]; + uint lb1 = 0; + Span *b2 = g2->span, *e2 = &b2[g2->nSpans]; + uint lb2 = 0; + + for (;;) + { + for (; b1 < e1 ... [truncated message content] |
From: <he...@us...> - 2007-02-26 19:58:33
|
Revision: 647 http://svn.sourceforge.net/re2c/?rev=647&view=rev Author: helly Date: 2007-02-26 11:58:29 -0800 (Mon, 26 Feb 2007) Log Message: ----------- - Update docu Modified Paths: -------------- trunk/re2c/htdocs/manual.html trunk/re2c/re2c.1.in Modified: trunk/re2c/htdocs/manual.html =================================================================== --- trunk/re2c/htdocs/manual.html 2007-02-26 09:42:45 UTC (rev 646) +++ trunk/re2c/htdocs/manual.html 2007-02-26 19:58:29 UTC (rev 647) @@ -140,7 +140,8 @@ <h2>INTERFACE CODE</h2> <p>Unlike other scanner generators, <b>re2c</b> does not generate complete scanners: the user must supply some interface code. In particular, the user -must define the following macros:</p> +must define the following macros or use the +corresponding inplace configurations:</p> <dl compact="compact"> <dt>YYCTYPE</dt> <dd>Type used to hold an input symbol. Usually char or unsigned char.<br /><br /></dd> @@ -168,25 +169,27 @@ programming languages <i>n</i> will be the length of the longest keyword plus one. The user can place a comment of the form /*!max:re2c */ once to insert a YYMAXFILL definition that is set to the maximum length value. If -1 -switch is used then YYMAXFILL can be triggered once after the last /*!re2c */ -block.<br /><br /></dd> +switch is used then YYMAXFILL can be triggered only once after the +last /*!re2c */ block.<br /><br /></dd> <dt>YYGETSTATE()</dt> <dd>The user only needs to define this macro if the <b>-f</b> flag was -specified. In that case, the generated code "calls" YYGETSTATE at the very -beginning of the scanner in order to obtain the saved state. YYGETSTATE must +specified. In that case, the generated code "calls" YYGETSTATE() at the very +beginning of the scanner in order to obtain the saved state. YYGETSTATE() must return a signed integer. The value must be either -1, indicating that the scanner is entered for the first time, or a value previously saved by -YYSETSTATE. In the second case, the scanner will resume operations right after +YYSETSTATE(s). In the second case, the scanner will resume operations right after where the last YYFILL(n) was called.<br /><br /></dd> -<dt>YYSETSTATE(<i>n</i>)</dt> +<dt>YYSETSTATE(<i>s</i>)</dt> <dd>The user only needs to define this macro if the <b>-f</b> flag was specified. In that case, the generated code "calls" YYSETSTATE just before -calling YYFILL(n). The parameter to YYSETSTATE is a signed integer that uniquely +calling YYFILL(n). The parameter to YYSETSTATE(s) is a signed integer that uniquely identifies the specific instance of YYFILL(n) that is about to be called. Should the user wish to save the state of the scanner and have YYFILL(n) return to the caller, all he has to do is store that unique identifer in a variable. Later, -when the scannered is called again, it will call YYGETSTATE() and resume -execution right where it left off.<br /><br /></dd> +when the scanner is called again, it will call YYGETSTATE() and resume +execution right where it left off. The generated code will contain +both YYSETSTATE(s) and YYGETSTATE() even if YYFILL(n) is being +disabled.<br /><br /></dd> <dt>YYDEBUG(<i>state</i>,<i>current</i>)</dt> <dd>This is only needed if the <b>-d</b> flag was specified. It allows to easily debug the generated parser by calling a user defined function for every Modified: trunk/re2c/re2c.1.in =================================================================== --- trunk/re2c/re2c.1.in 2007-02-26 09:42:45 UTC (rev 646) +++ trunk/re2c/re2c.1.in 2007-02-26 19:58:29 UTC (rev 647) @@ -153,7 +153,8 @@ .SH "INTERFACE CODE" Unlike other scanner generators, \*(re does not generate complete scanners: the user must supply some interface code. -In particular, the user must define the following macros: +In particular, the user must define the following macros or use the +corresponding inplace configurations: .TP \fCYYCTYPE\fP Type used to hold an input symbol. @@ -183,26 +184,27 @@ The user only needs to define this macro if a scanner specification uses trailing context in one or more of its regular expressions. .TP -\fCYYFILL(\fP\fIn\fP\fC)\fP +\fCYYFILL\fP(\fIn\fP\fC\fP) The generated code "calls" \fCYYFILL\fP(n) when the buffer needs (re)filling: at least \fIn\fP additional characters should be provided. \fCYYFILL\fP(n) should adjust \fCYYCURSOR\fP, \fCYYLIMIT\fP, \fCYYMARKER\fP and \fCYYCTXMARKER\fP as needed. Note that for typical programming languages \fIn\fP will be the length of the longest keyword plus one. The user can place a comment of the form \fC/*!max:re2c */\fP once to insert -a \fCYYMAXFILL\fP definition that is set to the maximum length value. If -1 -switch is used then YYMAXFILL can be triggered once after the last \fC/*!re2c */\fP +a \fCYYMAXFILL\fP(n) definition that is set to the maximum length value. If -1 +switch is used then \fCYYMAXFILL\fP can be triggered only once after the +last \fC/*!re2c */\fP block. .TP -\fCYYGETSTATE()\fP +\fCYYGETSTATE\fP() The user only needs to define this macro if the \fB-f\fP flag was specified. -In that case, the generated code "calls" \fCYYGETSTATE\fP at the very beginning -of the scanner in order to obtain the saved state. YYGETSTATE must return a signed +In that case, the generated code "calls" \fCYYGETSTATE\fP() at the very beginning +of the scanner in order to obtain the saved state. \fCYYGETSTATE\fP() must return a signed integer. The value must be either -1, indicating that the scanner is entered for the -first time, or a value previously saved by \fCYYSETSTATE\fP. In the second case, the +first time, or a value previously saved by \fCYYSETSTATE\fP(s). In the second case, the scanner will resume operations right after where the last \fCYYFILL\fP(n) was called. .TP -\fCYYSETSTATE(\fP\fIn\fP\fC)\fP +\fCYYSETSTATE(\fP\fIs\fP\fC)\fP The user only needs to define this macro if the \fB-f\fP flag was specified. In that case, the generated code "calls" \fCYYSETSTATE\fP just before calling \fCYYFILL\fP(n). The parameter to \fCYYSETSTATE\fP is a signed integer that uniquely @@ -210,7 +212,9 @@ Should the user wish to save the state of the scanner and have \fCYYFILL\fP(n) return to the caller, all he has to do is store that unique identifer in a variable. Later, when the scannered is called again, it will call \fCYYGETSTATE()\fP and -resume execution right where it left off. +resume execution right where it left off. The generated code will contain +both \fCYYSETSTATE\fP(s) and \fCYYGETSTATE\fP even if \fCYYFILL\fP(n) is being +disabled. .TP \fCYYDEBUG(\fP\fIstate\fP,\fIcurrent\fC)\fP This is only needed if the \fB-d\fP flag was specified. It allows to easily debug This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <he...@us...> - 2007-02-26 09:42:48
|
Revision: 646 http://svn.sourceforge.net/re2c/?rev=646&view=rev Author: helly Date: 2007-02-26 01:42:45 -0800 (Mon, 26 Feb 2007) Log Message: ----------- - Update docu Modified Paths: -------------- trunk/re2c/htdocs/manual.html trunk/re2c/re2c.1.in Modified: trunk/re2c/htdocs/manual.html =================================================================== --- trunk/re2c/htdocs/manual.html 2007-02-26 09:22:56 UTC (rev 645) +++ trunk/re2c/htdocs/manual.html 2007-02-26 09:42:45 UTC (rev 646) @@ -15,7 +15,7 @@ <p>re2c - convert regular expressions to C/C++</p> <a name="lbAC" id="lbAC"> </a> <h2>SYNOPSIS</h2> -<p><b>re2c</b> [<b>-bdefghisvVw1</b>] [<b>-o output</b>] file</p> +<p><b>re2c</b> [<b>-bdefghisuvVw1</b>] [<b>-o output</b>] file</p> <a name="lbAD" id="lbAD"> </a> <h2>DESCRIPTION</h2> <p><b>re2c</b> is a preprocessor that generates C-based recognizers from @@ -26,56 +26,49 @@ token-specific code.</p> <p>For example, given the following code</p> <pre> -#define NULL ((char*) 0) char *scan(char *p) { -#define YYCTYPE char -#define YYCURSOR p -#define YYLIMIT p -#define YYFILL(n) /*!re2c - [0-9]+ {return YYCURSOR;} - [\000-\377] {return NULL;} + re2c:define:YYCTYPE = "unsigned char"; + re2c:define:YYCURSOR = p; + re2c:yyfill:enable = 0; + re2c:yych:conversion = 1; + re2c:indent:top = 1; + [0-9]+ {return p;} + [\000-\377] {return (char*)0;} */ } </pre> <br /> <br /> -<p><b>re2c</b> will generate</p> +<p><b>re2c -is</b> will generate</p> <pre> /* Generated by re2c on Sat Apr 16 11:40:58 1994 */ -#line 1 "simple.re" -#define NULL ((char*) 0) char *scan(char *p) { -#define YYCTYPE char -#define YYCURSOR p -#define YYLIMIT p -#define YYFILL(n) -{ - YYCTYPE yych; + { + unsigned char yych; - if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); - yych = *YYCURSOR; + yych = (unsigned char)*p; if(yych <= '/') goto yy4; if(yych >= ':') goto yy4; -yy2: yych = *++YYCURSOR; + ++p; + yych = (unsigned char)*p; goto yy7; yy3: -#line 9 - {return YYCURSOR;} -yy4: yych = *++YYCURSOR; -yy5: -#line 10 - {return NULL;} -yy6: ++YYCURSOR; - if(YYLIMIT == YYCURSOR) YYFILL(1); - yych = *YYCURSOR; -yy7: if(yych <= '/') goto yy3; + {return p;} +yy4: + ++p; + yych = (unsigned char)*p; + {return char*)0;} +yy6: + ++p; + yych = (unsigned char)*p; +yy7: + if(yych <= '/') goto yy3; if(yych <= '9') goto yy6; goto yy3; -} -#line 11 + } } </pre> Modified: trunk/re2c/re2c.1.in =================================================================== --- trunk/re2c/re2c.1.in 2007-02-26 09:22:56 UTC (rev 645) +++ trunk/re2c/re2c.1.in 2007-02-26 09:42:45 UTC (rev 646) @@ -10,7 +10,7 @@ re2c \- convert regular expressions to C/C++ .SH SYNOPSIS -\*(re [\fB-bdefghisvVw1\fP] [\fB-o output\fP] file\fP +\*(re [\fB-bdefghisuvVw1\fP] [\fB-o output\fP] file\fP .SH DESCRIPTION \*(re is a preprocessor that generates C-based recognizers from regular @@ -26,61 +26,51 @@ .in +3 .nf -#define NULL ((char*) 0) char *scan(char *p) { -#define YYCTYPE char -#define YYCURSOR p -#define YYLIMIT p -#define YYFILL(n) /*!re2c - [0-9]+ {return YYCURSOR;} - [\\000-\\377] {return NULL;} + re2c:define:YYCTYPE = "unsigned char"; + re2c:define:YYCURSOR = p; + re2c:yyfill:enable = 0; + re2c:yych:conversion = 1; + re2c:indent:top = 1; + [0-9]+ {return p;} + [\000-\377] {return (char*)0;} */ } .fi .in -3 -\*(re will generate +\*(re -is will generate .in +3 .nf /* Generated by re2c on Sat Apr 16 11:40:58 1994 */ -#line 1 "simple.re" -#define NULL ((char*) 0) char *scan(char *p) { -#define YYCTYPE char -#define YYCURSOR p -#define YYLIMIT p -#define YYFILL(n) -{ - YYCTYPE yych; - unsigned int yyaccept; - goto yy0; -yy1: ++YYCURSOR; -yy0: - if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); - yych = *YYCURSOR; - if(yych <= '/') goto yy4; - if(yych >= ':') goto yy4; -yy2: yych = *++YYCURSOR; + { + unsigned char yych; + + yych = (unsigned char)*p; + if(yych <= '/') goto yy4; + if(yych >= ':') goto yy4; + ++p; + yych = (unsigned char)*p; goto yy7; yy3: -#line 9 - {return YYCURSOR;} -yy4: yych = *++YYCURSOR; -yy5: -#line 10 - {return NULL;} -yy6: ++YYCURSOR; - if(YYLIMIT == YYCURSOR) YYFILL(1); - yych = *YYCURSOR; -yy7: if(yych <= '/') goto yy3; - if(yych <= '9') goto yy6; + {return p;} +yy4: + ++p; + yych = (unsigned char)*p; + {return char*)0;} +yy6: + ++p; + yych = (unsigned char)*p; +yy7: + if(yych <= '/') goto yy3; + if(yych <= '9') goto yy6; goto yy3; -} -#line 11 + } } .fi This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <he...@us...> - 2007-02-26 09:22:57
|
Revision: 645 http://svn.sourceforge.net/re2c/?rev=645&view=rev Author: helly Date: 2007-02-26 01:22:56 -0800 (Mon, 26 Feb 2007) Log Message: ----------- - Update docu Modified Paths: -------------- trunk/re2c/htdocs/manual.html trunk/re2c/re2c.1.in Modified: trunk/re2c/htdocs/manual.html =================================================================== --- trunk/re2c/htdocs/manual.html 2007-02-26 09:21:52 UTC (rev 644) +++ trunk/re2c/htdocs/manual.html 2007-02-26 09:22:56 UTC (rev 645) @@ -299,7 +299,7 @@ <dt><i>r</i>?</dt> <dd>zero or one <i>r</i>'s (that is, "an optional <i>r</i>")</dd> <dt>name</dt> -<dd>the expansion of the "name" definition (see above)</dd> +<dd>the expansion of the "named definition" (see above)</dd> <dt>(<i>r</i>)</dt> <dd>an <i>r</i>; parentheses are used to override precedence (see below)</dd> <dt><i>rs</i></dt> Modified: trunk/re2c/re2c.1.in =================================================================== --- trunk/re2c/re2c.1.in 2007-02-26 09:21:52 UTC (rev 644) +++ trunk/re2c/re2c.1.in 2007-02-26 09:22:56 UTC (rev 645) @@ -354,7 +354,7 @@ zero or one \fIr\fP's (that is, "an optional \fIr\fP") .TP name -the expansion of the "name" definition (see above) +the expansion of the "named definition" (see above) .TP \fC(\fP\fIr\fP\fC)\fP an \fIr\fP; parentheses are used to override precedence This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <he...@us...> - 2007-02-26 09:21:54
|
Revision: 644 http://svn.sourceforge.net/re2c/?rev=644&view=rev Author: helly Date: 2007-02-26 01:21:52 -0800 (Mon, 26 Feb 2007) Log Message: ----------- - Update docu Modified Paths: -------------- trunk/re2c/htdocs/manual.html trunk/re2c/re2c.1.in Modified: trunk/re2c/htdocs/manual.html =================================================================== --- trunk/re2c/htdocs/manual.html 2007-02-25 17:17:26 UTC (rev 643) +++ trunk/re2c/htdocs/manual.html 2007-02-26 09:21:52 UTC (rev 644) @@ -255,7 +255,7 @@ tweaked using inplace configurations "state:abort" and "state:nextlabel".</p> <a name="lbAH" id="lbAH"> </a> <h2>SCANNER SPECIFICATIONS</h2> -<p>Each scanner specification consists of a set of <i>rules</i>, <i>name +<p>Each scanner specification consists of a set of <i>rules</i>, <i>named definitions</i> and <i>configurations</i>.</p> <p><i>Rules</i> consist of a regular expression along with a block of C/C++ code that is to be executed when the associated <i>regular expression</i> is @@ -267,10 +267,11 @@ <dl compact="compact"> <dd><i>name</i> = <i>regular expression</i>;</dd> </dl> -<p>Configurations look like name definitions whose names start with +<p>Configurations look like named definitions whose names start with "<b>re2c:</b>":</p> <dl compact="compact"> <dd>re2c:<i>name</i> = <i>value</i>;</dd> +<dd>re2c:<i>name</i> = <b>"</b><i>value</i><b>"</b>;</dd> </dl> <a name="lbAI" id="lbAI"> </a> <h2>SUMMARY OF RE2C REGULAR EXPRESSIONS</h2> @@ -471,7 +472,7 @@ <h2>SEE ALSO</h2> <p>flex(1), lex(1). More information on <b>re2c</b> can be found here: <b><a href= -"http://sourceforge.net/projects/re2c/">http://sourceforge.net/projects/re2c/</a></b></p> +"http://re2c.org/">http://re2c.org/</a></b></p> <a name="lbAN" id="lbAN"> </a> <h2>AUTHORS</h2> <ul> Modified: trunk/re2c/re2c.1.in =================================================================== --- trunk/re2c/re2c.1.in 2007-02-25 17:17:26 UTC (rev 643) +++ trunk/re2c/re2c.1.in 2007-02-26 09:21:52 UTC (rev 644) @@ -292,7 +292,7 @@ tweaked using inplace configurations "\fBstate:abort\fP" and "\fBstate:nextlabel\fP". .SH "SCANNER SPECIFICATIONS" -Each scanner specification consists of a set of \fIrules\fP, \fIname +Each scanner specification consists of a set of \fIrules\fP, \fInamed definitions\fP and \fIconfigurations\fP. .LP \fIRules\fP consist of a regular expression along with a block of C/C++ code that @@ -308,12 +308,15 @@ \fIname\fP \fC=\fP \fIregular expression\fP\fC;\fP .RE .LP -Configurations look like name definitions whose names start +Configurations look like named definitions whose names start with "\fBre2c:\fP": .P .RS \fCre2c:\fP\fIname\fP \fC=\fP \fIvalue\fP\fC;\fP .RE +.RS +\fCre2c:\fP\fIname\fP \fC=\fP \fB"\fP\fIvalue\fP\fB"\fP\fC;\fP +.RE .SH "SUMMARY OF RE2C REGULAR EXPRESSIONS" .TP @@ -570,7 +573,7 @@ More information on \*(re can be found here: .PD 0 .P -.B http://sourceforge.net/projects/re2c/ +.B http://re2c.org/ .PD 1 .SH AUTHORS This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <he...@us...> - 2007-02-25 17:17:28
|
Revision: 643 http://svn.sourceforge.net/re2c/?rev=643&view=rev Author: helly Date: 2007-02-25 09:17:26 -0800 (Sun, 25 Feb 2007) Log Message: ----------- - Update copyright Modified Paths: -------------- trunk/re2c/lessons/001_upn_calculator/calc_001.c trunk/re2c/lessons/001_upn_calculator/calc_001.re trunk/re2c/lessons/001_upn_calculator/calc_002.c trunk/re2c/lessons/001_upn_calculator/calc_002.re trunk/re2c/lessons/001_upn_calculator/calc_003.c trunk/re2c/lessons/001_upn_calculator/calc_003.re trunk/re2c/lessons/001_upn_calculator/calc_004.c trunk/re2c/lessons/001_upn_calculator/calc_004.re trunk/re2c/lessons/001_upn_calculator/calc_005.c trunk/re2c/lessons/001_upn_calculator/calc_005.re trunk/re2c/lessons/001_upn_calculator/calc_006.s.c trunk/re2c/lessons/001_upn_calculator/calc_006.s.re trunk/re2c/lessons/001_upn_calculator/calc_007.b.c trunk/re2c/lessons/001_upn_calculator/calc_007.b.re trunk/re2c/lessons/002_strip_comments/strip_001.s.c trunk/re2c/lessons/002_strip_comments/strip_001.s.re trunk/re2c/lessons/002_strip_comments/strip_002.s.c trunk/re2c/lessons/002_strip_comments/strip_002.s.re trunk/re2c/lessons/002_strip_comments/strip_003.b.c trunk/re2c/lessons/002_strip_comments/strip_003.b.re Modified: trunk/re2c/lessons/001_upn_calculator/calc_001.c =================================================================== --- trunk/re2c/lessons/001_upn_calculator/calc_001.c 2007-02-25 17:15:14 UTC (rev 642) +++ trunk/re2c/lessons/001_upn_calculator/calc_001.c 2007-02-25 17:17:26 UTC (rev 643) @@ -1,6 +1,6 @@ /* Generated by re2c */ #line 1 "calc_001.re" -/* re2c lesson 001_upn_calculator, calc_001, (c) M. Boerger 2006 */ +/* re2c lesson 001_upn_calculator, calc_001, (c) M. Boerger 2006 - 2007 */ #line 43 "calc_001.re" #include <stdlib.h> Modified: trunk/re2c/lessons/001_upn_calculator/calc_001.re =================================================================== --- trunk/re2c/lessons/001_upn_calculator/calc_001.re 2007-02-25 17:15:14 UTC (rev 642) +++ trunk/re2c/lessons/001_upn_calculator/calc_001.re 2007-02-25 17:17:26 UTC (rev 643) @@ -1,4 +1,4 @@ -/* re2c lesson 001_upn_calculator, calc_001, (c) M. Boerger 2006 */ +/* re2c lesson 001_upn_calculator, calc_001, (c) M. Boerger 2006 - 2007 */ /*!ignore:re2c - basic interface for string reading Modified: trunk/re2c/lessons/001_upn_calculator/calc_002.c =================================================================== --- trunk/re2c/lessons/001_upn_calculator/calc_002.c 2007-02-25 17:15:14 UTC (rev 642) +++ trunk/re2c/lessons/001_upn_calculator/calc_002.c 2007-02-25 17:17:26 UTC (rev 643) @@ -1,6 +1,6 @@ /* Generated by re2c */ #line 1 "calc_002.re" -/* re2c lesson 001_upn_calculator, calc_002, (c) M. Boerger 2006 */ +/* re2c lesson 001_upn_calculator, calc_002, (c) M. Boerger 2006 - 2007 */ #line 19 "calc_002.re" #include <stdlib.h> Modified: trunk/re2c/lessons/001_upn_calculator/calc_002.re =================================================================== --- trunk/re2c/lessons/001_upn_calculator/calc_002.re 2007-02-25 17:15:14 UTC (rev 642) +++ trunk/re2c/lessons/001_upn_calculator/calc_002.re 2007-02-25 17:17:26 UTC (rev 643) @@ -1,4 +1,4 @@ -/* re2c lesson 001_upn_calculator, calc_002, (c) M. Boerger 2006 */ +/* re2c lesson 001_upn_calculator, calc_002, (c) M. Boerger 2006 - 2007 */ /*!ignore:re2c - making use of YYFILL Modified: trunk/re2c/lessons/001_upn_calculator/calc_003.c =================================================================== --- trunk/re2c/lessons/001_upn_calculator/calc_003.c 2007-02-25 17:15:14 UTC (rev 642) +++ trunk/re2c/lessons/001_upn_calculator/calc_003.c 2007-02-25 17:17:26 UTC (rev 643) @@ -1,6 +1,6 @@ /* Generated by re2c */ #line 1 "calc_003.re" -/* re2c lesson 001_upn_calculator, calc_003, (c) M. Boerger 2006 */ +/* re2c lesson 001_upn_calculator, calc_003, (c) M. Boerger 2006 - 2007 */ #line 19 "calc_003.re" #include <stdlib.h> Modified: trunk/re2c/lessons/001_upn_calculator/calc_003.re =================================================================== --- trunk/re2c/lessons/001_upn_calculator/calc_003.re 2007-02-25 17:15:14 UTC (rev 642) +++ trunk/re2c/lessons/001_upn_calculator/calc_003.re 2007-02-25 17:17:26 UTC (rev 643) @@ -1,4 +1,4 @@ -/* re2c lesson 001_upn_calculator, calc_003, (c) M. Boerger 2006 */ +/* re2c lesson 001_upn_calculator, calc_003, (c) M. Boerger 2006 - 2007 */ /*!ignore:re2c - making use of YYFILL Modified: trunk/re2c/lessons/001_upn_calculator/calc_004.c =================================================================== --- trunk/re2c/lessons/001_upn_calculator/calc_004.c 2007-02-25 17:15:14 UTC (rev 642) +++ trunk/re2c/lessons/001_upn_calculator/calc_004.c 2007-02-25 17:17:26 UTC (rev 643) @@ -1,6 +1,6 @@ /* Generated by re2c */ #line 1 "calc_004.re" -/* re2c lesson 001_upn_calculator, calc_004, (c) M. Boerger 2006 */ +/* re2c lesson 001_upn_calculator, calc_004, (c) M. Boerger 2006 - 2007 */ #line 20 "calc_004.re" #include <stdlib.h> Modified: trunk/re2c/lessons/001_upn_calculator/calc_004.re =================================================================== --- trunk/re2c/lessons/001_upn_calculator/calc_004.re 2007-02-25 17:15:14 UTC (rev 642) +++ trunk/re2c/lessons/001_upn_calculator/calc_004.re 2007-02-25 17:17:26 UTC (rev 643) @@ -1,4 +1,4 @@ -/* re2c lesson 001_upn_calculator, calc_004, (c) M. Boerger 2006 */ +/* re2c lesson 001_upn_calculator, calc_004, (c) M. Boerger 2006 - 2007 */ /*!ignore:re2c - making use of definitions Modified: trunk/re2c/lessons/001_upn_calculator/calc_005.c =================================================================== --- trunk/re2c/lessons/001_upn_calculator/calc_005.c 2007-02-25 17:15:14 UTC (rev 642) +++ trunk/re2c/lessons/001_upn_calculator/calc_005.c 2007-02-25 17:17:26 UTC (rev 643) @@ -1,6 +1,6 @@ /* Generated by re2c */ #line 1 "calc_005.re" -/* re2c lesson 001_upn_calculator, calc_005, (c) M. Boerger 2006 */ +/* re2c lesson 001_upn_calculator, calc_005, (c) M. Boerger 2006 - 2007 */ #line 19 "calc_005.re" #include <stdlib.h> Modified: trunk/re2c/lessons/001_upn_calculator/calc_005.re =================================================================== --- trunk/re2c/lessons/001_upn_calculator/calc_005.re 2007-02-25 17:15:14 UTC (rev 642) +++ trunk/re2c/lessons/001_upn_calculator/calc_005.re 2007-02-25 17:17:26 UTC (rev 643) @@ -1,4 +1,4 @@ -/* re2c lesson 001_upn_calculator, calc_005, (c) M. Boerger 2006 */ +/* re2c lesson 001_upn_calculator, calc_005, (c) M. Boerger 2006 - 2007 */ /*!ignore:re2c - turning this lesson into an easy calculator Modified: trunk/re2c/lessons/001_upn_calculator/calc_006.s.c =================================================================== --- trunk/re2c/lessons/001_upn_calculator/calc_006.s.c 2007-02-25 17:15:14 UTC (rev 642) +++ trunk/re2c/lessons/001_upn_calculator/calc_006.s.c 2007-02-25 17:17:26 UTC (rev 643) @@ -1,6 +1,6 @@ /* Generated by re2c */ #line 1 "calc_006.s.re" -/* re2c lesson 001_upn_calculator, calc_006, (c) M. Boerger 2006 */ +/* re2c lesson 001_upn_calculator, calc_006, (c) M. Boerger 2006 - 2007 */ #line 36 "calc_006.s.re" #include <stdlib.h> Modified: trunk/re2c/lessons/001_upn_calculator/calc_006.s.re =================================================================== --- trunk/re2c/lessons/001_upn_calculator/calc_006.s.re 2007-02-25 17:15:14 UTC (rev 642) +++ trunk/re2c/lessons/001_upn_calculator/calc_006.s.re 2007-02-25 17:17:26 UTC (rev 643) @@ -1,4 +1,4 @@ -/* re2c lesson 001_upn_calculator, calc_006, (c) M. Boerger 2006 */ +/* re2c lesson 001_upn_calculator, calc_006, (c) M. Boerger 2006 - 2007 */ /*!ignore:re2c - avoiding YYFILL() Modified: trunk/re2c/lessons/001_upn_calculator/calc_007.b.c =================================================================== --- trunk/re2c/lessons/001_upn_calculator/calc_007.b.c 2007-02-25 17:15:14 UTC (rev 642) +++ trunk/re2c/lessons/001_upn_calculator/calc_007.b.c 2007-02-25 17:17:26 UTC (rev 643) @@ -1,6 +1,6 @@ /* Generated by re2c */ #line 1 "calc_007.b.re" -/* re2c lesson 001_upn_calculator, calc_007, (c) M. Boerger 2006 */ +/* re2c lesson 001_upn_calculator, calc_007, (c) M. Boerger 2006 - 2007 */ #line 9 "calc_007.b.re" #include <stdlib.h> Modified: trunk/re2c/lessons/001_upn_calculator/calc_007.b.re =================================================================== --- trunk/re2c/lessons/001_upn_calculator/calc_007.b.re 2007-02-25 17:15:14 UTC (rev 642) +++ trunk/re2c/lessons/001_upn_calculator/calc_007.b.re 2007-02-25 17:17:26 UTC (rev 643) @@ -1,4 +1,4 @@ -/* re2c lesson 001_upn_calculator, calc_007, (c) M. Boerger 2006 */ +/* re2c lesson 001_upn_calculator, calc_007, (c) M. Boerger 2006 - 2007 */ /*!ignore:re2c - optimizing the generated code by using -b command line switch of re2c Modified: trunk/re2c/lessons/002_strip_comments/strip_001.s.c =================================================================== --- trunk/re2c/lessons/002_strip_comments/strip_001.s.c 2007-02-25 17:15:14 UTC (rev 642) +++ trunk/re2c/lessons/002_strip_comments/strip_001.s.c 2007-02-25 17:17:26 UTC (rev 643) @@ -1,6 +1,6 @@ /* Generated by re2c */ #line 1 "strip_001.s.re" -/* re2c lesson 002_strip_comments, strip_001.s, (c) M. Boerger 2006 */ +/* re2c lesson 002_strip_comments, strip_001.s, (c) M. Boerger 2006 - 2007 */ #line 32 "strip_001.s.re" #include <stdlib.h> Modified: trunk/re2c/lessons/002_strip_comments/strip_001.s.re =================================================================== --- trunk/re2c/lessons/002_strip_comments/strip_001.s.re 2007-02-25 17:15:14 UTC (rev 642) +++ trunk/re2c/lessons/002_strip_comments/strip_001.s.re 2007-02-25 17:17:26 UTC (rev 643) @@ -1,4 +1,4 @@ -/* re2c lesson 002_strip_comments, strip_001.s, (c) M. Boerger 2006 */ +/* re2c lesson 002_strip_comments, strip_001.s, (c) M. Boerger 2006 - 2007 */ /*!ignore:re2c - basic interface for file reading Modified: trunk/re2c/lessons/002_strip_comments/strip_002.s.c =================================================================== --- trunk/re2c/lessons/002_strip_comments/strip_002.s.c 2007-02-25 17:15:14 UTC (rev 642) +++ trunk/re2c/lessons/002_strip_comments/strip_002.s.c 2007-02-25 17:17:26 UTC (rev 643) @@ -1,6 +1,6 @@ /* Generated by re2c */ #line 1 "strip_002.s.re" -/* re2c lesson 002_strip_comments, strip_002.s, (c) M. Boerger 2006 */ +/* re2c lesson 002_strip_comments, strip_002.s, (c) M. Boerger 2006 - 2007 */ #line 32 "strip_002.s.re" #include <stdlib.h> Modified: trunk/re2c/lessons/002_strip_comments/strip_002.s.re =================================================================== --- trunk/re2c/lessons/002_strip_comments/strip_002.s.re 2007-02-25 17:15:14 UTC (rev 642) +++ trunk/re2c/lessons/002_strip_comments/strip_002.s.re 2007-02-25 17:17:26 UTC (rev 643) @@ -1,4 +1,4 @@ -/* re2c lesson 002_strip_comments, strip_002.s, (c) M. Boerger 2006 */ +/* re2c lesson 002_strip_comments, strip_002.s, (c) M. Boerger 2006 - 2007 */ /*!ignore:re2c - complexity Modified: trunk/re2c/lessons/002_strip_comments/strip_003.b.c =================================================================== --- trunk/re2c/lessons/002_strip_comments/strip_003.b.c 2007-02-25 17:15:14 UTC (rev 642) +++ trunk/re2c/lessons/002_strip_comments/strip_003.b.c 2007-02-25 17:17:26 UTC (rev 643) @@ -1,6 +1,6 @@ /* Generated by re2c */ #line 1 "strip_003.b.re" -/* re2c lesson 002_strip_comments, strip_003.b, (c) M. Boerger 2006 */ +/* re2c lesson 002_strip_comments, strip_003.b, (c) M. Boerger 2006 - 2007 */ #line 37 "strip_003.b.re" #include <stdlib.h> Modified: trunk/re2c/lessons/002_strip_comments/strip_003.b.re =================================================================== --- trunk/re2c/lessons/002_strip_comments/strip_003.b.re 2007-02-25 17:15:14 UTC (rev 642) +++ trunk/re2c/lessons/002_strip_comments/strip_003.b.re 2007-02-25 17:17:26 UTC (rev 643) @@ -1,4 +1,4 @@ -/* re2c lesson 002_strip_comments, strip_003.b, (c) M. Boerger 2006 */ +/* re2c lesson 002_strip_comments, strip_003.b, (c) M. Boerger 2006 - 2007 */ /*!ignore:re2c - more complexity This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <he...@us...> - 2007-02-25 17:15:15
|
Revision: 642 http://svn.sourceforge.net/re2c/?rev=642&view=rev Author: helly Date: 2007-02-25 09:15:14 -0800 (Sun, 25 Feb 2007) Log Message: ----------- - Extend lesson 1 Added Paths: ----------- trunk/re2c/lessons/001_upn_calculator/calc_008.b.c trunk/re2c/lessons/001_upn_calculator/calc_008.b.re Added: trunk/re2c/lessons/001_upn_calculator/calc_008.b.c =================================================================== --- trunk/re2c/lessons/001_upn_calculator/calc_008.b.c (rev 0) +++ trunk/re2c/lessons/001_upn_calculator/calc_008.b.c 2007-02-25 17:15:14 UTC (rev 642) @@ -0,0 +1,237 @@ +/* Generated by re2c */ +#line 1 "calc_008.b.re" +/* re2c lesson 001_upn_calculator, calc_008, (c) M. Boerger 2006 - 2007 */ +#line 31 "calc_008.b.re" + +#include <stdlib.h> +#include <stdio.h> +#include <string.h> + +#define DEBUG(stmt) stmt + +int stack[4]; +int depth = 0; + +int push_num(const char *t, const char *l, int radix) +{ + int num = 0; + + if (depth >= sizeof(stack)) + { + return 3; + } + + --t; + while(++t < l) + { + num = num * radix + (*t - '0'); + } + DEBUG(printf("Num: %d\n", num)); + + stack[depth++] = num; + return 0; +} + +int stack_add() +{ + if (depth < 2) return 4; + + --depth; + stack[depth-1] = stack[depth-1] + stack[depth]; + DEBUG(printf("+\n")); + return 0; +} + +int stack_sub() +{ + if (depth < 2) return 4; + + --depth; + stack[depth-1] = stack[depth-1] - stack[depth]; + DEBUG(printf("+\n")); + return 0; +} + +int scan(char *p) +{ + char *t; + int res = 0; + + while(!res) + { + t = p; + { + static const unsigned char yybm[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 128, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + }; + +#line 100 "<stdout>" + { + unsigned char curr; + + curr = (unsigned char)*p; + if(curr <= '*') { + if(curr <= 0x09) { + if(curr <= 0x00) goto scan11; + if(curr <= 0x08) goto scan13; + } else { + if(curr != ' ') goto scan13; + } + } else { + if(curr <= '-') { + if(curr <= '+') goto scan7; + if(curr <= ',') goto scan13; + goto scan9; + } else { + if(curr <= '/') goto scan13; + if(curr <= '0') goto scan4; + if(curr <= '9') goto scan6; + goto scan13; + } + } + ++p; + curr = (unsigned char)*p; + goto scan21; +scan3: +#line 103 "calc_008.b.re" + { continue; } +#line 130 "<stdout>" +scan4: + ++p; + if((curr = (unsigned char)*p) <= '/') goto scan5; + if(curr <= '9') goto scan17; +scan5: +#line 105 "calc_008.b.re" + { res = push_num(t, p, 10); continue; } +#line 138 "<stdout>" +scan6: + curr = (unsigned char)*++p; + goto scan16; +scan7: + ++p; +#line 106 "calc_008.b.re" + { res = stack_add(); continue; } +#line 146 "<stdout>" +scan9: + ++p; +#line 107 "calc_008.b.re" + { res = stack_sub(); continue; } +#line 151 "<stdout>" +scan11: + ++p; +#line 108 "calc_008.b.re" + { res = depth == 1 ? 0 : 2; break; } +#line 156 "<stdout>" +scan13: + ++p; +#line 109 "calc_008.b.re" + { res = 1; continue; } +#line 161 "<stdout>" +scan15: + ++p; + curr = (unsigned char)*p; +scan16: + if(yybm[0+curr] & 64) { + goto scan15; + } + goto scan5; +scan17: + ++p; + curr = (unsigned char)*p; + if(curr <= '/') goto scan19; + if(curr <= '9') goto scan17; +scan19: +#line 104 "calc_008.b.re" + { res = push_num(t, p, 8); continue; } +#line 178 "<stdout>" +scan20: + ++p; + curr = (unsigned char)*p; +scan21: + if(yybm[0+curr] & 128) { + goto scan20; + } + goto scan3; + } + } +#line 110 "calc_008.b.re" + + } + return res; +} + +int main(int argc, char **argv) +{ + if (argc > 1) + { + char *inp; + int res = 0, argp = 0, len; + + while(!res && ++argp < argc) + { + inp = strdup(argv[argp]); + len = strlen(inp); + if (inp[0] == '\"' && inp[len-1] == '\"') + { + inp[len - 1] = '\0'; + ++inp; + } + res = scan(inp); + free(inp); + } + switch(res) + { + case 0: + printf("Result: %d\n", stack[0]); + return 0; + case 1: + fprintf(stderr, "Illegal character in input.\n"); + return 1; + case 2: + fprintf(stderr, "Premature end of input.\n"); + return 2; + case 3: + fprintf(stderr, "Stack overflow.\n"); + return 3; + case 4: + fprintf(stderr, "Stack underflow.\n"); + return 4; + } + } + else + { + fprintf(stderr, "%s <expr>\n", argv[0]); + return 0; + } +} Property changes on: trunk/re2c/lessons/001_upn_calculator/calc_008.b.c ___________________________________________________________________ Name: svn:executable + * Name: svn:eol-style + native Added: trunk/re2c/lessons/001_upn_calculator/calc_008.b.re =================================================================== --- trunk/re2c/lessons/001_upn_calculator/calc_008.b.re (rev 0) +++ trunk/re2c/lessons/001_upn_calculator/calc_008.b.re 2007-02-25 17:15:14 UTC (rev 642) @@ -0,0 +1,158 @@ +/* re2c lesson 001_upn_calculator, calc_008, (c) M. Boerger 2006 - 2007 */ +/*!ignore:re2c + +- using -b with signed character input + . Since the code is being generated with -b switch re2c requires the internal + character variable yych to use an unsigned character type. For that reason + the previous lessons had a conversion at the beginning of their scan() + function. Other re2c generated code often have the scanners work completely + on unsigned input. Thus requesting a conversion. + + To avoid the conversion on input, re2c allows to do the conversion when + reading the internal yych variable. To enable that conversion you need to + use the implace configuration 're2c:yych:conversion' and set it to 1. This + will change the generated code to insert conversions to YYCTYPE whenever + yych is being read. + +- More inplace configurations for better/nicer code + . re2c allows to overwrite the generation of any define, label or variable + used in the generated code. For example we overwrite the 'yych' variable + name to 'curr' using inplace configuration 're2c:variable:yych = curr;'. + + . We further more use inplace configurations instead of defines. This allows + to use correct conversions to 'unsigned char' instead of having to convert + to 'YYCTYPE' when placing 're2c:define:YYCTYPE = "unsigned char";' infront + of 're2c:yych:conversion'. Note that we have to use apostrophies for the + first setting as it contains a space. + + . Last but not least we use 're2c:labelprefix = scan' to change the prefix + of generated labels. +*/ + +#include <stdlib.h> +#include <stdio.h> +#include <string.h> + +#define DEBUG(stmt) stmt + +int stack[4]; +int depth = 0; + +int push_num(const char *t, const char *l, int radix) +{ + int num = 0; + + if (depth >= sizeof(stack)) + { + return 3; + } + + --t; + while(++t < l) + { + num = num * radix + (*t - '0'); + } + DEBUG(printf("Num: %d\n", num)); + + stack[depth++] = num; + return 0; +} + +int stack_add() +{ + if (depth < 2) return 4; + + --depth; + stack[depth-1] = stack[depth-1] + stack[depth]; + DEBUG(printf("+\n")); + return 0; +} + +int stack_sub() +{ + if (depth < 2) return 4; + + --depth; + stack[depth-1] = stack[depth-1] - stack[depth]; + DEBUG(printf("+\n")); + return 0; +} + +int scan(char *p) +{ + char *t; + int res = 0; + + while(!res) + { + t = p; +/*!re2c + re2c:define:YYCTYPE = "unsigned char"; + re2c:define:YYCURSOR = p; + re2c:variable:yych = curr; + re2c:indent:top = 2; + re2c:yyfill:enable = 0; + re2c:yych:conversion = 1; + re2c:labelprefix = scan; + + DIGIT = [0-9] ; + OCT = "0" DIGIT+ ; + INT = "0" | ( [1-9] DIGIT* ) ; + WS = [ \t]+ ; + + WS { continue; } + OCT { res = push_num(t, p, 8); continue; } + INT { res = push_num(t, p, 10); continue; } + "+" { res = stack_add(); continue; } + "-" { res = stack_sub(); continue; } + "\000" { res = depth == 1 ? 0 : 2; break; } + [^] { res = 1; continue; } +*/ + } + return res; +} + +int main(int argc, char **argv) +{ + if (argc > 1) + { + char *inp; + int res = 0, argp = 0, len; + + while(!res && ++argp < argc) + { + inp = strdup(argv[argp]); + len = strlen(inp); + if (inp[0] == '\"' && inp[len-1] == '\"') + { + inp[len - 1] = '\0'; + ++inp; + } + res = scan(inp); + free(inp); + } + switch(res) + { + case 0: + printf("Result: %d\n", stack[0]); + return 0; + case 1: + fprintf(stderr, "Illegal character in input.\n"); + return 1; + case 2: + fprintf(stderr, "Premature end of input.\n"); + return 2; + case 3: + fprintf(stderr, "Stack overflow.\n"); + return 3; + case 4: + fprintf(stderr, "Stack underflow.\n"); + return 4; + } + } + else + { + fprintf(stderr, "%s <expr>\n", argv[0]); + return 0; + } +} Property changes on: trunk/re2c/lessons/001_upn_calculator/calc_008.b.re ___________________________________________________________________ Name: svn:executable + * This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <he...@us...> - 2007-02-25 16:48:22
|
Revision: 641 http://svn.sourceforge.net/re2c/?rev=641&view=rev Author: helly Date: 2007-02-25 08:48:19 -0800 (Sun, 25 Feb 2007) Log Message: ----------- - Added implace configuration 're2c:yyfill:parameter'. Modified Paths: -------------- trunk/re2c/CHANGELOG trunk/re2c/code.cc trunk/re2c/globals.h trunk/re2c/htdocs/manual.html trunk/re2c/main.cc trunk/re2c/re2c.1.in Added Paths: ----------- trunk/re2c/test/config10.c trunk/re2c/test/config10.re Modified: trunk/re2c/CHANGELOG =================================================================== --- trunk/re2c/CHANGELOG 2007-02-25 14:34:52 UTC (rev 640) +++ trunk/re2c/CHANGELOG 2007-02-25 16:48:19 UTC (rev 641) @@ -1,6 +1,7 @@ Version 0.11.2 (????-??-??) --------------------------- -- Add inplace configuration 're2c:yych:conversion'. +- Added inplace configuration 're2c:yyfill:parameter'. +- Added inplace configuration 're2c:yych:conversion'. - Fixed -u switch code generation. - Added ability to avoid defines and overwrite variable and label names. Modified: trunk/re2c/code.cc =================================================================== --- trunk/re2c/code.cc 2007-02-25 14:34:52 UTC (rev 640) +++ trunk/re2c/code.cc 2007-02-25 16:48:19 UTC (rev 641) @@ -327,12 +327,17 @@ { if (n == 1) { - o << indent(ind) << "if(" << mapCodeName["YYLIMIT"] << " == " << mapCodeName["YYCURSOR"] << ") " << mapCodeName["YYFILL"] << "(1);\n"; + o << indent(ind) << "if(" << mapCodeName["YYLIMIT"] << " == " << mapCodeName["YYCURSOR"] << ") " << mapCodeName["YYFILL"]; } else { - o << indent(ind) << "if((" << mapCodeName["YYLIMIT"] << " - " << mapCodeName["YYCURSOR"] << ") < " << n << ") " << mapCodeName["YYFILL"] << "(" << n << ");\n"; + o << indent(ind) << "if((" << mapCodeName["YYLIMIT"] << " - " << mapCodeName["YYCURSOR"] << ") < " << n << ") " << mapCodeName["YYFILL"]; } + if (bUseYYFillParam) + { + o << "(" << n << ")"; + } + o << ";\n"; } if (fFlag) @@ -1687,6 +1692,10 @@ { bUseYYFill = num != 0; } + else if (cfg.to_string() == "yyfill:parameter") + { + bUseYYFillParam = num != 0; + } else if (cfg.to_string() == "cgoto:threshold") { cGotoThreshold = num; Modified: trunk/re2c/globals.h =================================================================== --- trunk/re2c/globals.h 2007-02-25 14:34:52 UTC (rev 640) +++ trunk/re2c/globals.h 2007-02-25 16:48:19 UTC (rev 641) @@ -49,6 +49,7 @@ extern bool bUseStateNext; extern bool bWroteGetState; extern bool bUseYYFill; +extern bool bUseYYFillParam; extern uint asc2ebc[256]; extern uint ebc2asc[256]; Modified: trunk/re2c/htdocs/manual.html =================================================================== --- trunk/re2c/htdocs/manual.html 2007-02-25 14:34:52 UTC (rev 640) +++ trunk/re2c/htdocs/manual.html 2007-02-25 16:48:19 UTC (rev 641) @@ -360,6 +360,11 @@ <dd>Set this to zero to suppress generation of YYFILL(n). When using this be sure to verify that the generated scanner does not read behind input. Allowing this behavior might introduce sever security issues to you programs.</dd> +<dt><i>re2c:yyfill:parameter</i> <b>=</b> 1 <b>;</b></dt> +<dd>Allows to suppress parameter passing to <b>YYFILL</b> calls. If set to zero +then no parameter is passed to <b>YYFILL</b>. If set to a non zero value then +<b>YYFILL</b> usage will be followed by the number of requested characters in +braces.</dd> <dt><i>re2c:startlabel</i> <b>=</b> 0 <b>;</b></dt> <dd>If set to a non zero integer then the start label of the next scanner blocks will be generated even if not used by the scanner itself. Otherwise the @@ -385,7 +390,6 @@ generation of jump tables rather than using nested if's and decision bitfields. The threshold is compared against a calculated estimation of if-s needed where every used bitmap divides the threshold by 2.</dd> -.TP <dt><i>re2c:yych:conversion</i> <b>=</b> 0 <b>;</b></dt> <dd>When the input uses signed characters and <b>-s</b> or <b>-b</b> switches are in effect re2c allows to automatically convert to the unsigned character type Modified: trunk/re2c/main.cc =================================================================== --- trunk/re2c/main.cc 2007-02-25 14:34:52 UTC (rev 640) +++ trunk/re2c/main.cc 2007-02-25 16:48:19 UTC (rev 641) @@ -39,9 +39,10 @@ bool bUsedYYMaxFill = false; bool bUsedYYMarker = true; -bool bUseStartLabel= false; -bool bUseStateNext = false; -bool bUseYYFill = true; +bool bUseStartLabel = false; +bool bUseStateNext = false; +bool bUseYYFill = true; +bool bUseYYFillParam = true; std::string startLabelName; std::string labelPrefix("yy"); Modified: trunk/re2c/re2c.1.in =================================================================== --- trunk/re2c/re2c.1.in 2007-02-25 14:34:52 UTC (rev 640) +++ trunk/re2c/re2c.1.in 2007-02-25 16:48:19 UTC (rev 641) @@ -427,6 +427,12 @@ to verify that the generated scanner does not read behind input. Allowing this behavior might introduce sever security issues to you programs. .TP +\fIre2c:yyfill:parameter\fP \fB=\fP 1 \fB;\fP +Allows to suppress parameter passing to \fBYYFILL\fP calls. If set to zero +then no parameter is passed to \fBYYFILL\fP. If set to a non zero value then +\fBYYFILL\fP usage will be followed by the number of requested characters in +braces. +.TP \fIre2c:startlabel\fP \fB=\fP 0 \fB;\fP If set to a non zero integer then the start label of the next scanner blocks will be generated even if not used by the scanner itself. Otherwise the normal Added: trunk/re2c/test/config10.c =================================================================== --- trunk/re2c/test/config10.c (rev 0) +++ trunk/re2c/test/config10.c 2007-02-25 16:48:19 UTC (rev 641) @@ -0,0 +1,190 @@ +/* Generated by re2c */ +#line 1 "config10.re" +#include <cstring> +#include <iostream> + +struct Scanner +{ + Scanner(char *txt) + : cur(txt), lim(txt + strlen(txt)) + { + } + + char *cur; + char *lim; + char *ptr; + char *ctx; + char *tok; +}; + +enum What +{ + UNEXPECTED, + KEYWORD, + NUMBER, + EOI +}; + +char * tokens[] = { "UNEXPECTED", "KEYWORD", "NUMBER", "EOI" }; + +void fill() +{ +} + +int scan(Scanner &s) +{ + char *cursor = s.cur; + + if(cursor == s.lim) + return EOI; + +std: + s.tok = cursor; + + +#line 46 "<stdout>" +{ + char curr; + + if((s.lim - s.cur) < 3) fill(); + curr = *s.cur; + switch(curr) { + case 0x09: + case ' ': goto xx6; + case 0x0A: goto xx8; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto xx4; + case 'a': + case 'b': goto xx2; + default: goto xx9; + } +xx2: + s.ctx = s.cur + 1; + ++s.cur; + switch((curr = *s.cur)) { + case '0': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto xx12; + case '1': goto xx15; + default: goto xx3; + } +xx3: +#line 67 "config10.re" + { + return UNEXPECTED; + } +#line 91 "<stdout>" +xx4: + ++s.cur; + curr = *s.cur; + goto xx11; +xx5: +#line 57 "config10.re" + { return NUMBER; } +#line 99 "<stdout>" +xx6: + ++s.cur; +xx7: +#line 60 "config10.re" + { + if(s.cur == s.lim) + return EOI; + cursor = s.cur; + goto std; + } +#line 110 "<stdout>" +xx8: + curr = *++s.cur; + goto xx7; +xx9: + curr = *++s.cur; + goto xx3; +xx10: + ++s.cur; + if(s.lim == s.cur) fill(); + curr = *s.cur; +xx11: + switch(curr) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto xx10; + default: goto xx5; + } +xx12: + ++s.cur; + if(s.lim == s.cur) fill(); + curr = *s.cur; + switch(curr) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto xx12; + default: goto xx14; + } +xx14: + s.cur = s.ctx; +#line 56 "config10.re" + { return KEYWORD; } +#line 156 "<stdout>" +xx15: + ++s.cur; + switch((curr = *s.cur)) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto xx12; + default: goto xx16; + } +xx16: + s.cur = s.ctx; +#line 55 "config10.re" + { return KEYWORD; } +#line 176 "<stdout>" +} +#line 70 "config10.re" + +} + +int main(int,char**) +{ + Scanner s("a77 a1 b8 b1"); + + int t, n = 0; + while ((t = scan(s)) != EOI) + { + std::cout << (++n) << ": " << tokens[t] << " = \""; std::cout.write(s.tok, s.cur-s.tok); std::cout << "\"" << std::endl; + } +} Property changes on: trunk/re2c/test/config10.c ___________________________________________________________________ Name: svn:executable + * Name: svn:eol-style + native Added: trunk/re2c/test/config10.re =================================================================== --- trunk/re2c/test/config10.re (rev 0) +++ trunk/re2c/test/config10.re 2007-02-25 16:48:19 UTC (rev 641) @@ -0,0 +1,82 @@ +#include <cstring> +#include <iostream> + +struct Scanner +{ + Scanner(char *txt) + : cur(txt), lim(txt + strlen(txt)) + { + } + + char *cur; + char *lim; + char *ptr; + char *ctx; + char *tok; +}; + +enum What +{ + UNEXPECTED, + KEYWORD, + NUMBER, + EOI +}; + +char * tokens[] = { "UNEXPECTED", "KEYWORD", "NUMBER", "EOI" }; + +void fill() +{ +} + +int scan(Scanner &s) +{ + char *cursor = s.cur; + + if(cursor == s.lim) + return EOI; + +std: + s.tok = cursor; + +/*!re2c + +re2c:define:YYCTYPE = char; +re2c:define:YYCURSOR = s.cur; +re2c:define:YYLIMIT = s.lim; +re2c:define:YYMARKER = s.ptr; +re2c:define:YYCTXMARKER = s.ctx; +re2c:define:YYFILL = "fill()"; + +re2c:yyfill:parameter = 0; +re2c:variable:yych = curr; +re2c:labelprefix = xx; + +("a"|"b")/[1] { return KEYWORD; } +("a"|"b")/[0-9]+ { return KEYWORD; } +[0-9]+ { return NUMBER; } + +[ \t\n] + { + if(s.cur == s.lim) + return EOI; + cursor = s.cur; + goto std; + } +. + { + return UNEXPECTED; + } +*/ +} + +int main(int,char**) +{ + Scanner s("a77 a1 b8 b1"); + + int t, n = 0; + while ((t = scan(s)) != EOI) + { + std::cout << (++n) << ": " << tokens[t] << " = \""; std::cout.write(s.tok, s.cur-s.tok); std::cout << "\"" << std::endl; + } +} Property changes on: trunk/re2c/test/config10.re ___________________________________________________________________ Name: svn:executable + * This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <he...@us...> - 2007-02-25 14:34:54
|
Revision: 640 http://svn.sourceforge.net/re2c/?rev=640&view=rev Author: helly Date: 2007-02-25 06:34:52 -0800 (Sun, 25 Feb 2007) Log Message: ----------- - Added inplace configuration 're2c:yych:conversion' Modified Paths: -------------- trunk/re2c/CHANGELOG trunk/re2c/code.cc trunk/re2c/globals.h trunk/re2c/htdocs/manual.html trunk/re2c/main.cc trunk/re2c/re2c.1.in Added Paths: ----------- trunk/re2c/test/config9.b.c trunk/re2c/test/config9.b.re Modified: trunk/re2c/CHANGELOG =================================================================== --- trunk/re2c/CHANGELOG 2007-02-24 17:27:20 UTC (rev 639) +++ trunk/re2c/CHANGELOG 2007-02-25 14:34:52 UTC (rev 640) @@ -1,5 +1,6 @@ Version 0.11.2 (????-??-??) --------------------------- +- Add inplace configuration 're2c:yych:conversion'. - Fixed -u switch code generation. - Added ability to avoid defines and overwrite variable and label names. Modified: trunk/re2c/code.cc =================================================================== --- trunk/re2c/code.cc 2007-02-24 17:27:20 UTC (rev 639) +++ trunk/re2c/code.cc 2007-02-25 14:34:52 UTC (rev 640) @@ -287,7 +287,7 @@ { if (readCh && from->label + 1 != to->label) { - o << indent(ind) << mapCodeName["yych"] << " = *" << mapCodeName["YYCURSOR"] << ";\n"; + o << indent(ind) << mapCodeName["yych"] << " = " << yychConversion << "*" << mapCodeName["YYCURSOR"] << ";\n"; readCh = false; } @@ -300,7 +300,7 @@ o << indent(ind) << "if("; if (readCh) { - o << "(" << mapCodeName["yych"] << " = *" << mapCodeName["YYCURSOR"] << ")"; + o << "(" << mapCodeName["yych"] << " = " << yychConversion << "*" << mapCodeName["YYCURSOR"] << ")"; readCh = false; } else @@ -342,11 +342,11 @@ if (bSetMarker) { - o << indent(ind) << mapCodeName["yych"] << " = *(" << mapCodeName["YYMARKER"] << " = " << mapCodeName["YYCURSOR"] << ");\n"; + o << indent(ind) << mapCodeName["yych"] << " = " << yychConversion << "*(" << mapCodeName["YYMARKER"] << " = " << mapCodeName["YYCURSOR"] << ");\n"; } else { - o << indent(ind) << mapCodeName["yych"] << " = *" << mapCodeName["YYCURSOR"] << ";\n"; + o << indent(ind) << mapCodeName["yych"] << " = " << yychConversion << "*" << mapCodeName["YYCURSOR"] << ";\n"; } readCh = false; } @@ -365,7 +365,7 @@ } else { - o << indent(ind) << mapCodeName["yych"] << " = *++" << mapCodeName["YYCURSOR"] << ";\n"; + o << indent(ind) << mapCodeName["yych"] << " = " << yychConversion << "*++" << mapCodeName["YYCURSOR"] << ";\n"; readCh = false; } @@ -389,7 +389,7 @@ else { /* we shouldn't need 'rule-following' protection here */ - o << indent(ind) << mapCodeName["yych"] << " = *++" << mapCodeName["YYCURSOR"] << ";\n"; + o << indent(ind) << mapCodeName["yych"] << " = " << yychConversion << "*++" << mapCodeName["YYCURSOR"] << ";\n"; if (vUsedLabels.count(label)) { o << labelPrefix << label << ":\n"; @@ -413,7 +413,7 @@ } else { - o << indent(ind) << mapCodeName["yych"] << " = *++" << mapCodeName["YYCURSOR"] << ";\n"; + o << indent(ind) << mapCodeName["yych"] << " = " << yychConversion << "*++" << mapCodeName["YYCURSOR"] << ";\n"; } } @@ -464,11 +464,11 @@ { if (bUsedYYMarker) { - o << indent(ind) << mapCodeName["yych"] << " = *(" << mapCodeName["YYMARKER"] << " = ++" << mapCodeName["YYCURSOR"] << ");\n"; + o << indent(ind) << mapCodeName["yych"] << " = " << yychConversion << "*(" << mapCodeName["YYMARKER"] << " = ++" << mapCodeName["YYCURSOR"] << ");\n"; } else { - o << indent(ind) << mapCodeName["yych"] << " = *++" << mapCodeName["YYCURSOR"] << ";\n"; + o << indent(ind) << mapCodeName["yych"] << " = " << yychConversion << "*++" << mapCodeName["YYCURSOR"] << ";\n"; } readCh = false; } @@ -528,7 +528,7 @@ if (readCh) // shouldn't be necessary, but might become at some point { - o << indent(ind) << mapCodeName["yych"] << " = *" << mapCodeName["YYCURSOR"] << ";\n"; + o << indent(ind) << mapCodeName["yych"] << " = " << yychConversion << "*" << mapCodeName["YYCURSOR"] << ";\n"; readCh = false; } @@ -741,7 +741,7 @@ if (readCh) { - o << indent(ind) << "switch((" << mapCodeName["yych"] << " = *" << mapCodeName["YYCURSOR"] << ")) {\n"; + o << indent(ind) << "switch((" << mapCodeName["yych"] << " = " << yychConversion << "*" << mapCodeName["YYCURSOR"] << ")) {\n"; readCh = false; } else @@ -894,7 +894,7 @@ if (readCh) { - sYych = "(" + mapCodeName["yych"] + " = *" + mapCodeName["YYCURSOR"] + ")"; + sYych = "(" + mapCodeName["yych"] + " = " + yychConversion + "*" + mapCodeName["YYCURSOR"] + ")"; } else { @@ -1012,7 +1012,7 @@ go.unmap(this, to); if (readCh) { - sYych = "(" + mapCodeName["yych"] + " = *" + mapCodeName["YYCURSOR"] + ")"; + sYych = "(" + mapCodeName["yych"] + " = " + yychConversion + "*" + mapCodeName["YYCURSOR"] + ")"; } else { @@ -1691,6 +1691,19 @@ { cGotoThreshold = num; } + else if (cfg.to_string() == "yych:conversion") + { + if (num) + { + yychConversion = "("; + yychConversion += mapCodeName["YYCTYPE"]; + yychConversion += ")"; + } + else + { + yychConversion = ""; + } + } else { fatal("unrecognized configuration name or illegal integer value"); @@ -1748,6 +1761,10 @@ { labelPrefix = strVal; } + else if (cfg.to_string() == "yych:conversion") + { + yychConversion = mapCodeName["YYCTYPE"]; + } else if (mapVariableKeys.find(cfg.to_string()) != mapVariableKeys.end()) { if (bFirstPass && !mapCodeName.insert( Modified: trunk/re2c/globals.h =================================================================== --- trunk/re2c/globals.h 2007-02-24 17:27:20 UTC (rev 639) +++ trunk/re2c/globals.h 2007-02-25 14:34:52 UTC (rev 640) @@ -36,6 +36,7 @@ extern bool bUseStartLabel; extern std::string startLabelName; extern std::string labelPrefix; +extern std::string yychConversion; extern uint maxFill; extern uint next_label; extern uint cGotoThreshold; Modified: trunk/re2c/htdocs/manual.html =================================================================== --- trunk/re2c/htdocs/manual.html 2007-02-24 17:27:20 UTC (rev 639) +++ trunk/re2c/htdocs/manual.html 2007-02-25 14:34:52 UTC (rev 640) @@ -385,6 +385,18 @@ generation of jump tables rather than using nested if's and decision bitfields. The threshold is compared against a calculated estimation of if-s needed where every used bitmap divides the threshold by 2.</dd> +.TP +<dt><i>re2c:yych:conversion</i> <b>=</b> 0 <b>;</b></dt> +<dd>When the input uses signed characters and <b>-s</b> or <b>-b</b> switches are +in effect re2c allows to automatically convert to the unsigned character type +that is then necessary for its internal single character. When this setting +is zero or an empty string the conversion is disabled. Using a non zero number +the conversion is taken from <b>YYCTYPE</b>. If that is given by an inplace +configuration that value is being used. Otherwise it will be <b>(YYCTYPE)</b> +and changes to that configuration are no longer possible. When this setting is +a string the braces must be specified. Now assuming your input is a <b>char*</b> +buffer and you are using above mentioned switches you can set <b>YYCTYPE</b> to +<b>unsigned char</b> and this setting to either <b>1</b> or <b>"(unsigned char)"</b>.</dd> <dt><i>re2c:define:YYCTXMARKER</i> <b>=</b> YYCTXMARKER <b>;</b></dt> <dd>Allows to overwrite the define YYCTXMARKER and thus avoiding it by setting the value to the actual code needed.</dd> Modified: trunk/re2c/main.cc =================================================================== --- trunk/re2c/main.cc 2007-02-24 17:27:20 UTC (rev 639) +++ trunk/re2c/main.cc 2007-02-25 14:34:52 UTC (rev 640) @@ -45,6 +45,7 @@ std::string startLabelName; std::string labelPrefix("yy"); +std::string yychConversion(""); uint maxFill = 1; uint next_label = 0; uint cGotoThreshold = 9; Modified: trunk/re2c/re2c.1.in =================================================================== --- trunk/re2c/re2c.1.in 2007-02-24 17:27:20 UTC (rev 639) +++ trunk/re2c/re2c.1.in 2007-02-25 14:34:52 UTC (rev 640) @@ -457,6 +457,18 @@ The threshold is compared against a calculated estimation of if-s needed where every used bitmap divides the threshold by 2. .TP +\fIre2c:yych:conversion\fP \fB=\fP 0 \fB;\fP +When the input uses signed characters and \fB-s\fP or \fB-b\fP switches are +in effect re2c allows to automatically convert to the unsigned character type +that is then necessary for its internal single character. When this setting +is zero or an empty string the conversion is disabled. Using a non zero number +the conversion is taken from \fBYYCTYPE\fP. If that is given by an inplace +configuration that value is being used. Otherwise it will be \fB(YYCTYPE)\fP +and changes to that configuration are no longer possible. When this setting is +a string the braces must be specified. Now assuming your input is a \fBchar*\fP +buffer and you are using above mentioned switches you can set \fBYYCTYPE\fP to +\fBunsigned char\fP and this setting to either \fB1\fP or \fB"(unsigned char)"\fP. +.TP \fIre2c:define:YYCTXMARKER\fP \fB=\fP YYCTXMARKER \fB;\fP Allows to overwrite the define YYCTXMARKER and thus avoiding it by setting the value to the actual code needed. Added: trunk/re2c/test/config9.b.c =================================================================== --- trunk/re2c/test/config9.b.c (rev 0) +++ trunk/re2c/test/config9.b.c 2007-02-25 14:34:52 UTC (rev 640) @@ -0,0 +1,184 @@ +/* Generated by re2c */ +#line 1 "config9.b.re" +#include <cstring> +#include <iostream> + +struct Scanner +{ + Scanner(char *txt) + : cur(txt), lim(txt + strlen(txt)) + { + } + + char *cur; + char *lim; + char *ptr; + char *ctx; + char *tok; +}; + +enum What +{ + UNEXPECTED, + KEYWORD, + NUMBER, + EOI +}; + +char * tokens[] = { "UNEXPECTED", "KEYWORD", "NUMBER", "EOI" }; + +void fill(int) +{ +} + +int scan(Scanner &s) +{ + char *cursor = s.cur; + + if(cursor == s.lim) + return EOI; + +std: + s.tok = cursor; + +{ + static const unsigned char yybm[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + }; + +#line 81 "<stdout>" + { + unsigned char curr; + + if((s.lim - s.cur) < 3) fill(3); + curr = (unsigned char)*s.cur; + if(curr <= ' ') { + if(curr <= 0x09) { + if(curr <= 0x08) goto xx9; + goto xx6; + } else { + if(curr <= 0x0A) goto xx8; + if(curr <= 0x1F) goto xx9; + goto xx6; + } + } else { + if(curr <= '9') { + if(curr <= '/') goto xx9; + goto xx4; + } else { + if(curr <= '`') goto xx9; + if(curr >= 'c') goto xx9; + } + } + s.ctx = s.cur + 1; + ++s.cur; + if((curr = (unsigned char)*s.cur) <= '/') goto xx3; + if(curr == '1') goto xx15; + if(curr <= '9') goto xx12; +xx3: +#line 68 "config9.b.re" + { + return UNEXPECTED; + } +#line 115 "<stdout>" +xx4: + ++s.cur; + curr = (unsigned char)*s.cur; + goto xx11; +xx5: +#line 58 "config9.b.re" + { return NUMBER; } +#line 123 "<stdout>" +xx6: + ++s.cur; +xx7: +#line 61 "config9.b.re" + { + if(s.cur == s.lim) + return EOI; + cursor = s.cur; + goto std; + } +#line 134 "<stdout>" +xx8: + curr = (unsigned char)*++s.cur; + goto xx7; +xx9: + curr = (unsigned char)*++s.cur; + goto xx3; +xx10: + ++s.cur; + if(s.lim == s.cur) fill(1); + curr = (unsigned char)*s.cur; +xx11: + if(yybm[0+curr] & 128) { + goto xx10; + } + goto xx5; +xx12: + ++s.cur; + if(s.lim == s.cur) fill(1); + curr = (unsigned char)*s.cur; + if(curr <= '/') goto xx14; + if(curr <= '9') goto xx12; +xx14: + s.cur = s.ctx; +#line 57 "config9.b.re" + { return KEYWORD; } +#line 160 "<stdout>" +xx15: + ++s.cur; + if((curr = (unsigned char)*s.cur) <= '/') goto xx16; + if(curr <= '9') goto xx12; +xx16: + s.cur = s.ctx; +#line 56 "config9.b.re" + { return KEYWORD; } +#line 169 "<stdout>" + } +} +#line 71 "config9.b.re" + +} + +int main(int,char**) +{ + Scanner s("a77 a1 b8 b1"); + + int t, n = 0; + while ((t = scan(s)) != EOI) + { + std::cout << (++n) << ": " << tokens[t] << " = \""; std::cout.write(s.tok, s.cur-s.tok); std::cout << "\"" << std::endl; + } +} Property changes on: trunk/re2c/test/config9.b.c ___________________________________________________________________ Name: svn:executable + * Name: svn:eol-style + native Added: trunk/re2c/test/config9.b.re =================================================================== --- trunk/re2c/test/config9.b.re (rev 0) +++ trunk/re2c/test/config9.b.re 2007-02-25 14:34:52 UTC (rev 640) @@ -0,0 +1,83 @@ +#include <cstring> +#include <iostream> + +struct Scanner +{ + Scanner(char *txt) + : cur(txt), lim(txt + strlen(txt)) + { + } + + char *cur; + char *lim; + char *ptr; + char *ctx; + char *tok; +}; + +enum What +{ + UNEXPECTED, + KEYWORD, + NUMBER, + EOI +}; + +char * tokens[] = { "UNEXPECTED", "KEYWORD", "NUMBER", "EOI" }; + +void fill(int) +{ +} + +int scan(Scanner &s) +{ + char *cursor = s.cur; + + if(cursor == s.lim) + return EOI; + +std: + s.tok = cursor; + +/*!re2c + +re2c:define:YYCTYPE = "unsigned char"; +re2c:define:YYCURSOR = s.cur; +re2c:define:YYLIMIT = s.lim; +re2c:define:YYMARKER = s.ptr; +re2c:define:YYCTXMARKER = s.ctx; +re2c:define:YYFILL = fill; + +re2c:variable:yych = curr; +re2c:labelprefix = xx; + +re2c:yych:conversion = 1; + +("a"|"b")/[1] { return KEYWORD; } +("a"|"b")/[0-9]+ { return KEYWORD; } +[0-9]+ { return NUMBER; } + +[ \t\n] + { + if(s.cur == s.lim) + return EOI; + cursor = s.cur; + goto std; + } +. + { + return UNEXPECTED; + } +*/ +} + +int main(int,char**) +{ + Scanner s("a77 a1 b8 b1"); + + int t, n = 0; + while ((t = scan(s)) != EOI) + { + std::cout << (++n) << ": " << tokens[t] << " = \""; std::cout.write(s.tok, s.cur-s.tok); std::cout << "\"" << std::endl; + } +} Property changes on: trunk/re2c/test/config9.b.re ___________________________________________________________________ Name: svn:executable + * This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <he...@us...> - 2007-02-24 17:27:27
|
Revision: 639 http://svn.sourceforge.net/re2c/?rev=639&view=rev Author: helly Date: 2007-02-24 09:27:20 -0800 (Sat, 24 Feb 2007) Log Message: ----------- - Add/fix tests Modified Paths: -------------- trunk/re2c/test/cvsignore.u.c trunk/re2c/test/cvsignore.u.re Added Paths: ----------- trunk/re2c/test/cvsignore.ub.c trunk/re2c/test/cvsignore.ub.re Modified: trunk/re2c/test/cvsignore.u.c =================================================================== --- trunk/re2c/test/cvsignore.u.c 2007-02-24 17:21:01 UTC (rev 638) +++ trunk/re2c/test/cvsignore.u.c 2007-02-24 17:27:20 UTC (rev 639) @@ -2,7 +2,7 @@ #line 1 "cvsignore.u.re" #define YYFILL(n) if (cursor >= limit) break; -#define YYCTYPE unsigned short +#define YYCTYPE unsigned int #define YYCURSOR cursor #define YYLIMIT limit #define YYMARKER marker Modified: trunk/re2c/test/cvsignore.u.re =================================================================== --- trunk/re2c/test/cvsignore.u.re 2007-02-24 17:21:01 UTC (rev 638) +++ trunk/re2c/test/cvsignore.u.re 2007-02-24 17:27:20 UTC (rev 639) @@ -1,6 +1,6 @@ #define YYFILL(n) if (cursor >= limit) break; -#define YYCTYPE unsigned short +#define YYCTYPE unsigned int #define YYCURSOR cursor #define YYLIMIT limit #define YYMARKER marker Added: trunk/re2c/test/cvsignore.ub.c =================================================================== --- trunk/re2c/test/cvsignore.ub.c (rev 0) +++ trunk/re2c/test/cvsignore.ub.c 2007-02-24 17:27:20 UTC (rev 639) @@ -0,0 +1,261 @@ +/* Generated by re2c */ +#line 1 "cvsignore.ub.re" + +#define YYFILL(n) if (cursor >= limit) break; +#define YYCTYPE unsigned int +#define YYCURSOR cursor +#define YYLIMIT limit +#define YYMARKER marker + +#line 16 "cvsignore.ub.re" + + +#define APPEND(text) \ + append(output, outsize, text, sizeof(text) - sizeof(YYCTYPE)) + +inline void append(YYCTYPE *output, size_t & outsize, const YYCTYPE * text, size_t len) +{ + memcpy(output + outsize, text, len); + outsize += (len / sizeof(YYCTYPE)); +} + +void scan(YYCTYPE *pText, size_t *pSize, int *pbChanged) +{ + // rule + // scan lines + // find $ in lines + // compact $<keyword>: .. $ to $<keyword>$ + + YYCTYPE *output; + const YYCTYPE *cursor, *limit, *marker; + + cursor = marker = output = *pText; + + size_t insize = *pSize; + size_t outsize = 0; + + limit = cursor + insize; + + while(1) { +loop: +{ + static const unsigned char yybm[] = { + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 0, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 0, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + }; + +#line 78 "<stdout>" + { + YYCTYPE yych; + + if((YYLIMIT - YYCURSOR) < 11) YYFILL(11); + yych = *YYCURSOR; + if(yych != '$') goto yy4; + yych = *(YYMARKER = ++YYCURSOR); + switch(yych) { + case 'D': goto yy10; + case 'I': goto yy9; + case 'L': goto yy8; + case 'R': goto yy7; + case 'S': goto yy5; + default: goto yy3; + } +yy3: +#line 53 "cvsignore.ub.re" + { output[outsize++] = cursor[-1]; if (cursor >= limit) break; goto loop; } +#line 97 "<stdout>" +yy4: + yych = *++YYCURSOR; + goto yy3; +yy5: + yych = *++YYCURSOR; + if(yych == 'o') goto yy44; +yy6: + YYCURSOR = YYMARKER; + goto yy3; +yy7: + yych = *++YYCURSOR; + if(yych == 'e') goto yy32; + goto yy6; +yy8: + yych = *++YYCURSOR; + if(yych == 'o') goto yy25; + goto yy6; +yy9: + yych = *++YYCURSOR; + if(yych == 'd') goto yy19; + goto yy6; +yy10: + yych = *++YYCURSOR; + if(yych != 'a') goto yy6; + yych = *++YYCURSOR; + if(yych != 't') goto yy6; + yych = *++YYCURSOR; + if(yych != 'e') goto yy6; + yych = *++YYCURSOR; + if(yych == '$') goto yy15; + if(yych != ':') goto yy6; + yych = *++YYCURSOR; + if(yych == '$') goto yy6; + goto yy18; +yy15: + ++YYCURSOR; +#line 48 "cvsignore.ub.re" + { APPEND(L"$" L"Date$"); goto loop; } +#line 136 "<stdout>" +yy17: + ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; +yy18: + if(yych & ~0xFF) { + goto yy17; + } else if(yybm[0+yych] & 128) { + goto yy17; + } + if(yych <= '#') goto yy6; + goto yy15; +yy19: + yych = *++YYCURSOR; + if(yych == '$') goto yy21; + if(yych != ':') goto yy6; + yych = *++YYCURSOR; + if(yych == '$') goto yy6; + goto yy24; +yy21: + ++YYCURSOR; +#line 49 "cvsignore.ub.re" + { APPEND(L"$" L"Id$"); goto loop; } +#line 160 "<stdout>" +yy23: + ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; +yy24: + if(yych == 0x0000000A) goto yy6; + if(yych == '$') goto yy21; + goto yy23; +yy25: + yych = *++YYCURSOR; + if(yych != 'g') goto yy6; + yych = *++YYCURSOR; + if(yych == '$') goto yy28; + if(yych != ':') goto yy6; + yych = *++YYCURSOR; + if(yych == '$') goto yy6; + goto yy31; +yy28: + ++YYCURSOR; +#line 50 "cvsignore.ub.re" + { APPEND(L"$" L"Log$"); goto loop; } +#line 182 "<stdout>" +yy30: + ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; +yy31: + if(yych == 0x0000000A) goto yy6; + if(yych == '$') goto yy28; + goto yy30; +yy32: + yych = *++YYCURSOR; + if(yych != 'v') goto yy6; + yych = *++YYCURSOR; + if(yych != 'i') goto yy6; + yych = *++YYCURSOR; + if(yych != 's') goto yy6; + yych = *++YYCURSOR; + if(yych != 'i') goto yy6; + yych = *++YYCURSOR; + if(yych != 'o') goto yy6; + yych = *++YYCURSOR; + if(yych != 'n') goto yy6; + yych = *++YYCURSOR; + if(yych == '$') goto yy40; + if(yych != ':') goto yy6; + yych = *++YYCURSOR; + if(yych == '$') goto yy6; + goto yy43; +yy40: + ++YYCURSOR; +#line 51 "cvsignore.ub.re" + { APPEND(L"$" L"Revision$"); goto loop; } +#line 214 "<stdout>" +yy42: + ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; +yy43: + if(yych == 0x0000000A) goto yy6; + if(yych == '$') goto yy40; + goto yy42; +yy44: + yych = *++YYCURSOR; + if(yych != 'u') goto yy6; + yych = *++YYCURSOR; + if(yych != 'r') goto yy6; + yych = *++YYCURSOR; + if(yych != 'c') goto yy6; + yych = *++YYCURSOR; + if(yych != 'e') goto yy6; + yych = *++YYCURSOR; + if(yych == '$') goto yy50; + if(yych != ':') goto yy6; + yych = *++YYCURSOR; + if(yych == '$') goto yy6; + goto yy53; +yy50: + ++YYCURSOR; +#line 52 "cvsignore.ub.re" + { APPEND(L"$" L"Source$"); goto loop; } +#line 242 "<stdout>" +yy52: + ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; +yy53: + if(yych == 0x0000000A) goto yy6; + if(yych == '$') goto yy50; + goto yy52; + } +} +#line 55 "cvsignore.ub.re" + + } + output[outsize] = '\0'; + + // set the new size + *pSize = outsize; + + *pbChanged = (insize == outsize) ? 0 : 1; +} Property changes on: trunk/re2c/test/cvsignore.ub.c ___________________________________________________________________ Name: svn:executable + * Name: svn:eol-style + native Added: trunk/re2c/test/cvsignore.ub.re =================================================================== --- trunk/re2c/test/cvsignore.ub.re (rev 0) +++ trunk/re2c/test/cvsignore.ub.re 2007-02-24 17:27:20 UTC (rev 639) @@ -0,0 +1,63 @@ + +#define YYFILL(n) if (cursor >= limit) break; +#define YYCTYPE unsigned int +#define YYCURSOR cursor +#define YYLIMIT limit +#define YYMARKER marker + +/*!re2c +any = (.|"\n"); +value = (":" (.\"$")+)?; +cvsdat = "Date"; +cvsid = "Id"; +cvslog = "Log"; +cvsrev = "Revision"; +cvssrc = "Source"; +*/ + +#define APPEND(text) \ + append(output, outsize, text, sizeof(text) - sizeof(YYCTYPE)) + +inline void append(YYCTYPE *output, size_t & outsize, const YYCTYPE * text, size_t len) +{ + memcpy(output + outsize, text, len); + outsize += (len / sizeof(YYCTYPE)); +} + +void scan(YYCTYPE *pText, size_t *pSize, int *pbChanged) +{ + // rule + // scan lines + // find $ in lines + // compact $<keyword>: .. $ to $<keyword>$ + + YYCTYPE *output; + const YYCTYPE *cursor, *limit, *marker; + + cursor = marker = output = *pText; + + size_t insize = *pSize; + size_t outsize = 0; + + limit = cursor + insize; + + while(1) { +loop: +/*!re2c + +"$" cvsdat value "$" { APPEND(L"$" L"Date$"); goto loop; } +"$" cvsid value "$" { APPEND(L"$" L"Id$"); goto loop; } +"$" cvslog value "$" { APPEND(L"$" L"Log$"); goto loop; } +"$" cvsrev value "$" { APPEND(L"$" L"Revision$"); goto loop; } +"$" cvssrc value "$" { APPEND(L"$" L"Source$"); goto loop; } +any { output[outsize++] = cursor[-1]; if (cursor >= limit) break; goto loop; } + +*/ + } + output[outsize] = '\0'; + + // set the new size + *pSize = outsize; + + *pbChanged = (insize == outsize) ? 0 : 1; +} Property changes on: trunk/re2c/test/cvsignore.ub.re ___________________________________________________________________ Name: svn:executable + * This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <he...@us...> - 2007-02-24 17:21:07
|
Revision: 638 http://svn.sourceforge.net/re2c/?rev=638&view=rev Author: helly Date: 2007-02-24 09:21:01 -0800 (Sat, 24 Feb 2007) Log Message: ----------- - Fix minor issue with -u code generation Modified Paths: -------------- trunk/re2c/CHANGELOG trunk/re2c/code.cc trunk/re2c/test/cvsignore.wb.c Modified: trunk/re2c/CHANGELOG =================================================================== --- trunk/re2c/CHANGELOG 2007-02-23 21:30:13 UTC (rev 637) +++ trunk/re2c/CHANGELOG 2007-02-24 17:21:01 UTC (rev 638) @@ -1,5 +1,6 @@ Version 0.11.2 (????-??-??) --------------------------- +- Fixed -u switch code generation. - Added ability to avoid defines and overwrite variable and label names. Version 0.11.1 (2007-02-20) Modified: trunk/re2c/code.cc =================================================================== --- trunk/re2c/code.cc 2007-02-23 21:30:13 UTC (rev 637) +++ trunk/re2c/code.cc 2007-02-24 17:21:01 UTC (rev 638) @@ -904,7 +904,7 @@ readCh = false; if (wFlag) { - o << indent(ind) << "if(" << sYych <<" & 0xFF00) {\n"; + o << indent(ind) << "if(" << sYych <<" & ~0xFF) {\n"; genBase(o, ind+1, from, next, readCh, 1); o << indent(ind++) << "} else {\n"; sYych = mapCodeName["yych"]; @@ -1021,7 +1021,7 @@ readCh = false; if (wFlag) { - o << indent(ind) << "if(" << sYych << " & 0xFF00) {\n"; + o << indent(ind) << "if(" << sYych << " & ~0xFF) {\n"; sYych = mapCodeName["yych"]; genBase(o, ind+1, from, next, readCh, 1); o << indent(ind) << "} else "; Modified: trunk/re2c/test/cvsignore.wb.c =================================================================== --- trunk/re2c/test/cvsignore.wb.c 2007-02-23 21:30:13 UTC (rev 637) +++ trunk/re2c/test/cvsignore.wb.c 2007-02-24 17:21:01 UTC (rev 638) @@ -138,7 +138,7 @@ if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; yy18: - if(yych & 0xFF00) { + if(yych & ~0xFF) { goto yy17; } else if(yybm[0+yych] & 128) { goto yy17; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <he...@us...> - 2007-02-23 21:35:25
|
Revision: 637 http://svn.sourceforge.net/re2c/?rev=637&view=rev Author: helly Date: 2007-02-23 13:30:13 -0800 (Fri, 23 Feb 2007) Log Message: ----------- - Update docu Modified Paths: -------------- trunk/re2c/htdocs/manual.html trunk/re2c/re2c.1.in Modified: trunk/re2c/htdocs/manual.html =================================================================== --- trunk/re2c/htdocs/manual.html 2007-02-23 21:28:17 UTC (rev 636) +++ trunk/re2c/htdocs/manual.html 2007-02-23 21:30:13 UTC (rev 637) @@ -385,14 +385,6 @@ generation of jump tables rather than using nested if's and decision bitfields. The threshold is compared against a calculated estimation of if-s needed where every used bitmap divides the threshold by 2.</dd> -<dt><i>re2c:code:yyaccept</i> <b>=</b> yyaccept <b>;</b></dt> -<dd>Allows to overwrite the name of the variable yyaccept.</dd> -<dt><i>re2c:code:yybm</i> <b>=</b> yybm <b>;</b></dt> -<dd>Allows to overwrite the name of the variable yybm.</dd> -<dt><i>re2c:code:yych</i> <b>=</b> yych <b>;</b></dt> -<dd>Allows to overwrite the name of the variable yych.</dd> -<dt><i>re2c:code:yytarget</i> <b>=</b> yytarget <b>;</b></dt> -<dd>Allows to overwrite the name of the variable yytarget.</dd> <dt><i>re2c:define:YYCTXMARKER</i> <b>=</b> YYCTXMARKER <b>;</b></dt> <dd>Allows to overwrite the define YYCTXMARKER and thus avoiding it by setting the value to the actual code needed.</dd> @@ -424,6 +416,14 @@ <dd>Allows to overwrite the name of the label yyFillLabel.</dd> <dt><i>re2c:label:yyNext</i> <b>=</b> yyNext <b>;</b></dt> <dd>Allows to overwrite the name of the label yyNext.</dd> +<dt><i>re2c:variable:yyaccept</i> <b>=</b> yyaccept <b>;</b></dt> +<dd>Allows to overwrite the name of the variable yyaccept.</dd> +<dt><i>re2c:variable:yybm</i> <b>=</b> yybm <b>;</b></dt> +<dd>Allows to overwrite the name of the variable yybm.</dd> +<dt><i>re2c:variable:yych</i> <b>=</b> yych <b>;</b></dt> +<dd>Allows to overwrite the name of the variable yych.</dd> +<dt><i>re2c:variable:yytarget</i> <b>=</b> yytarget <b>;</b></dt> +<dd>Allows to overwrite the name of the variable yytarget.</dd> </dl> <a name="lbAK" id="lbAK"> </a> <h2>UNDERSTANDING RE2C</h2> Modified: trunk/re2c/re2c.1.in =================================================================== --- trunk/re2c/re2c.1.in 2007-02-23 21:28:17 UTC (rev 636) +++ trunk/re2c/re2c.1.in 2007-02-23 21:30:13 UTC (rev 637) @@ -457,18 +457,6 @@ The threshold is compared against a calculated estimation of if-s needed where every used bitmap divides the threshold by 2. .TP -\fIre2c:code:yyaccept\fP \fB=\fP yyaccept \fB;\fP -Allows to overwrite the name of the variable yyaccept. -.TP -\fIre2c:code:yybm\fP \fB=\fP yybm \fB;\fP -Allows to overwrite the name of the variable yybm. -.TP -\fIre2c:code:yych\fP \fB=\fP yych \fB;\fP -Allows to overwrite the name of the variable yych. -.TP -\fIre2c:code:yytarget\fP \fB=\fP yytarget \fB;\fP -Allows to overwrite the name of the variable yytarget. -.TP \fIre2c:define:YYCTXMARKER\fP \fB=\fP YYCTXMARKER \fB;\fP Allows to overwrite the define YYCTXMARKER and thus avoiding it by setting the value to the actual code needed. @@ -510,6 +498,18 @@ .TP \fIre2c:label:yyNext\fP \fB=\fP yyNext \fB;\fP Allows to overwrite the name of the label yyNext. +.TP +\fIre2c:variable:yyaccept\fP \fB=\fP yyaccept \fB;\fP +Allows to overwrite the name of the variable yyaccept. +.TP +\fIre2c:variable:yybm\fP \fB=\fP yybm \fB;\fP +Allows to overwrite the name of the variable yybm. +.TP +\fIre2c:variable:yych\fP \fB=\fP yych \fB;\fP +Allows to overwrite the name of the variable yych. +.TP +\fIre2c:variable:yytarget\fP \fB=\fP yytarget \fB;\fP +Allows to overwrite the name of the variable yytarget. .SH "UNDERSTANDING RE2C" .LP This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <he...@us...> - 2007-02-23 21:35:25
|
Revision: 636 http://svn.sourceforge.net/re2c/?rev=636&view=rev Author: helly Date: 2007-02-23 13:28:17 -0800 (Fri, 23 Feb 2007) Log Message: ----------- - Use descriptive name scheme for variable overwriting, too Modified Paths: -------------- trunk/re2c/code.cc trunk/re2c/test/config8.re Modified: trunk/re2c/code.cc =================================================================== --- trunk/re2c/code.cc 2007-02-22 01:19:58 UTC (rev 635) +++ trunk/re2c/code.cc 2007-02-23 21:28:17 UTC (rev 636) @@ -1697,7 +1697,7 @@ } } -static std::set<std::string> mapCodeKeys; +static std::set<std::string> mapVariableKeys; static std::set<std::string> mapDefineKeys; static std::set<std::string> mapLabelKeys; @@ -1705,10 +1705,10 @@ { if (mapDefineKeys.empty()) { - mapCodeKeys.insert("code:yyaccept"); - mapCodeKeys.insert("code:yybm"); - mapCodeKeys.insert("code:yych"); - mapCodeKeys.insert("code:yytarget"); + mapVariableKeys.insert("variable:yyaccept"); + mapVariableKeys.insert("variable:yybm"); + mapVariableKeys.insert("variable:yych"); + mapVariableKeys.insert("variable:yytarget"); mapDefineKeys.insert("define:YYCTXMARKER"); mapDefineKeys.insert("define:YYCTYPE"); mapDefineKeys.insert("define:YYCURSOR"); @@ -1748,10 +1748,10 @@ { labelPrefix = strVal; } - else if (mapCodeKeys.find(cfg.to_string()) != mapCodeKeys.end()) + else if (mapVariableKeys.find(cfg.to_string()) != mapVariableKeys.end()) { if (bFirstPass && !mapCodeName.insert( - std::make_pair(cfg.to_string().substr(sizeof("code:") - 1), strVal) + std::make_pair(cfg.to_string().substr(sizeof("variable:") - 1), strVal) ).second) { fatal("variable already being used and cannot be changed"); Modified: trunk/re2c/test/config8.re =================================================================== --- trunk/re2c/test/config8.re 2007-02-22 01:19:58 UTC (rev 635) +++ trunk/re2c/test/config8.re 2007-02-23 21:28:17 UTC (rev 636) @@ -48,7 +48,7 @@ re2c:define:YYCTXMARKER = s.ctx; re2c:define:YYFILL = fill; -re2c:code:yych = curr; +re2c:variable:yych = curr; re2c:labelprefix = xx; ("a"|"b")/[1] { return KEYWORD; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <he...@us...> - 2007-02-22 01:19:59
|
Revision: 635 http://svn.sourceforge.net/re2c/?rev=635&view=rev Author: helly Date: 2007-02-21 17:19:58 -0800 (Wed, 21 Feb 2007) Log Message: ----------- - Try to clearify code Modified Paths: -------------- trunk/re2c/code.cc trunk/re2c/globals.h trunk/re2c/main.cc Modified: trunk/re2c/code.cc =================================================================== --- trunk/re2c/code.cc 2007-02-22 01:14:09 UTC (rev 634) +++ trunk/re2c/code.cc 2007-02-22 01:19:58 UTC (rev 635) @@ -1750,24 +1750,27 @@ } else if (mapCodeKeys.find(cfg.to_string()) != mapCodeKeys.end()) { - if ((bSinglePass || !bLastPass) - && !mapCodeName.insert(std::make_pair(cfg.to_string().substr(sizeof("code:") - 1), strVal)).second) + if (bFirstPass && !mapCodeName.insert( + std::make_pair(cfg.to_string().substr(sizeof("code:") - 1), strVal) + ).second) { fatal("variable already being used and cannot be changed"); } } else if (mapDefineKeys.find(cfg.to_string()) != mapDefineKeys.end()) { - if ((bSinglePass || !bLastPass) - && !mapCodeName.insert(std::make_pair(cfg.to_string().substr(sizeof("define:") - 1), strVal)).second) + if (bFirstPass && !mapCodeName.insert( + std::make_pair(cfg.to_string().substr(sizeof("define:") - 1), strVal) + ).second) { fatal("define already being used and cannot be changed"); } } else if (mapLabelKeys.find(cfg.to_string()) != mapLabelKeys.end()) { - if ((bSinglePass || !bLastPass) - && !mapCodeName.insert(std::make_pair(cfg.to_string().substr(sizeof("label:") - 1), strVal)).second) + if (bFirstPass && !mapCodeName.insert( + std::make_pair(cfg.to_string().substr(sizeof("label:") - 1), strVal) + ).second) { fatal("label already being used and cannot be changed"); } Modified: trunk/re2c/globals.h =================================================================== --- trunk/re2c/globals.h 2007-02-22 01:14:09 UTC (rev 634) +++ trunk/re2c/globals.h 2007-02-22 01:19:58 UTC (rev 635) @@ -26,6 +26,7 @@ extern bool wFlag; extern bool bSinglePass; +extern bool bFirstPass; extern bool bLastPass; extern bool bUsedYYAccept; Modified: trunk/re2c/main.cc =================================================================== --- trunk/re2c/main.cc 2007-02-22 01:14:09 UTC (rev 634) +++ trunk/re2c/main.cc 2007-02-22 01:19:58 UTC (rev 635) @@ -32,6 +32,7 @@ bool wFlag = false; bool bSinglePass = false; +bool bFirstPass = true; bool bLastPass = false; bool bUsedYYAccept = false; @@ -327,6 +328,7 @@ next_fill_index = 0; bWroteGetState = false; bUsedYYMaxFill = false; + bFirstPass = false; } bLastPass = true; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <he...@us...> - 2007-02-22 01:14:11
|
Revision: 634 http://svn.sourceforge.net/re2c/?rev=634&view=rev Author: helly Date: 2007-02-21 17:14:09 -0800 (Wed, 21 Feb 2007) Log Message: ----------- - Disallow multiple changes to code names Modified Paths: -------------- trunk/re2c/code.cc Modified: trunk/re2c/code.cc =================================================================== --- trunk/re2c/code.cc 2007-02-22 01:13:35 UTC (rev 633) +++ trunk/re2c/code.cc 2007-02-22 01:14:09 UTC (rev 634) @@ -1750,15 +1750,27 @@ } else if (mapCodeKeys.find(cfg.to_string()) != mapCodeKeys.end()) { - mapCodeName[cfg.to_string().c_str() + sizeof("code:") - 1] = strVal; + if ((bSinglePass || !bLastPass) + && !mapCodeName.insert(std::make_pair(cfg.to_string().substr(sizeof("code:") - 1), strVal)).second) + { + fatal("variable already being used and cannot be changed"); + } } else if (mapDefineKeys.find(cfg.to_string()) != mapDefineKeys.end()) { - mapCodeName[cfg.to_string().c_str() + sizeof("define:") - 1] = strVal; + if ((bSinglePass || !bLastPass) + && !mapCodeName.insert(std::make_pair(cfg.to_string().substr(sizeof("define:") - 1), strVal)).second) + { + fatal("define already being used and cannot be changed"); + } } else if (mapLabelKeys.find(cfg.to_string()) != mapLabelKeys.end()) { - mapCodeName[cfg.to_string().c_str() + sizeof("label:") - 1] = strVal; + if ((bSinglePass || !bLastPass) + && !mapCodeName.insert(std::make_pair(cfg.to_string().substr(sizeof("label:") - 1), strVal)).second) + { + fatal("label already being used and cannot be changed"); + } } else { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <he...@us...> - 2007-02-22 01:13:37
|
Revision: 633 http://svn.sourceforge.net/re2c/?rev=633&view=rev Author: helly Date: 2007-02-21 17:13:35 -0800 (Wed, 21 Feb 2007) Log Message: ----------- - Rephrase Modified Paths: -------------- trunk/re2c/CHANGELOG Modified: trunk/re2c/CHANGELOG =================================================================== --- trunk/re2c/CHANGELOG 2007-02-21 21:19:57 UTC (rev 632) +++ trunk/re2c/CHANGELOG 2007-02-22 01:13:35 UTC (rev 633) @@ -1,6 +1,6 @@ Version 0.11.2 (????-??-??) --------------------------- -- Added ability to avoid defines and overwrite generated variable names. +- Added ability to avoid defines and overwrite variable and label names. Version 0.11.1 (2007-02-20) --------------------------- This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <he...@us...> - 2007-02-21 21:19:59
|
Revision: 632 http://svn.sourceforge.net/re2c/?rev=632&view=rev Author: helly Date: 2007-02-21 13:19:57 -0800 (Wed, 21 Feb 2007) Log Message: ----------- - Update documentation Modified Paths: -------------- trunk/re2c/htdocs/index.html trunk/re2c/htdocs/manual.html trunk/re2c/re2c.1.in Modified: trunk/re2c/htdocs/index.html =================================================================== --- trunk/re2c/htdocs/index.html 2007-02-21 21:19:24 UTC (rev 631) +++ trunk/re2c/htdocs/index.html 2007-02-21 21:19:57 UTC (rev 632) @@ -20,7 +20,7 @@ various places. </p> <p> -Marcus Börger (he...@us...) +Marcus Börger (he...@us...) </p> <p> <b>re2c</b> is a great tool and was unmaintained for quite some time, and in Modified: trunk/re2c/htdocs/manual.html =================================================================== --- trunk/re2c/htdocs/manual.html 2007-02-21 21:19:24 UTC (rev 631) +++ trunk/re2c/htdocs/manual.html 2007-02-21 21:19:57 UTC (rev 632) @@ -82,7 +82,7 @@ <br /> <br /> <p>You can place one /*!max:re2c */ comment that will output a "#define YYMAXFILL -<n>" line that holds the maximum number of characters +<n>" line that holds the maximum number of characters required to parse the input. That is the maximum value YYFILL(n) will receive. If -1 is in effect then YYMAXFILL can be triggered once after the last /*!re2c */.</p> @@ -380,11 +380,50 @@ or default to yy0 as start label. Instead of using a dedicated label it is often better to separate the YYGETSTATE code from the actual scanner code by placing a "/*!getstate:re2c */" comment.</dd> -<dd><i>re2c:cgoto:threshold</i> <b>=</b> 9 <b>;</b></dt> -<dt>When -g is active this value specifies the complexity threshold that triggers +<dt><i>re2c:cgoto:threshold</i> <b>=</b> 9 <b>;</b></dt> +<dd>When -g is active this value specifies the complexity threshold that triggers generation of jump tables rather than using nested if's and decision bitfields. The threshold is compared against a calculated estimation of if-s needed where every used bitmap divides the threshold by 2.</dd> +<dt><i>re2c:code:yyaccept</i> <b>=</b> yyaccept <b>;</b></dt> +<dd>Allows to overwrite the name of the variable yyaccept.</dd> +<dt><i>re2c:code:yybm</i> <b>=</b> yybm <b>;</b></dt> +<dd>Allows to overwrite the name of the variable yybm.</dd> +<dt><i>re2c:code:yych</i> <b>=</b> yych <b>;</b></dt> +<dd>Allows to overwrite the name of the variable yych.</dd> +<dt><i>re2c:code:yytarget</i> <b>=</b> yytarget <b>;</b></dt> +<dd>Allows to overwrite the name of the variable yytarget.</dd> +<dt><i>re2c:define:YYCTXMARKER</i> <b>=</b> YYCTXMARKER <b>;</b></dt> +<dd>Allows to overwrite the define YYCTXMARKER and thus avoiding it by setting the +value to the actual code needed.</dd> +<dt><i>re2c:define:YYCTYPE</i> <b>=</b> YYCTYPE <b>;</b></dt> +<dd>Allows to overwrite the define YYCTYPE and thus avoiding it by setting the +value to the actual code needed.</dd> +<dt><i>re2c:define:YYCURSOR</i> <b>=</b> YYCURSOR <b>;</b></dt> +<dd>Allows to overwrite the define YYCURSOR and thus avoiding it by setting the +value to the actual code needed.</dd> +<dt><i>re2c:define:YYDEBUG</i> <b>=</b> YYDEBUG <b>;</b></dt> +<dd>Allows to overwrite the define YYDEBUG and thus avoiding it by setting the +value to the actual code needed.</dd> +<dt><i>re2c:define:YYFILL</i> <b>=</b> YYFILL <b>;</b></dt> +<dd>Allows to overwrite the define YYFILL and thus avoiding it by setting the +value to the actual code needed.</dd> +<dt><i>re2c:define:YYGETSTATE</i> <b>=</b> YYGETSTATE <b>;</b></dt> +<dd>Allows to overwrite the define YYGETSTATE and thus avoiding it by setting the +value to the actual code needed.</dd> +<dt><i>re2c:define:YYLIMIT</i> <b>=</b> YYLIMIT <b>;</b></dt> +<dd>Allows to overwrite the define YYLIMIT and thus avoiding it by setting the +value to the actual code needed.</dd> +<dt><i>re2c:define:YYMARKER</i> <b>=</b> YYMARKER <b>;</b></dt> +<dd>Allows to overwrite the define YYMARKER and thus avoiding it by setting the +value to the actual code needed.</dd> +<dt><i>re2c:define:YYSETSTATE</i> <b>=</b> YYSETSTATE <b>;</b></dt> +<dd>Allows to overwrite the define YYSETSTATE and thus avoiding it by setting the +value to the actual code needed.</dd> +<dt><i>re2c:label:yyFillLabel</i> <b>=</b> yyFillLabel <b>;</b></dt> +<dd>Allows to overwrite the name of the label yyFillLabel.</dd> +<dt><i>re2c:label:yyNext</i> <b>=</b> yyNext <b>;</b></dt> +<dd>Allows to overwrite the name of the label yyNext.</dd> </dl> <a name="lbAK" id="lbAK"> </a> <h2>UNDERSTANDING RE2C</h2> Modified: trunk/re2c/re2c.1.in =================================================================== --- trunk/re2c/re2c.1.in 2007-02-21 21:19:24 UTC (rev 631) +++ trunk/re2c/re2c.1.in 2007-02-21 21:19:57 UTC (rev 632) @@ -123,7 +123,7 @@ For details see below at \fBSCANNER WITH STORABLE STATES\fP. .TP \fB-g\fP -Generate a scanner that utilizes GCC's computed goto feature. That is re2c +Generate a scanner that utilizes GCC's computed goto feature. That is \*(re generates jump tables whenever a decision is of a certain complexity (e.g. a lot of if conditions are otherwise necessary). This is only useable with GCC and produces output that cannot be compiled with any other compiler. Note that @@ -132,8 +132,8 @@ .TP \fB-i\fP Do not output #line information. This is usefull when you want use a CMS tool -with the re2c output which you might want if you do not require your users to -have re2c themselves when building from your source. +with the \*(re output which you might want if you do not require your users to +have \*(re themselves when building from your source. \fB-o output\fP Specify the output file. .TP @@ -159,7 +159,7 @@ .TP \fB-1\fP Force single pass generation, this cannot be combined with -f and disables -YYMAXFILL generation prior to last re2c block. +YYMAXFILL generation prior to last \*(re block. .SH "INTERFACE CODE" Unlike other scanner generators, \*(re does not generate complete scanners: the user must supply some interface code. @@ -233,11 +233,11 @@ This will be automatically defined by \fC/*!max:re2c */\fP blocks as explained above. .SH "SCANNER WITH STORABLE STATES" -When the \fB-f\fP flag is specified, re2c generates a scanner that +When the \fB-f\fP flag is specified, \*(re generates a scanner that can store its current state, return to the caller, and later resume operations exactly where it left off. -The default operation of re2c is a "pull" model, where the scanner asks +The default operation of \*(re is a "pull" model, where the scanner asks for extra input whenever it needs it. However, this mode of operation assumes that the scanner is the "owner" the parsing loop, and that may not always be convenient. @@ -252,9 +252,9 @@ its state, and return to the caller. When more input data is fed to the scanner, it resumes operations exactly where it left off. -When using the -f option re2c does not accept stdin because it has to do the +When using the -f option \*(re does not accept stdin because it has to do the full generation process twice which means it has to read the input twice. That -means re2c would fail in case it cannot open the input twice or reading the +means \*(re would fail in case it cannot open the input twice or reading the input for the first time influences the second read attempt. Changes needed compared to the "pull" model. @@ -391,8 +391,7 @@ and its two hexadecimal digits or a backslash, an upper cased \fBX\fP and its four hexadecimal digits. .LP -re2c -further more supports the c/c++ unicode notation. That is a backslash followed +\*(re further more supports the c/c++ unicode notation. That is a backslash followed by either a lowercased \fBu\fP and its four hexadecimal digits or an uppercased \fBU\fP and its eight hexadecimal digits. However only in \fB-u\fP mode the generated code can deal with any valid Unicode character up to 0x10FFFF. @@ -406,7 +405,7 @@ .SH "INPLACE CONFIGURATION" .LP -It is possible to configure code generation inside re2c blocks. The following +It is possible to configure code generation inside \*(re blocks. The following lists the available configurations: .TP \fIre2c:indent:top\fP \fB=\fP 0 \fB;\fP @@ -457,11 +456,65 @@ generation of jump tables rather than using nested if's and decision bitfields. The threshold is compared against a calculated estimation of if-s needed where every used bitmap divides the threshold by 2. +.TP +\fIre2c:code:yyaccept\fP \fB=\fP yyaccept \fB;\fP +Allows to overwrite the name of the variable yyaccept. +.TP +\fIre2c:code:yybm\fP \fB=\fP yybm \fB;\fP +Allows to overwrite the name of the variable yybm. +.TP +\fIre2c:code:yych\fP \fB=\fP yych \fB;\fP +Allows to overwrite the name of the variable yych. +.TP +\fIre2c:code:yytarget\fP \fB=\fP yytarget \fB;\fP +Allows to overwrite the name of the variable yytarget. +.TP +\fIre2c:define:YYCTXMARKER\fP \fB=\fP YYCTXMARKER \fB;\fP +Allows to overwrite the define YYCTXMARKER and thus avoiding it by setting the +value to the actual code needed. +.TP +\fIre2c:define:YYCTYPE\fP \fB=\fP YYCTYPE \fB;\fP +Allows to overwrite the define YYCTYPE and thus avoiding it by setting the +value to the actual code needed. +.TP +\fIre2c:define:YYCURSOR\fP \fB=\fP YYCURSOR \fB;\fP +Allows to overwrite the define YYCURSOR and thus avoiding it by setting the +value to the actual code needed. +.TP +\fIre2c:define:YYDEBUG\fP \fB=\fP YYDEBUG \fB;\fP +Allows to overwrite the define YYDEBUG and thus avoiding it by setting the +value to the actual code needed. +.TP +\fIre2c:define:YYFILL\fP \fB=\fP YYFILL \fB;\fP +Allows to overwrite the define YYFILL and thus avoiding it by setting the +value to the actual code needed. +.TP +\fIre2c:define:YYGETSTATE\fP \fB=\fP YYGETSTATE \fB;\fP +Allows to overwrite the define YYGETSTATE and thus avoiding it by setting the +value to the actual code needed. +.TP +\fIre2c:define:YYLIMIT\fP \fB=\fP YYLIMIT \fB;\fP +Allows to overwrite the define YYLIMIT and thus avoiding it by setting the +value to the actual code needed. +.TP +\fIre2c:define:YYMARKER\fP \fB=\fP YYMARKER \fB;\fP +Allows to overwrite the define YYMARKER and thus avoiding it by setting the +value to the actual code needed. +.TP +\fIre2c:define:YYSETSTATE\fP \fB=\fP YYSETSTATE \fB;\fP +Allows to overwrite the define YYSETSTATE and thus avoiding it by setting the +value to the actual code needed. +.TP +\fIre2c:label:yyFillLabel\fP \fB=\fP yyFillLabel \fB;\fP +Allows to overwrite the name of the label yyFillLabel. +.TP +\fIre2c:label:yyNext\fP \fB=\fP yyNext \fB;\fP +Allows to overwrite the name of the label yyNext. .SH "UNDERSTANDING RE2C" .LP -The subdirectory lessons of the re2c distribution contains a few step by step -lessons to get you started with re2c. All examples in the lessons subdirectory +The subdirectory lessons of the \*(re distribution contains a few step by step +lessons to get you started with \*(re. All examples in the lessons subdirectory can be compiled and actually work. .SH FEATURES @@ -496,7 +549,7 @@ .LP flex(1), lex(1). .P -More information on \fBre2c\fP can be found here: +More information on \*(re can be found here: .PD 0 .P .B http://sourceforge.net/projects/re2c/ @@ -520,6 +573,6 @@ .PD 1 .SH VERSION INFORMATION -This manpage describes \fBre2c\fP, version @PACKAGE_VERSION@. +This manpage describes \*(re, version @PACKAGE_VERSION@. .fi This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <he...@us...> - 2007-02-21 21:19:25
|
Revision: 631 http://svn.sourceforge.net/re2c/?rev=631&view=rev Author: helly Date: 2007-02-21 13:19:24 -0800 (Wed, 21 Feb 2007) Log Message: ----------- - Split labels from code Modified Paths: -------------- trunk/re2c/code.cc Modified: trunk/re2c/code.cc =================================================================== --- trunk/re2c/code.cc 2007-02-20 22:40:39 UTC (rev 630) +++ trunk/re2c/code.cc 2007-02-21 21:19:24 UTC (rev 631) @@ -1697,13 +1697,18 @@ } } +static std::set<std::string> mapCodeKeys; static std::set<std::string> mapDefineKeys; -static std::set<std::string> mapCodeKeys; +static std::set<std::string> mapLabelKeys; void Scanner::config(const Str& cfg, const Str& val) { if (mapDefineKeys.empty()) { + mapCodeKeys.insert("code:yyaccept"); + mapCodeKeys.insert("code:yybm"); + mapCodeKeys.insert("code:yych"); + mapCodeKeys.insert("code:yytarget"); mapDefineKeys.insert("define:YYCTXMARKER"); mapDefineKeys.insert("define:YYCTYPE"); mapDefineKeys.insert("define:YYCURSOR"); @@ -1713,12 +1718,8 @@ mapDefineKeys.insert("define:YYLIMIT"); mapDefineKeys.insert("define:YYMARKER"); mapDefineKeys.insert("define:YYSETSTATE"); - mapCodeKeys.insert("code:yyFillLabel"); - mapCodeKeys.insert("code:yyNext"); - mapCodeKeys.insert("code:yyaccept"); - mapCodeKeys.insert("code:yybm"); - mapCodeKeys.insert("code:yych"); - mapCodeKeys.insert("code:yytarget"); + mapLabelKeys.insert("label:yyFillLabel"); + mapLabelKeys.insert("label:yyNext"); } std::string strVal; @@ -1747,13 +1748,17 @@ { labelPrefix = strVal; } + else if (mapCodeKeys.find(cfg.to_string()) != mapCodeKeys.end()) + { + mapCodeName[cfg.to_string().c_str() + sizeof("code:") - 1] = strVal; + } else if (mapDefineKeys.find(cfg.to_string()) != mapDefineKeys.end()) { mapCodeName[cfg.to_string().c_str() + sizeof("define:") - 1] = strVal; } - else if (mapCodeKeys.find(cfg.to_string()) != mapCodeKeys.end()) + else if (mapLabelKeys.find(cfg.to_string()) != mapLabelKeys.end()) { - mapCodeName[cfg.to_string().c_str() + sizeof("code:") - 1] = strVal; + mapCodeName[cfg.to_string().c_str() + sizeof("label:") - 1] = strVal; } else { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <he...@us...> - 2007-02-20 22:40:44
|
Revision: 630 http://svn.sourceforge.net/re2c/?rev=630&view=rev Author: helly Date: 2007-02-20 14:40:39 -0800 (Tue, 20 Feb 2007) Log Message: ----------- - Update docu Modified Paths: -------------- trunk/re2c/htdocs/manual.html trunk/re2c/re2c.1.in Modified: trunk/re2c/htdocs/manual.html =================================================================== --- trunk/re2c/htdocs/manual.html 2007-02-20 22:16:13 UTC (rev 629) +++ trunk/re2c/htdocs/manual.html 2007-02-20 22:40:39 UTC (rev 630) @@ -367,6 +367,9 @@ a text value then a label with that text will be generated regardless of whether the normal start label is being used or not. This setting is being reset to <b>0</b> after a start label has been generated.</dd> +<dt><i>re2c:labelprefix</i> <b>=</b> yy <b>;</b></dt> +<dd>Allows to change the prefix of numbered labels. The default is \fByy\fP and +can be set any string that is a valid label.</dd> <dt><i>re2c:state:abort</i> <b>=</b> 0 <b>;</b></dt> <dd>When not zero and switch -f is active then the YYGETSTATE block will contain a default case that aborts and a -1 case is used for initialization.</dd> @@ -376,10 +379,9 @@ usually also use configuration <i>startlabel</i> to force a specific start label or default to yy0 as start label. Instead of using a dedicated label it is often better to separate the YYGETSTATE code from the actual scanner code by -placing a "/*!getstate:re2c */" comment. -</dd> +placing a "/*!getstate:re2c */" comment.</dd> <dd><i>re2c:cgoto:threshold</i> <b>=</b> 9 <b>;</b></dt> -<dd>When -g is active this value specifies the complexity threshold that triggers +<dt>When -g is active this value specifies the complexity threshold that triggers generation of jump tables rather than using nested if's and decision bitfields. The threshold is compared against a calculated estimation of if-s needed where every used bitmap divides the threshold by 2.</dd> Modified: trunk/re2c/re2c.1.in =================================================================== --- trunk/re2c/re2c.1.in 2007-02-20 22:16:13 UTC (rev 629) +++ trunk/re2c/re2c.1.in 2007-02-20 22:40:39 UTC (rev 630) @@ -436,6 +436,10 @@ normal start label is being used or not. This setting is being reset to \fB0\fP after a start label has been generated. .TP +\fIre2c:labelprefix\fP \fB=\fP yy \fB;\fP +Allows to change the prefix of numbered labels. The default is \fByy\fP and +can be set any string that is a valid label. +.TP \fIre2c:state:abort\fP \fB=\fP 0 \fB;\fP When not zero and switch -f is active then the \fCYYGETSTATE\fP block will contain a default case that aborts and a -1 case is used for initialization. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |