classpath-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[cp-patches] Re: gnu/regexp/RETokenLookAhead.java


From: Mark Wielaard
Subject: [cp-patches] Re: gnu/regexp/RETokenLookAhead.java
Date: Sat, 25 Sep 2004 19:44:16 +0200

Hi Shashank,

On Tue, 2004-09-21 at 22:29, Shashank Bapat wrote:
> FYI, I have recently assigned the rights of RETokenLookAhead to FSF.
> I suppose this means you can include it again if you want.

Thanks a lot!

The following patch adds the lookahead support to GNU Classpath and
libgcj:

2004-09-25  Shashank Bapat  <address@hidden>
            Mark Wielaard  <address@hidden>

       * gnu/regexp/RE.java (initialize): Add RETokenLookAhead support.
       * gnu/regexp/RETokenLookAhead.java: New file.

       * Makefile.am (ordinary_java_source_files): Add RETokenLookAhead.java.
       * Makefile.in: Regenerated.

(Last part only for libgcj)

With this all the current mauve regex tests now pass!
(Which indicates that our mauve regex tests are not very complete...)

Note that this is still regex support as gnu.regexp had it originally.
That means that it follows the GNU syntax and not always the syntax
specified by java.util.regex. Volunteers to change that welcome
(including reformatting the files to make the conform to our coding
style).

Cheers,

Mark
Index: Makefile.am
===================================================================
RCS file: /cvs/gcc/gcc/libjava/Makefile.am,v
retrieving revision 1.414
diff -u -r1.414 Makefile.am
--- Makefile.am 24 Sep 2004 06:41:55 -0000      1.414
+++ Makefile.am 25 Sep 2004 17:41:22 -0000
@@ -2692,6 +2692,7 @@
 gnu/regexp/RETokenChar.java \
 gnu/regexp/RETokenEnd.java \
 gnu/regexp/RETokenEndSub.java \
+gnu/regexp/RETokenLookAhead.java \
 gnu/regexp/RETokenOneOf.java \
 gnu/regexp/RETokenPOSIX.java \
 gnu/regexp/RETokenRange.java \
Index: gnu/regexp/RE.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gnu/regexp/RE.java,v
retrieving revision 1.1
diff -u -r1.1 RE.java
--- gnu/regexp/RE.java  9 Mar 2004 19:14:23 -0000       1.1
+++ gnu/regexp/RE.java  25 Sep 2004 17:41:24 -0000
@@ -492,8 +492,25 @@
       else if ((unit.ch == '(') && (syntax.get(RESyntax.RE_NO_BK_PARENS) ^ 
unit.bk)) {
        boolean pure = false;
        boolean comment = false;
+        boolean lookAhead = false;
+        boolean negativelh = false;
        if ((index+1 < pLength) && (pattern[index] == '?')) {
          switch (pattern[index+1]) {
+          case '!':
+            if (syntax.get(RESyntax.RE_LOOKAHEAD)) {
+              pure = true;
+              negativelh = true;
+              lookAhead = true;
+              index += 2;
+            }
+            break;
+          case '=':
+            if (syntax.get(RESyntax.RE_LOOKAHEAD)) {
+              pure = true;
+              lookAhead = true;
+              index += 2;
+            }
+            break;
          case ':':
            if (syntax.get(RESyntax.RE_PURE_GROUPING)) {
              pure = true;
@@ -539,10 +556,14 @@
            numSubs++;
          }
 
-         int useIndex = (pure) ? 0 : nextSub + numSubs;
+         int useIndex = (pure || lookAhead) ? 0 : nextSub + numSubs;
          currentToken = new 
RE(String.valueOf(pattern,index,endIndex-index).toCharArray(),cflags,syntax,useIndex,nextSub
 + numSubs);
          numSubs += ((RE) currentToken).getNumSubs();
 
+          if (lookAhead) {
+             currentToken = new RETokenLookAhead(currentToken,negativelh);
+         }
+
          index = nextIndex;
        } // not a comment
       } // subexpression
Index: gnu/regexp/RETokenLookAhead.java
===================================================================
RCS file: gnu/regexp/RETokenLookAhead.java
diff -N gnu/regexp/RETokenLookAhead.java
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ gnu/regexp/RETokenLookAhead.java    25 Sep 2004 17:41:24 -0000
@@ -0,0 +1,87 @@
+/* gnu/regexp/RETokenLookAhead.java
+   Copyright (C) 1998-2001, 2004 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING.  If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library.  Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module.  An independent module is a module which is not derived from
+or based on this library.  If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so.  If you do not wish to do so, delete this
+exception statement from your version. */
+
+package gnu.regexp;
+
+/**
+ * @since gnu.regexp 1.1.3
+ * @author Shashank Bapat
+ */
+final class RETokenLookAhead extends REToken
+{
+  REToken re;
+  boolean negative;
+
+  RETokenLookAhead(REToken re, boolean negative) throws REException {
+    super(0);
+    this.re = re;
+    this.negative = negative;
+  }
+
+  boolean match(CharIndexed input, REMatch mymatch)
+  {
+    REMatch trymatch = (REMatch)mymatch.clone();
+    REMatch trymatch1 = (REMatch)mymatch.clone();
+    REMatch newMatch = null;
+    if (re.match(input, trymatch)) {
+      if (negative) return false;
+      if (next(input, trymatch1))
+        newMatch = trymatch1;
+    }
+
+    if (newMatch != null) {
+      if (negative) return false;
+      //else
+      mymatch.assignFrom(newMatch);
+      return true;
+    }
+    else { // no match
+      if (negative)
+        return next(input, mymatch);
+      //else
+      return false;
+    }
+  }
+
+    void dump(StringBuffer os) {
+       os.append("(?");
+       os.append(negative ? '!' : '=');
+       re.dumpAll(os);
+       os.append(')');
+    }
+}
+

Attachment: signature.asc
Description: This is a digitally signed message part


reply via email to

[Prev in Thread] Current Thread [Next in Thread]