src/com/sun/org/apache/regexp/internal/recompile.java

changeset 2116
aaee9ae4799a
parent 759
7ea027fae4d8
equal deleted inserted replaced
2090:3b8ebb957957 2116:aaee9ae4799a
1 /*
2 * reserved comment block
3 * DO NOT REMOVE OR ALTER!
4 */
5 /*
6 * Copyright 1999-2004 The Apache Software Foundation.
7 *
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
11 *
12 * http://www.apache.org/licenses/LICENSE-2.0
13 *
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
19 */
20
21 package com.sun.org.apache.regexp.internal;
22
23 import com.sun.org.apache.regexp.internal.RECompiler;
24 import com.sun.org.apache.regexp.internal.RESyntaxException;
25
26 /**
27 * 'recompile' is a command line tool that pre-compiles one or more regular expressions
28 * for use with the regular expression matcher class 'RE'. For example, the command
29 * "java recompile a*b" produces output like this:
30 *
31 * <pre>
32 *
33 * // Pre-compiled regular expression "a*b"
34 * char[] re1Instructions =
35 * {
36 * 0x007c, 0x0000, 0x001a, 0x007c, 0x0000, 0x000d, 0x0041,
37 * 0x0001, 0x0004, 0x0061, 0x007c, 0x0000, 0x0003, 0x0047,
38 * 0x0000, 0xfff6, 0x007c, 0x0000, 0x0003, 0x004e, 0x0000,
39 * 0x0003, 0x0041, 0x0001, 0x0004, 0x0062, 0x0045, 0x0000,
40 * 0x0000,
41 * };
42 *
43 * REProgram re1 = new REProgram(re1Instructions);
44 *
45 * </pre>
46 *
47 * By pasting this output into your code, you can construct a regular expression matcher
48 * (RE) object directly from the pre-compiled data (the character array re1), thus avoiding
49 * the overhead of compiling the expression at runtime. For example:
50 *
51 * <pre>
52 *
53 * RE r = new RE(re1);
54 *
55 * </pre>
56 *
57 * @see RE
58 * @see RECompiler
59 *
60 * @author <a href="mailto:jonl@muppetlabs.com">Jonathan Locke</a>
61 */
62 public class recompile
63 {
64 /**
65 * Main application entrypoint.
66 * @param arg Command line arguments
67 */
68 static public void main(String[] arg)
69 {
70 // Create a compiler object
71 RECompiler r = new RECompiler();
72
73 // Print usage if arguments are incorrect
74 if (arg.length <= 0 || arg.length % 2 != 0)
75 {
76 System.out.println("Usage: recompile <patternname> <pattern>");
77 System.exit(0);
78 }
79
80 // Loop through arguments, compiling each
81 for (int i = 0; i < arg.length; i += 2)
82 {
83 try
84 {
85 // Compile regular expression
86 String name = arg[i];
87 String pattern = arg[i+1];
88 String instructions = name + "PatternInstructions";
89
90 // Output program as a nice, formatted character array
91 System.out.print("\n // Pre-compiled regular expression '" + pattern + "'\n"
92 + " private static char[] " + instructions + " = \n {");
93
94 // Compile program for pattern
95 REProgram program = r.compile(pattern);
96
97 // Number of columns in output
98 int numColumns = 7;
99
100 // Loop through program
101 char[] p = program.getInstructions();
102 for (int j = 0; j < p.length; j++)
103 {
104 // End of column?
105 if ((j % numColumns) == 0)
106 {
107 System.out.print("\n ");
108 }
109
110 // Print character as padded hex number
111 String hex = Integer.toHexString(p[j]);
112 while (hex.length() < 4)
113 {
114 hex = "0" + hex;
115 }
116 System.out.print("0x" + hex + ", ");
117 }
118
119 // End of program block
120 System.out.println("\n };");
121 System.out.println("\n private static RE " + name + "Pattern = new RE(new REProgram(" + instructions + "));");
122 }
123 catch (RESyntaxException e)
124 {
125 System.out.println("Syntax error in expression \"" + arg[i] + "\": " + e.toString());
126 }
127 catch (Exception e)
128 {
129 System.out.println("Unexpected exception: " + e.toString());
130 }
131 catch (Error e)
132 {
133 System.out.println("Internal error: " + e.toString());
134 }
135 }
136 }
137 }

mercurial