From 9863e4026315429cf0f2bbe4e8e389b8aaa2c9b3 Mon Sep 17 00:00:00 2001 From: John Millaway Date: Mon, 27 Mar 2006 22:04:15 +0000 Subject: [PATCH] Implemented dot-all syntax. Added test for dot-all syntax in test suite. --- parse.y | 31 ++++++++++++++++++++++--------- tests/test-ccl/scanner.l | 5 +++++ tests/test-ccl/test.input | 4 ++++ 3 files changed, 31 insertions(+), 9 deletions(-) diff --git a/parse.y b/parse.y index cecda23..e66deb8 100644 --- a/parse.y +++ b/parse.y @@ -105,13 +105,14 @@ char *alloca (); /* Bletch, ^^^^ that was ugly! */ -int pat, scnum, eps, headcnt, trailcnt, anyccl, lastchar, i, rulelen; +int pat, scnum, eps, headcnt, trailcnt, lastchar, i, rulelen; int trlcontxt, xcluflg, currccl, cclsorted, varlength, variable_trail_rule; int *scon_stk; int scon_stk_ptr; static int madeany = false; /* whether we've made the '.' character class */ +static int ccldot, cclany; int previous_continued_action; /* whether the previous rule's action was '|' */ #define format_warn3(fmt, a1, a2) \ @@ -728,21 +729,33 @@ singleton : singleton '*' if ( ! madeany ) { /* Create the '.' character class. */ - anyccl = cclinit(); - ccladd( anyccl, '\n' ); - cclnegate( anyccl ); + ccldot = cclinit(); + ccladd( ccldot, '\n' ); + cclnegate( ccldot ); - if ( useecs ) - mkeccl( ccltbl + cclmap[anyccl], - ccllen[anyccl], nextecm, - ecgroup, csize, csize ); + if ( useecs ) + mkeccl( ccltbl + cclmap[ccldot], + ccllen[ccldot], nextecm, + ecgroup, csize, csize ); + + /* Create the (?s:'.') character class. */ + cclany = cclinit(); + cclnegate( cclany ); + + if ( useecs ) + mkeccl( ccltbl + cclmap[cclany], + ccllen[cclany], nextecm, + ecgroup, csize, csize ); madeany = true; } ++rulelen; - $$ = mkstate( -anyccl ); + if (sf_dot_all()) + $$ = mkstate( -cclany ); + else + $$ = mkstate( -ccldot ); } | fullccl diff --git a/tests/test-ccl/scanner.l b/tests/test-ccl/scanner.l index 1cc7917..204ac39 100644 --- a/tests/test-ccl/scanner.l +++ b/tests/test-ccl/scanner.l @@ -29,6 +29,7 @@ /*#include "parser.h" */ #define err_abort() do{printf("ERROR: flex line %d. input line %d.\n", __LINE__, yylineno); abort();} while(0) +#define a_ok() do{printf("OK: flex line %d. input line %d.\n", __LINE__, yylineno); return 1;}while(0) %} %option 8bit outfile="scanner.c" prefix="test" @@ -62,6 +63,10 @@ ^"check-a:"(?i:(?-i:A))@\n err_abort(); ^"check-a:"(?i:(?-i:(?i:A)))@\n printf("OK: %s", yytext); ++yylineno; return 1; + /* We don't want this one to match. */ +^"dot-all-1:"(?-s:XXX.*)@dot-all-1@\n err_abort(); +^"dot-all-1:"(?s:XXX.*)@dot-all-1@\n a_ok(); + .|\n { err_abort(); } %% diff --git a/tests/test-ccl/test.input b/tests/test-ccl/test.input index af3b840..e8b82a8 100644 --- a/tests/test-ccl/test.input +++ b/tests/test-ccl/test.input @@ -17,3 +17,7 @@ ia:AaAa@ia@ iabc:ABCabcAbCaBc@iabc@ ia-c:ABCabcAbCaBc@ia-c@ check-a:a@ +dot-all-1:XXX junk + junk + junk + @dot-all-1@ -- 2.40.0