You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oro-dev@jakarta.apache.org by df...@apache.org on 2001/03/29 18:33:19 UTC
cvs commit: jakarta-oro/src/java/org/apache/oro/text/regex OpCode.java Perl5Compiler.java Perl5Debug.java Perl5Matcher.java
dfs 01/03/29 08:33:19
Modified: src/java/org/apache/oro/text/regex OpCode.java
Perl5Compiler.java Perl5Debug.java
Perl5Matcher.java
Log:
Applied Takashi's fix for his posix character class patch.
Revision Changes Path
1.5 +22 -11 jakarta-oro/src/java/org/apache/oro/text/regex/OpCode.java
Index: OpCode.java
===================================================================
RCS file: /home/cvs/jakarta-oro/src/java/org/apache/oro/text/regex/OpCode.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- OpCode.java 2001/01/29 00:19:00 1.4
+++ OpCode.java 2001/03/29 16:33:17 1.5
@@ -63,7 +63,7 @@
* op-codes used in a compiled regular expression.
@author <a href="mailto:dfs@savarese.org">Daniel F. Savarese</a>
- @version $Id: OpCode.java,v 1.4 2001/01/29 00:19:00 dfs Exp $
+ @version $Id: OpCode.java,v 1.5 2001/03/29 16:33:17 dfs Exp $
*/
final class OpCode {
@@ -91,8 +91,8 @@
_NOTHING = 15, // no Match empty string.
_STAR = 16, // yes Match this (simple) thing 0 or more times.
_PLUS = 17, // yes Match this (simple) thing 1 or more times.
- _ALNUM = 18, // no Match any alphanumeric character
- _NALNUM = 19, // no Match any non-alphanumeric character
+ _WORD = 18, // no Match any word character
+ _NWORD = 19, // no Match any non-word character
_BOUND = 20, // no Match "" at any word boundary
_NBOUND = 21, // no Match "" at any word non-boundary
_SPACE = 22, // no Match any whitespace character
@@ -123,20 +123,29 @@
_UPPER = 45,
_XDIGIT = 46,
_OPCODE = 47,
- _ONECHAR = 48;
+ _NOPCODE = 48,
+ _ONECHAR = 49,
+ _ALNUM = 50,
+ _ASCII = 51;
// Lengths of the various operands.
static final int _operandLength[] = {
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // OpCode 0-9
+ 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, // OpCode 10-19
+ 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, // OpCode 20-29
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // OpCode 30-39
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // OpCode 40-49
+ 0, 0 // OpCode 50-51
};
static final char _opType[] = {
_END, _BOL, _BOL, _BOL, _EOL, _EOL, _EOL, _ANY, _ANY, _ANYOF, _CURLY,
- _CURLY, _BRANCH, _BACK, _EXACTLY, _NOTHING, _STAR, _PLUS, _ALNUM,
- _NALNUM, _BOUND, _NBOUND, _SPACE, _NSPACE, _DIGIT, _NDIGIT, _REF,
+ _CURLY, _BRANCH, _BACK, _EXACTLY, _NOTHING, _STAR, _PLUS, _WORD,
+ _NWORD, _BOUND, _NBOUND, _SPACE, _NSPACE, _DIGIT, _NDIGIT, _REF,
_OPEN, _CLOSE, _MINMOD, _BOL, _BRANCH, _BRANCH, _END, _WHILEM,
- _ANYOFUN, _NANYOFUN
+ _ANYOFUN, _NANYOFUN, _RANGE, _ALPHA, _BLANK, _CNTRL, _GRAPH,
+ _LOWER, _PRINT, _PUNCT, _UPPER, _XDIGIT, _OPCODE, _NOPCODE,
+ _ONECHAR, _ALNUM, _ASCII
};
static final char _opLengthVaries[] = {
@@ -144,8 +153,10 @@
};
static final char _opLengthOne[] = {
- _ANY, _SANY, _ANYOF, _ALNUM, _NALNUM, _SPACE, _NSPACE, _DIGIT, _NDIGIT,
- _ANYOFUN, _NANYOFUN
+ _ANY, _SANY, _ANYOF, _WORD, _NWORD, _SPACE, _NSPACE, _DIGIT, _NDIGIT,
+ _ANYOFUN, _NANYOFUN, _ALPHA, _BLANK, _CNTRL, _GRAPH, _LOWER, _PRINT,
+ _PUNCT, _UPPER, _XDIGIT, _OPCODE, _NOPCODE, _ONECHAR, _ALNUM,
+ _ASCII
};
static final int _NULL_OFFSET = -1;
1.8 +99 -84 jakarta-oro/src/java/org/apache/oro/text/regex/Perl5Compiler.java
Index: Perl5Compiler.java
===================================================================
RCS file: /home/cvs/jakarta-oro/src/java/org/apache/oro/text/regex/Perl5Compiler.java,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- Perl5Compiler.java 2001/01/29 00:22:05 1.7
+++ Perl5Compiler.java 2001/03/29 16:33:17 1.8
@@ -67,7 +67,7 @@
* information about Perl5 regular expressions.
@author <a href="mailto:dfs@savarese.org">Daniel F. Savarese</a>
- @version $Id: Perl5Compiler.java,v 1.7 2001/01/29 00:22:05 dfs Exp $
+ @version $Id: Perl5Compiler.java,v 1.8 2001/03/29 16:33:17 dfs Exp $
* @see PatternCompiler
* @see MalformedPatternException
@@ -110,18 +110,20 @@
static {
__hashPOSIX = new HashMap();
- __hashPOSIX.put("alnum", new Character('w'));
+ __hashPOSIX.put("alnum", new Character(OpCode._ALNUM));
+ __hashPOSIX.put("word", new Character(OpCode._WORD));
__hashPOSIX.put("alpha", new Character(OpCode._ALPHA));
__hashPOSIX.put("blank", new Character(OpCode._BLANK));
__hashPOSIX.put("cntrl", new Character(OpCode._CNTRL));
- __hashPOSIX.put("digit", new Character('d'));
+ __hashPOSIX.put("digit", new Character(OpCode._DIGIT));
__hashPOSIX.put("graph", new Character(OpCode._GRAPH));
__hashPOSIX.put("lower", new Character(OpCode._LOWER));
__hashPOSIX.put("print", new Character(OpCode._PRINT));
__hashPOSIX.put("punct", new Character(OpCode._PUNCT));
- __hashPOSIX.put("space", new Character('s'));
+ __hashPOSIX.put("space", new Character(OpCode._SPACE));
__hashPOSIX.put("upper", new Character(OpCode._UPPER));
__hashPOSIX.put("xdigit", new Character(OpCode._XDIGIT));
+ __hashPOSIX.put("ascii", new Character(OpCode._ASCII));
}
@@ -642,12 +644,12 @@
__getNextChar();
break;
case 'w':
- offset = __emitNode(OpCode._ALNUM);
+ offset = __emitNode(OpCode._WORD);
retFlags[0] |= (__NONNULL | __SIMPLE);
__getNextChar();
break;
case 'W':
- offset = __emitNode(OpCode._NALNUM);
+ offset = __emitNode(OpCode._NWORD);
retFlags[0] |= (__NONNULL | __SIMPLE);
__getNextChar();
break;
@@ -732,7 +734,8 @@
if(__input._isAtEnd())
throw new
MalformedPatternException("Trailing \\ in expression.");
- // fall through to default
+
+ // fall through to default
default:
doDefault = true;
break tryAgain;
@@ -864,7 +867,6 @@
break forLoop;
}
break;
-
case CharStringPointer._END_OF_STRING:
case '\0':
if(pOffset >= maxOffset)
@@ -876,7 +878,6 @@
break;
} // end backslash switch
break;
-
case '#':
if((__modifierFlags[0] & __EXTENDED) != 0) {
while(pOffset < maxOffset && __input._getValue(pOffset) != '\n')
@@ -1106,7 +1107,9 @@
private int __parseUnicodeClass() throws MalformedPatternException {
boolean range = false, skipTest;
char clss, lastclss = Character.MAX_VALUE;
+
int offset, numLength[] = { 0 };
+ boolean negFlag[] = new boolean[1];
boolean opcodeFlag; /* clss isn't character when this flag true. */
if(__input._getValue() == '^') {
@@ -1136,83 +1139,85 @@
clss = __input._postIncrement();
} else {
/* try POSIX expression */
- char posixOpCode = __parsePOSIX();
+ char posixOpCode = __parsePOSIX(negFlag);
if(posixOpCode != 0){
opcodeFlag = true;
clss = posixOpCode;
}
}
-
- switch(clss){
- case 'w':
- opcodeFlag = true;
- clss = OpCode._ALNUM;
- lastclss = Character.MAX_VALUE;
- break;
- case 'W':
- opcodeFlag = true;
- clss = OpCode._NALNUM;
- lastclss = Character.MAX_VALUE;
- break;
- case 's':
- opcodeFlag = true;
- clss = OpCode._SPACE;
- lastclss = Character.MAX_VALUE;
- break;
- case 'S':
- opcodeFlag = true;
- clss = OpCode._NSPACE;
- lastclss = Character.MAX_VALUE;
- break;
- case 'd':
- opcodeFlag = true;
- clss = OpCode._DIGIT;
- lastclss = Character.MAX_VALUE;
- break;
- case 'D':
- opcodeFlag = true;
- clss = OpCode._NDIGIT;
- lastclss = Character.MAX_VALUE;
- break;
- case 'n':
- clss = '\n';
- break;
- case 'r':
- clss = '\r';
- break;
- case 't':
- clss = '\t';
- break;
- case 'f':
- clss = '\f';
- break;
- case 'b':
- clss = '\b';
- break;
- case 'e':
- clss = '\033';
- break;
- case 'a':
- clss = '\007';
- break;
- case 'x':
- clss = (char)__parseHex(__input._array, __input._getOffset(), 2,
- numLength);
- __input._increment(numLength[0]);
- break;
- case 'c':
- clss = __input._postIncrement();
- if(Character.isLowerCase(clss))
- clss = Character.toUpperCase(clss);
- clss ^= 64;
- break;
- case '0': case '1': case '2': case '3': case '4':
- case '5': case '6': case '7': case '8': case '9':
- clss = (char)__parseOctal(__input._array, __input._getOffset() - 1,
- 3, numLength);
- __input._increment(numLength[0] - 1);
- break;
- default:
+ if (opcodeFlag != true) {
+ switch(clss){
+ case 'w':
+ opcodeFlag = true;
+ clss = OpCode._WORD;
+ lastclss = Character.MAX_VALUE;
+ break;
+ case 'W':
+ opcodeFlag = true;
+ clss = OpCode._NWORD;
+ lastclss = Character.MAX_VALUE;
+ break;
+ case 's':
+ opcodeFlag = true;
+ clss = OpCode._SPACE;
+ lastclss = Character.MAX_VALUE;
+ break;
+ case 'S':
+ opcodeFlag = true;
+ clss = OpCode._NSPACE;
+ lastclss = Character.MAX_VALUE;
+ break;
+ case 'd':
+ opcodeFlag = true;
+ clss = OpCode._DIGIT;
+ lastclss = Character.MAX_VALUE;
+ break;
+ case 'D':
+ opcodeFlag = true;
+ clss = OpCode._NDIGIT;
+ lastclss = Character.MAX_VALUE;
+ break;
+ case 'n':
+ clss = '\n';
+ break;
+ case 'r':
+ clss = '\r';
+ break;
+ case 't':
+ clss = '\t';
+ break;
+ case 'f':
+ clss = '\f';
+ break;
+ case 'b':
+ clss = '\b';
+ break;
+ case 'e':
+ clss = '\033';
+ break;
+ case 'a':
+ clss = '\007';
+ break;
+ case 'x':
+ clss = (char)__parseHex(__input._array, __input._getOffset(), 2,
+ numLength);
+ __input._increment(numLength[0]);
+ break;
+ case 'c':
+ clss = __input._postIncrement();
+ if(Character.isLowerCase(clss))
+ clss = Character.toUpperCase(clss);
+ clss ^= 64;
+ break;
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+ clss = (char)__parseOctal(__input._array, __input._getOffset() - 1,
+ 3, numLength);
+ __input._increment(numLength[0] - 1);
+ break;
+ default:
+ break;
+ }
}
}
@@ -1235,7 +1240,10 @@
if(lastclss == clss) {
if(opcodeFlag == true) {
- __emitCode(OpCode._OPCODE);
+ if(negFlag[0] == false)
+ __emitCode(OpCode._OPCODE);
+ else
+ __emitCode(OpCode._NOPCODE);
} else {
__emitCode(OpCode._ONECHAR);
}
@@ -1281,7 +1289,7 @@
*
* @return OpCode. return 0 when fail parsing POSIX expression.
*/
- private char __parsePOSIX() throws MalformedPatternException {
+ private char __parsePOSIX(boolean negFlag[]) throws MalformedPatternException {
int offset = __input._getOffset();
int len = __input._getLength();
int pos = offset;
@@ -1290,6 +1298,12 @@
Object opcode;
if( value != ':' ) return 0;
+ if( __input._getValue(pos) == '^' ) {
+ negFlag[0] = true;
+ pos++;
+ } else {
+ negFlag[0] = false;
+ }
buf = new StringBuffer();
@@ -1311,7 +1325,8 @@
return 0;
__input._setOffset(pos);
-
+// System.out.println("posix="+buf.toString()+":"+((Character)opcode).charValue());
+
return ((Character)opcode).charValue();
}
1.4 +14 -3 jakarta-oro/src/java/org/apache/oro/text/regex/Perl5Debug.java
Index: Perl5Debug.java
===================================================================
RCS file: /home/cvs/jakarta-oro/src/java/org/apache/oro/text/regex/Perl5Debug.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- Perl5Debug.java 2001/01/29 00:19:01 1.3
+++ Perl5Debug.java 2001/03/29 16:33:17 1.4
@@ -68,7 +68,7 @@
* comparison with the program generated by Perl5 with the -r option.
@author <a href="mailto:dfs@savarese.org">Daniel F. Savarese</a>
- @version $Id: Perl5Debug.java,v 1.3 2001/01/29 00:19:01 dfs Exp $
+ @version $Id: Perl5Debug.java,v 1.4 2001/03/29 16:33:17 dfs Exp $
* @see Perl5Pattern
*/
@@ -199,14 +199,25 @@
case OpCode._NOTHING: str = "NOTHING"; break;
case OpCode._BACK : str = "BACK"; break;
case OpCode._END : str = "END"; break;
- case OpCode._ALNUM : str = "ALNUM"; break;
- case OpCode._NALNUM: str = "NALNUM"; break;
+ case OpCode._WORD : str = "WORD"; break;
+ case OpCode._NWORD: str = "NWORD"; break;
case OpCode._BOUND : str = "BOUND"; break;
case OpCode._NBOUND: str = "NBOUND"; break;
case OpCode._SPACE : str = "SPACE"; break;
case OpCode._NSPACE: str = "NSPACE"; break;
case OpCode._DIGIT : str = "DIGIT"; break;
case OpCode._NDIGIT: str = "NDIGIT"; break;
+ case OpCode._ALPHA : str = "ALPHA"; break;
+ case OpCode._BLANK : str = "BLANK"; break;
+ case OpCode._CNTRL : str = "CNTRL"; break;
+ case OpCode._GRAPH : str = "GRAPH"; break;
+ case OpCode._LOWER : str = "LOWER"; break;
+ case OpCode._PRINT : str = "PRINT"; break;
+ case OpCode._PUNCT : str = "PUNCT"; break;
+ case OpCode._UPPER : str = "UPPER"; break;
+ case OpCode._XDIGIT: str = "XDIGIT"; break;
+ case OpCode._ALNUM : str = "ALNUM"; break;
+ case OpCode._ASCII : str = "ASCII"; break;
case OpCode._CURLY :
buffer.append("CURLY {");
buffer.append((int)OpCode._getArg1(program, offset));
1.10 +22 -14 jakarta-oro/src/java/org/apache/oro/text/regex/Perl5Matcher.java
Index: Perl5Matcher.java
===================================================================
RCS file: /home/cvs/jakarta-oro/src/java/org/apache/oro/text/regex/Perl5Matcher.java,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- Perl5Matcher.java 2001/01/29 00:22:05 1.9
+++ Perl5Matcher.java 2001/03/29 16:33:18 1.10
@@ -66,7 +66,7 @@
* Perl5Compiler.
@author <a href="mailto:dfs@savarese.org">Daniel F. Savarese</a>
- @version $Id: Perl5Matcher.java,v 1.9 2001/01/29 00:22:05 dfs Exp $
+ @version $Id: Perl5Matcher.java,v 1.10 2001/03/29 16:33:18 dfs Exp $
* @see PatternMatcher
* @see Perl5Compiler
@@ -512,7 +512,7 @@
}
break;
- case OpCode._ALNUM:
+ case OpCode._WORD:
while(__currentOffset < endOffset) {
ch = __input[__currentOffset];
if(OpCode._isWordCharacter(ch)) {
@@ -527,7 +527,7 @@
}
break;
- case OpCode._NALNUM:
+ case OpCode._NWORD:
while(__currentOffset < endOffset) {
ch = __input[__currentOffset];
if(!OpCode._isWordCharacter(ch)) {
@@ -637,14 +637,24 @@
} else {
offset+=2;
}
+
+ } else if(__program[offset] == OpCode._ONECHAR) {
+ offset++;
+ if(__program[offset++] == code) return isANYOF;
- } else if( __program[offset] == OpCode._OPCODE ){
+ } else {
+ isANYOF = (__program[offset] == OpCode._OPCODE)
+ ? isANYOF : !isANYOF;
+
offset++;
switch ( __program[offset++] ) {
case OpCode._ALNUM:
+ if(Character.isLetterOrDigit(code)) return isANYOF;
+ break;
+ case OpCode._WORD:
if(OpCode._isWordCharacter(code)) return isANYOF;
break;
- case OpCode._NALNUM:
+ case OpCode._NWORD:
if(!OpCode._isWordCharacter(code)) return isANYOF;
break;
case OpCode._SPACE:
@@ -697,12 +707,10 @@
(code >= 'a' && code <= 'f') ||
(code >= 'A' && code <= 'F')) return isANYOF;
break;
- }
- } else if((__program[offset++] == OpCode._ONECHAR) &&
- (__program[offset++] == code))
- {
- return isANYOF;
+ case OpCode._ASCII:
+ if(code < 0x80)return isANYOF;
}
+ }
}
return !isANYOF;
}
@@ -785,12 +793,12 @@
}
break;
- case OpCode._ALNUM:
+ case OpCode._WORD:
while(scan < eol && OpCode._isWordCharacter(__input[scan]))
++scan;
break;
- case OpCode._NALNUM:
+ case OpCode._NWORD:
while(scan < eol && !OpCode._isWordCharacter(__input[scan]))
++scan;
break;
@@ -953,7 +961,7 @@
nextChar = (inputRemains ? __input[input] : __EOS);
break;
- case OpCode._ALNUM:
+ case OpCode._WORD:
if(!inputRemains)
return false;
if(!OpCode._isWordCharacter(nextChar))
@@ -962,7 +970,7 @@
nextChar = (inputRemains ? __input[input] : __EOS);
break;
- case OpCode._NALNUM:
+ case OpCode._NWORD:
if(!inputRemains && input >= __eol)
return false;
if(OpCode._isWordCharacter(nextChar))
Re: cvs commit: jakarta-oro/src/java/org/apache/oro/text/regex OpCode.java Perl5Compiler.java Perl5Debug.java Perl5Matcher.java
Posted by Michael Borodiansky <mb...@home.com>.
Dear Mr. Stevens,
I am trying to use oromatcher software and came across a following problem:
For the software I am trying to develop, I need to compare to regular
expressions (Perl5 ones) in the following way:
Let R1 be the regular expression 1
Let R2 be the regular expression 2
R1 < R2 iff all inputs that R1 can match R2 can, but not vice versa.
Could you please advise me on possible solutions to this problem, as I'm
sure this problem is not new.
Many thanks in advance,
Michael Borodiansky
Re: cvs commit: jakarta-oro/src/java/org/apache/oro/text/regex
OpCode.java Perl5Compiler.java Perl5Debug.java Perl5Matcher.java
Posted by Jon Stevens <jo...@latchkey.com>.
on 3/29/01 8:33 AM, "dfs@apache.org" <df...@apache.org> wrote:
> - _ALNUM = 18, // no Match any alphanumeric character
> - _NALNUM = 19, // no Match any non-alphanumeric character
> + _WORD = 18, // no Match any word character
> + _NWORD = 19, // no Match any non-word character
I know this is totally nitpicky, but the other numbers were aligned
properly...:-)
-jon
--
If you come from a Perl or PHP background, JSP is a way to take
your pain to new levels. --Anonymous
<http://jakarta.apache.org/velocity/ymtd/ymtd.html>