Scinotes: fix a NPE when editing huge file
[scilab.git] / scilab / modules / scinotes / src / java / org / scilab / modules / scinotes / MatchingBlockScanner.java
1 /* The following code was generated by JFlex 1.6.1 */
2
3 //CHECKSTYLE:OFF
4
5 package org.scilab.modules.scinotes;
6
7 import java.io.IOException;
8 import javax.swing.text.Element;
9
10 @javax.annotation.Generated("JFlex")
11 @SuppressWarnings("fallthrough")
12
13 /**
14  * This class is a scanner generated by 
15  * <a href="http://www.jflex.de/">JFlex</a> 1.6.1
16  * from the specification file <tt>modules/scinotes/src/java/jflex/matchingblock.jflex</tt>
17  */
18 public final class MatchingBlockScanner {
19
20   /** This character denotes the end of file */
21   public static final int YYEOF = -1;
22
23   /** initial size of the lookahead buffer */
24   private static final int ZZ_BUFFERSIZE = 256;
25
26   /** lexical states */
27   public static final int YYINITIAL = 0;
28   public static final int LR = 2;
29   public static final int RL = 4;
30   public static final int OPENCLOSE = 6;
31   public static final int CLOSEOPEN = 8;
32   public static final int PSNART = 10;
33   public static final int SPEC = 12;
34
35   /**
36    * ZZ_LEXSTATE[l] is the state in the DFA for the lexical state l
37    * ZZ_LEXSTATE[l+1] is the state in the DFA for the lexical state l
38    *                  at the beginning of a line
39    * l is of the form l = 2*k, k a non negative integer
40    */
41   private static final int ZZ_LEXSTATE[] = { 
42      0,  0,  1,  1,  2,  2,  3,  3,  4,  4,  5,  5,  6, 6
43   };
44
45   /** 
46    * Translates characters to character classes
47    */
48   private static final String ZZ_CMAP_PACKED = 
49     "\12\0\1\1\1\4\1\4\1\3\23\0\1\7\1\11\1\7\1\5"+
50     "\1\6\1\0\1\10\1\31\1\12\5\0\1\2\12\5\5\0\1\7"+
51     "\1\0\32\7\1\31\1\0\1\12\1\0\1\7\1\0\2\7\1\24"+
52     "\1\32\1\22\1\14\1\7\1\20\1\13\2\7\1\21\1\7\1\30"+
53     "\1\15\2\7\1\16\1\23\1\25\1\27\1\7\1\17\1\7\1\26"+
54     "\1\7\1\31\1\0\1\12\7\0\1\4\u1fa2\0\1\4\1\4\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\udfe6\0";
55
56   /** 
57    * Translates characters to character classes
58    */
59   private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);
60
61   /** 
62    * Translates DFA states to action switch labels.
63    */
64   private static final int [] ZZ_ACTION = zzUnpackAction();
65
66   private static final String ZZ_ACTION_PACKED_0 =
67     "\7\0\6\1\1\2\6\1\1\3\2\1\1\4\7\1"+
68     "\1\2\1\1\11\2\1\5\1\6\1\0\1\7\2\0"+
69     "\1\1\1\3\7\1\12\0\1\2\7\0\1\3\14\0"+
70     "\2\1\1\2\3\1\7\0\1\1\1\2\4\0\1\2"+
71     "\10\0\6\1\13\0\1\3\5\0\4\1\15\0\2\1"+
72     "\7\0\2\1\6\0\1\1\1\0\1\2\3\0\3\1"+
73     "\3\0\1\1\2\0\1\2";
74
75   private static int [] zzUnpackAction() {
76     int [] result = new int[189];
77     int offset = 0;
78     offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
79     return result;
80   }
81
82   private static int zzUnpackAction(String packed, int offset, int [] result) {
83     int i = 0;       /* index in packed string  */
84     int j = offset;  /* index in unpacked array */
85     int l = packed.length();
86     while (i < l) {
87       int count = packed.charAt(i++);
88       int value = packed.charAt(i++);
89       do result[j++] = value; while (--count > 0);
90     }
91     return j;
92   }
93
94
95   /** 
96    * Translates a state to a row index in the transition table
97    */
98   private static final int [] ZZ_ROWMAP = zzUnpackRowMap();
99
100   private static final String ZZ_ROWMAP_PACKED_0 =
101     "\0\0\0\33\0\66\0\121\0\154\0\207\0\242\0\0"+
102     "\0\275\0\330\0\363\0\u010e\0\u0129\0\u0144\0\u015f\0\u017a"+
103     "\0\u0195\0\u01b0\0\u01cb\0\u01e6\0\0\0\u0201\0\u021c\0\0"+
104     "\0\u0237\0\u0252\0\u026d\0\u0288\0\u02a3\0\u02be\0\u02d9\0\0"+
105     "\0\u02f4\0\u030f\0\u032a\0\u0345\0\u0360\0\u037b\0\u0396\0\u03b1"+
106     "\0\u03cc\0\u03e7\0\0\0\0\0\u0402\0\0\0\u041d\0\u0129"+
107     "\0\u0438\0\363\0\u0453\0\u046e\0\u0489\0\u04a4\0\u04bf\0\u04da"+
108     "\0\u04f5\0\u0201\0\u0510\0\u052b\0\u0546\0\u0561\0\u057c\0\u0597"+
109     "\0\u05b2\0\u05cd\0\u05e8\0\u0603\0\u061e\0\u0639\0\u0654\0\u066f"+
110     "\0\u068a\0\u06a5\0\u06c0\0\u06db\0\u06f6\0\u0711\0\u072c\0\u0747"+
111     "\0\u0762\0\u077d\0\u0798\0\u07b3\0\u07ce\0\u07e9\0\u0804\0\u081f"+
112     "\0\u083a\0\u0855\0\u0870\0\u088b\0\u08a6\0\u0510\0\u08c1\0\u08dc"+
113     "\0\u08f7\0\u0912\0\u092d\0\u0948\0\u0963\0\u097e\0\u0999\0\u09b4"+
114     "\0\u09cf\0\u09ea\0\u0a05\0\u06db\0\u0a20\0\u0a3b\0\u0a56\0\u0a71"+
115     "\0\u0a8c\0\u0aa7\0\u0ac2\0\u0add\0\u0af8\0\u0b13\0\u0b2e\0\u0b49"+
116     "\0\u0b64\0\u0b7f\0\u0b9a\0\u0bb5\0\u0bd0\0\u0beb\0\u0c06\0\u0c21"+
117     "\0\u0c3c\0\u0c57\0\u0c72\0\u0c8d\0\u0ca8\0\u0cc3\0\u0cde\0\u0cf9"+
118     "\0\u0d14\0\u0d2f\0\u0d4a\0\u0d65\0\u0d80\0\u0d9b\0\u0db6\0\u0dd1"+
119     "\0\u0dec\0\u0e07\0\u0e22\0\u0e3d\0\u0e58\0\u0e73\0\u0e8e\0\u0ea9"+
120     "\0\u0ec4\0\u0edf\0\u0efa\0\u0f15\0\u0f30\0\u0f4b\0\u0f66\0\u0f81"+
121     "\0\u0f9c\0\u0fb7\0\u0fd2\0\u0fed\0\u1008\0\u1023\0\u103e\0\u1059"+
122     "\0\u1074\0\u108f\0\u10aa\0\u10c5\0\u10e0\0\u10fb\0\u1116\0\u1131"+
123     "\0\u114c\0\u1167\0\u1182\0\u119d\0\u11b8\0\u11d3\0\u11ee\0\u11d3"+
124     "\0\u1209\0\u1224\0\u123f\0\u125a\0\363";
125
126   private static int [] zzUnpackRowMap() {
127     int [] result = new int[189];
128     int offset = 0;
129     offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
130     return result;
131   }
132
133   private static int zzUnpackRowMap(String packed, int offset, int [] result) {
134     int i = 0;  /* index in packed string  */
135     int j = offset;  /* index in unpacked array */
136     int l = packed.length();
137     while (i < l) {
138       int high = packed.charAt(i++) << 16;
139       result[j++] = high | packed.charAt(i++);
140     }
141     return j;
142   }
143
144   /** 
145    * The transition table of the DFA
146    */
147   private static final int [] ZZ_TRANS = zzUnpackTrans();
148
149   private static final String ZZ_TRANS_PACKED_0 =
150     "\33\0\2\10\1\11\2\0\1\12\1\13\1\14\2\15"+
151     "\1\16\1\17\1\20\2\14\1\21\2\14\1\22\1\23"+
152     "\1\14\1\24\3\14\1\25\1\14\1\10\1\26\1\10"+
153     "\2\0\1\27\1\10\1\27\1\30\1\15\1\25\1\27"+
154     "\1\31\1\27\1\32\1\27\1\33\1\27\1\34\2\27"+
155     "\1\35\1\36\1\27\1\37\1\40\1\41\3\40\2\0"+
156     "\6\40\1\42\1\43\2\40\1\44\2\40\1\45\1\46"+
157     "\1\40\1\47\3\40\1\25\4\40\2\0\1\50\1\40"+
158     "\1\50\2\40\1\25\15\50\1\51\1\40\1\52\10\0"+
159     "\1\53\22\0\3\54\2\0\26\54\2\0\1\55\40\0"+
160     "\1\56\11\0\1\57\15\0\1\13\1\0\1\13\3\0"+
161     "\16\13\1\0\1\13\5\0\1\13\1\0\1\13\1\56"+
162     "\2\0\16\13\1\0\1\13\1\60\1\0\1\60\1\0"+
163     "\4\60\2\61\21\60\10\0\1\56\27\0\1\13\1\0"+
164     "\1\13\1\56\2\0\1\13\1\62\14\13\1\0\1\13"+
165     "\5\0\1\13\1\0\1\13\1\56\2\0\2\13\1\63"+
166     "\11\13\1\64\1\13\1\0\1\13\5\0\1\13\1\0"+
167     "\1\13\1\56\2\0\5\13\1\65\10\13\1\0\1\13"+
168     "\5\0\1\13\1\0\1\13\1\56\2\0\15\13\1\66"+
169     "\1\0\1\13\5\0\1\13\1\0\1\13\1\56\2\0"+
170     "\4\13\1\67\2\13\1\70\6\13\1\0\1\13\5\0"+
171     "\1\13\1\0\1\13\1\56\2\0\3\13\1\71\12\13"+
172     "\1\0\1\13\1\72\1\0\1\73\1\0\27\72\14\0"+
173     "\1\74\1\0\1\75\1\0\1\76\1\0\1\77\2\0"+
174     "\1\100\1\101\1\0\1\102\1\0\1\103\13\0\1\104"+
175     "\1\74\1\0\1\75\1\0\1\76\1\0\1\77\2\0"+
176     "\1\100\1\101\1\0\1\102\1\0\1\103\14\0\1\74"+
177     "\1\105\1\75\1\0\1\76\1\0\1\77\2\0\1\100"+
178     "\1\101\1\0\1\102\1\0\1\103\14\0\1\74\1\0"+
179     "\1\75\1\0\1\76\1\0\1\77\1\0\1\106\1\100"+
180     "\1\101\1\0\1\102\1\0\1\103\14\0\1\74\1\0"+
181     "\1\75\1\0\1\76\1\107\1\77\2\0\1\100\1\101"+
182     "\1\0\1\102\1\0\1\103\14\0\1\74\1\0\1\75"+
183     "\1\0\1\76\1\0\1\77\1\0\1\110\1\100\1\101"+
184     "\1\0\1\102\1\0\1\103\14\0\1\74\1\0\1\111"+
185     "\1\0\1\76\1\0\1\77\2\0\1\100\1\101\1\0"+
186     "\1\102\1\0\1\103\14\0\1\74\1\112\1\75\1\0"+
187     "\1\76\1\0\1\77\2\0\1\100\1\101\1\0\1\102"+
188     "\1\0\1\103\14\0\1\74\1\0\1\75\1\0\1\76"+
189     "\1\0\1\77\2\0\1\100\1\101\1\0\1\113\1\0"+
190     "\1\103\14\0\1\114\33\0\1\115\11\0\1\116\23\0"+
191     "\1\117\33\0\1\120\30\0\1\121\2\0\1\122\26\0"+
192     "\1\123\44\0\1\124\1\0\1\125\15\0\1\126\12\0"+
193     "\1\124\1\0\1\125\30\0\1\127\1\0\1\125\1\55"+
194     "\1\10\1\55\2\0\26\55\30\0\1\130\12\0\2\60"+
195     "\26\0\1\13\1\0\1\13\3\0\3\13\1\62\12\13"+
196     "\1\0\1\13\5\0\1\13\1\0\1\13\3\0\15\13"+
197     "\1\131\1\0\1\13\5\0\1\13\1\0\1\13\3\0"+
198     "\1\132\15\13\1\0\1\13\5\0\1\13\1\0\1\13"+
199     "\3\0\16\13\1\0\1\133\5\0\1\13\1\0\1\13"+
200     "\3\0\1\134\15\13\1\0\1\13\5\0\1\13\1\0"+
201     "\1\13\3\0\6\13\1\135\7\13\1\0\1\13\5\0"+
202     "\1\13\1\0\1\13\3\0\13\13\1\62\2\13\1\0"+
203     "\1\13\1\72\1\0\1\136\1\0\27\72\13\0\1\10"+
204     "\34\0\1\137\41\0\1\140\27\0\1\141\35\0\1\142"+
205     "\24\0\1\143\31\0\1\144\45\0\1\145\7\0\1\10"+
206     "\1\0\1\10\3\0\7\10\1\146\6\10\1\0\1\10"+
207     "\14\0\1\147\43\0\1\150\20\0\1\151\41\0\1\152"+
208     "\25\0\1\137\7\0\1\147\20\0\1\153\34\0\1\144"+
209     "\4\0\1\25\15\0\1\154\1\0\1\154\3\0\16\154"+
210     "\1\0\1\154\16\0\1\114\44\0\1\155\15\0\1\156"+
211     "\42\0\1\157\22\0\1\160\40\0\1\161\37\0\1\114"+
212     "\21\0\1\162\45\0\1\163\15\0\1\164\34\0\1\162"+
213     "\4\0\1\25\42\0\1\165\5\0\1\13\1\0\1\13"+
214     "\3\0\11\13\1\166\4\13\1\0\1\13\5\0\1\13"+
215     "\1\0\1\13\3\0\6\13\1\167\7\13\1\0\1\13"+
216     "\5\0\1\13\1\0\1\13\3\0\1\13\1\170\14\13"+
217     "\1\0\1\13\5\0\1\13\1\0\1\13\3\0\12\13"+
218     "\1\171\3\13\1\0\1\13\5\0\1\13\1\0\1\13"+
219     "\3\0\7\13\1\172\6\13\1\0\1\13\14\0\1\10"+
220     "\43\0\1\173\20\0\1\174\41\0\1\175\35\0\1\10"+
221     "\20\0\1\176\41\0\1\10\33\0\1\177\14\0\1\10"+
222     "\1\0\1\10\3\0\16\10\1\0\1\10\13\0\1\200"+
223     "\37\0\1\201\33\0\1\202\36\0\1\203\31\0\1\204"+
224     "\27\0\1\205\33\0\1\206\35\0\1\207\27\0\1\210"+
225     "\23\0\1\211\41\0\1\40\35\0\1\212\21\0\1\213"+
226     "\23\0\1\13\1\0\1\13\3\0\12\13\1\214\3\13"+
227     "\1\0\1\13\5\0\1\13\1\0\1\13\3\0\7\13"+
228     "\1\62\6\13\1\0\1\13\5\0\1\13\1\0\1\13"+
229     "\3\0\14\13\1\215\1\13\1\0\1\13\5\0\1\13"+
230     "\1\0\1\13\3\0\11\13\1\216\4\13\1\0\1\13"+
231     "\5\0\1\13\1\0\1\13\3\0\11\13\1\217\4\13"+
232     "\1\0\1\13\13\0\1\220\37\0\1\221\33\0\1\222"+
233     "\36\0\1\223\26\0\1\145\30\0\1\224\32\0\1\147"+
234     "\35\0\1\224\34\0\1\225\33\0\1\226\27\0\1\114"+
235     "\23\0\1\227\43\0\1\230\32\0\1\231\33\0\1\232"+
236     "\31\0\1\233\35\0\1\234\10\0\1\13\1\0\1\13"+
237     "\3\0\1\235\15\13\1\0\1\13\5\0\1\13\1\0"+
238     "\1\13\3\0\15\13\1\236\1\0\1\13\5\0\1\13"+
239     "\1\0\1\13\3\0\5\13\1\62\10\13\1\0\1\13"+
240     "\5\0\1\13\1\0\1\13\3\0\12\13\1\62\3\13"+
241     "\1\0\1\13\17\0\1\237\32\0\1\10\35\0\1\237"+
242     "\34\0\1\240\31\0\1\147\37\0\1\241\15\0\1\242"+
243     "\33\0\1\25\36\0\1\114\37\0\1\114\31\0\1\243"+
244     "\36\0\1\244\32\0\1\245\7\0\1\13\1\0\1\13"+
245     "\3\0\2\13\1\246\13\13\1\0\1\13\5\0\1\13"+
246     "\1\0\1\13\3\0\11\13\1\247\4\13\1\0\1\13"+
247     "\23\0\1\10\37\0\1\250\31\0\1\251\20\0\1\252"+
248     "\45\0\1\253\31\0\1\254\27\0\1\255\13\0\1\13"+
249     "\1\0\1\13\3\0\15\13\1\62\1\0\1\13\5\0"+
250     "\1\13\1\0\1\13\3\0\12\13\1\256\3\13\1\0"+
251     "\1\13\27\0\1\257\17\0\1\260\46\0\1\114\31\0"+
252     "\1\261\17\0\1\262\43\0\1\263\12\0\1\13\1\0"+
253     "\1\13\3\0\1\264\15\13\1\0\1\13\14\0\1\265"+
254     "\23\0\1\10\1\0\1\10\3\0\16\10\1\0\1\266"+
255     "\14\0\1\267\50\0\1\270\13\0\1\271\24\0\1\13"+
256     "\1\0\1\13\3\0\2\13\1\272\13\13\1\0\1\13"+
257     "\32\0\1\103\30\0\1\273\34\0\1\125\15\0\1\274"+
258     "\22\0\1\13\1\0\1\13\3\0\15\13\1\275\1\0"+
259     "\1\13\22\0\1\25\40\0\1\10\2\0";
260
261   private static int [] zzUnpackTrans() {
262     int [] result = new int[4725];
263     int offset = 0;
264     offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
265     return result;
266   }
267
268   private static int zzUnpackTrans(String packed, int offset, int [] result) {
269     int i = 0;       /* index in packed string  */
270     int j = offset;  /* index in unpacked array */
271     int l = packed.length();
272     while (i < l) {
273       int count = packed.charAt(i++);
274       int value = packed.charAt(i++);
275       value--;
276       do result[j++] = value; while (--count > 0);
277     }
278     return j;
279   }
280
281
282   /* error codes */
283   private static final int ZZ_UNKNOWN_ERROR = 0;
284   private static final int ZZ_NO_MATCH = 1;
285   private static final int ZZ_PUSHBACK_2BIG = 2;
286
287   /* error messages for the codes above */
288   private static final String ZZ_ERROR_MSG[] = {
289     "Unknown internal scanner error",
290     "Error: could not match input",
291     "Error: pushback value was too large"
292   };
293
294   /**
295    * ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
296    */
297   private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute();
298
299   private static final String ZZ_ATTRIBUTE_PACKED_0 =
300     "\1\10\6\0\1\11\14\1\1\11\2\1\1\11\7\1"+
301     "\1\11\12\1\2\11\1\0\1\11\2\0\11\1\12\0"+
302     "\1\1\7\0\1\1\14\0\6\1\7\0\2\1\4\0"+
303     "\1\1\10\0\6\1\13\0\1\1\5\0\4\1\15\0"+
304     "\2\1\7\0\2\1\6\0\1\1\1\0\1\1\3\0"+
305     "\3\1\3\0\1\1\2\0\1\1";
306
307   private static int [] zzUnpackAttribute() {
308     int [] result = new int[189];
309     int offset = 0;
310     offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
311     return result;
312   }
313
314   private static int zzUnpackAttribute(String packed, int offset, int [] result) {
315     int i = 0;       /* index in packed string  */
316     int j = offset;  /* index in unpacked array */
317     int l = packed.length();
318     while (i < l) {
319       int count = packed.charAt(i++);
320       int value = packed.charAt(i++);
321       do result[j++] = value; while (--count > 0);
322     }
323     return j;
324   }
325
326   /** the input device */
327   private java.io.Reader zzReader;
328
329   /** the current state of the DFA */
330   private int zzState;
331
332   /** the current lexical state */
333   private int zzLexicalState = YYINITIAL;
334
335   /** this buffer contains the current text to be matched and is
336       the source of the yytext() string */
337   private char zzBuffer[] = new char[ZZ_BUFFERSIZE];
338
339   /** the textposition at the last accepting state */
340   private int zzMarkedPos;
341
342   /** the current text position in the buffer */
343   private int zzCurrentPos;
344
345   /** startRead marks the beginning of the yytext() string in the buffer */
346   private int zzStartRead;
347
348   /** endRead marks the last character in the buffer, that has been read
349       from input */
350   private int zzEndRead;
351
352   /** number of newlines encountered up to the start of the matched text */
353   private int yyline;
354
355   /** the number of characters up to the start of the matched text */
356   private int yychar;
357
358   /**
359    * the number of characters from the last newline up to the start of the 
360    * matched text
361    */
362   private int yycolumn;
363
364   /** 
365    * zzAtBOL == true <=> the scanner is currently at the beginning of a line
366    */
367   private boolean zzAtBOL = true;
368
369   /** zzAtEOF == true <=> the scanner is at the EOF */
370   private boolean zzAtEOF;
371
372   /** denotes if the user-EOF-code has already been executed */
373   private boolean zzEOFDone;
374   
375   /** 
376    * The number of occupied positions in zzBuffer beyond zzEndRead.
377    * When a lead/high surrogate has been read from the input stream
378    * into the final zzBuffer position, this will have a value of 1;
379    * otherwise, it will have a value of 0.
380    */
381   private int zzFinalHighSurrogate = 0;
382
383   /* user code: */
384     private ScilabDocument doc;
385     private Element elem;
386     private boolean transp = false;
387     private ScilabLexer scilabLexer;
388     private int start;
389     private int end;
390     private int savePos;
391
392     public MatchingBlockScanner(ScilabDocument doc) {
393         this.doc = doc;
394         this.elem = doc.getDefaultRootElement();
395         this.scilabLexer = new ScilabLexer(doc, null, false);
396     }
397
398     public MatchingPositions getNextBlock(int pos, boolean lr) {
399         int s = 1;
400         transp = false;
401         try {
402             if (lr) {
403                 start =  pos;
404                 end = doc.getEndPosition().getOffset();
405                 yyreset(new ScilabDocumentReader(doc, start, end));
406                 yybegin(LR);
407             } else {
408                 start = pos - 1;
409                 end = 0;
410                 yyreset(new ScilabDocumentReader(doc, true, start, end));
411                 yybegin(RL);
412             }
413             do {
414                if (yylex() == 0) {
415                   s--;
416                } else {
417                   s++;
418                }
419             } while (zzMarkedPos != 0 && s != 0);
420         } catch (IOException e) {
421             return null;
422         }
423         if (s == 0) {
424             if (lr) {
425                 return new MatchingPositions(pos, pos, pos + yychar, pos + yychar + (transp?(yylength()-1):yylength()));
426             } else {
427                 return new MatchingPositions(pos, pos, pos - yychar - yylength(), pos - yychar);
428             }
429         }
430
431         return null;
432     }
433
434     public MatchingPositions getMatchingBlock(int pos, boolean lr) {
435         int p1, s = 1;
436         transp = false;
437         try {
438             if (lr) {
439                 start =  pos;
440                 end = doc.getEndPosition().getOffset();
441                 yyreset(new ScilabDocumentReader(doc, start, end));
442                 yybegin(OPENCLOSE);
443                 if (yylex() != 1) {
444                    return null;
445                 }
446
447                 p1 = pos + yylength();
448                 yybegin(LR);
449             } else {
450                  start = pos - 1;
451                  end = 0;
452                  yyreset(new ScilabDocumentReader(doc, true, start, end));
453                  yybegin(CLOSEOPEN);
454                  if (yylex() != 1) {
455                     return null;
456                  }
457                  p1 = pos - yylength();
458                  yybegin(RL);
459             }
460
461             do {
462                if (yylex() == 0) {
463                   s--;
464                } else {
465                   s++;
466                }
467             } while (zzMarkedPos != 0 && s != 0);
468         } catch (IOException e) {
469             return null;
470         }
471         if (s == 0) {
472             if (lr) {
473                 return new MatchingPositions(pos, p1, pos + yychar, pos + yychar + (transp?(yylength()-1):yylength()));
474             } else {
475                 return new MatchingPositions(p1, pos, pos - yychar - yylength(), pos - yychar);
476             }
477         }
478
479         return null;
480     }
481
482     public final class MatchingPositions {
483         public int firstB;
484         public int firstE;
485         public int secondB;
486         public int secondE;
487
488         private MatchingPositions(int x1, int x2, int y1, int y2) {
489             firstB = x1;
490             firstE = x2;
491             secondB = y1;
492             secondE = y2;
493         }
494     }
495
496
497   /**
498    * Creates a new scanner
499    *
500    * @param   in  the java.io.Reader to read input from.
501    */
502   public MatchingBlockScanner(java.io.Reader in) {
503     this.zzReader = in;
504   }
505
506
507   /** 
508    * Unpacks the compressed character translation table.
509    *
510    * @param packed   the packed character translation table
511    * @return         the unpacked character translation table
512    */
513   private static char [] zzUnpackCMap(String packed) {
514     char [] map = new char[0x110000];
515     int i = 0;  /* index in packed string  */
516     int j = 0;  /* index in unpacked array */
517     while (i < 152) {
518       int  count = packed.charAt(i++);
519       char value = packed.charAt(i++);
520       do map[j++] = value; while (--count > 0);
521     }
522     return map;
523   }
524
525
526   /**
527    * Refills the input buffer.
528    *
529    * @return      <code>false</code>, iff there was new input.
530    * 
531    * @exception   java.io.IOException  if any I/O-Error occurs
532    */
533   private boolean zzRefill() throws java.io.IOException {
534
535     /* first: make room (if you can) */
536     if (zzStartRead > 0) {
537       zzEndRead += zzFinalHighSurrogate;
538       zzFinalHighSurrogate = 0;
539       System.arraycopy(zzBuffer, zzStartRead,
540                        zzBuffer, 0,
541                        zzEndRead-zzStartRead);
542
543       /* translate stored positions */
544       zzEndRead-= zzStartRead;
545       zzCurrentPos-= zzStartRead;
546       zzMarkedPos-= zzStartRead;
547       zzStartRead = 0;
548     }
549
550     /* is the buffer big enough? */
551     if (zzCurrentPos >= zzBuffer.length - zzFinalHighSurrogate) {
552       /* if not: blow it up */
553       char newBuffer[] = new char[zzBuffer.length*2];
554       System.arraycopy(zzBuffer, 0, newBuffer, 0, zzBuffer.length);
555       zzBuffer = newBuffer;
556       zzEndRead += zzFinalHighSurrogate;
557       zzFinalHighSurrogate = 0;
558     }
559
560     /* fill the buffer with new input */
561     int requested = zzBuffer.length - zzEndRead;
562     int numRead = zzReader.read(zzBuffer, zzEndRead, requested);
563
564     /* not supposed to occur according to specification of java.io.Reader */
565     if (numRead == 0) {
566       throw new java.io.IOException("Reader returned 0 characters. See JFlex examples for workaround.");
567     }
568     if (numRead > 0) {
569       zzEndRead += numRead;
570       /* If numRead == requested, we might have requested to few chars to
571          encode a full Unicode character. We assume that a Reader would
572          otherwise never return half characters. */
573       if (numRead == requested) {
574         if (Character.isHighSurrogate(zzBuffer[zzEndRead - 1])) {
575           --zzEndRead;
576           zzFinalHighSurrogate = 1;
577         }
578       }
579       /* potentially more input available */
580       return false;
581     }
582
583     /* numRead < 0 ==> end of stream */
584     return true;
585   }
586
587     
588   /**
589    * Closes the input stream.
590    */
591   public final void yyclose() throws java.io.IOException {
592     zzAtEOF = true;            /* indicate end of file */
593     zzEndRead = zzStartRead;  /* invalidate buffer    */
594
595     if (zzReader != null)
596       zzReader.close();
597   }
598
599
600   /**
601    * Resets the scanner to read from a new input stream.
602    * Does not close the old reader.
603    *
604    * All internal variables are reset, the old input stream 
605    * <b>cannot</b> be reused (internal buffer is discarded and lost).
606    * Lexical state is set to <tt>ZZ_INITIAL</tt>.
607    *
608    * Internal scan buffer is resized down to its initial length, if it has grown.
609    *
610    * @param reader   the new input stream 
611    */
612   public final void yyreset(java.io.Reader reader) {
613     zzReader = reader;
614     zzAtBOL  = true;
615     zzAtEOF  = false;
616     zzEOFDone = false;
617     zzEndRead = zzStartRead = 0;
618     zzCurrentPos = zzMarkedPos = 0;
619     zzFinalHighSurrogate = 0;
620     yyline = yychar = yycolumn = 0;
621     zzLexicalState = YYINITIAL;
622     if (zzBuffer.length > ZZ_BUFFERSIZE)
623       zzBuffer = new char[ZZ_BUFFERSIZE];
624   }
625
626
627   /**
628    * Returns the current lexical state.
629    */
630   public final int yystate() {
631     return zzLexicalState;
632   }
633
634
635   /**
636    * Enters a new lexical state
637    *
638    * @param newState the new lexical state
639    */
640   public final void yybegin(int newState) {
641     zzLexicalState = newState;
642   }
643
644
645   /**
646    * Returns the text matched by the current regular expression.
647    */
648   public final String yytext() {
649     return new String( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead );
650   }
651
652
653   /**
654    * Returns the character at position <tt>pos</tt> from the 
655    * matched text. 
656    * 
657    * It is equivalent to yytext().charAt(pos), but faster
658    *
659    * @param pos the position of the character to fetch. 
660    *            A value from 0 to yylength()-1.
661    *
662    * @return the character at position pos
663    */
664   public final char yycharat(int pos) {
665     return zzBuffer[zzStartRead+pos];
666   }
667
668
669   /**
670    * Returns the length of the matched text region.
671    */
672   public final int yylength() {
673     return zzMarkedPos-zzStartRead;
674   }
675
676
677   /**
678    * Reports an error that occured while scanning.
679    *
680    * In a wellformed scanner (no or only correct usage of 
681    * yypushback(int) and a match-all fallback rule) this method 
682    * will only be called with things that "Can't Possibly Happen".
683    * If this method is called, something is seriously wrong
684    * (e.g. a JFlex bug producing a faulty scanner etc.).
685    *
686    * Usual syntax/scanner level error handling should be done
687    * in error fallback rules.
688    *
689    * @param   errorCode  the code of the errormessage to display
690    */
691   private void zzScanError(int errorCode) {
692     String message;
693     try {
694       message = ZZ_ERROR_MSG[errorCode];
695     }
696     catch (ArrayIndexOutOfBoundsException e) {
697       message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
698     }
699
700     throw new Error(message);
701   } 
702
703
704   /**
705    * Pushes the specified amount of characters back into the input stream.
706    *
707    * They will be read again by then next call of the scanning method
708    *
709    * @param number  the number of characters to be read again.
710    *                This number must not be greater than yylength()!
711    */
712   public void yypushback(int number)  {
713     if ( number > yylength() )
714       zzScanError(ZZ_PUSHBACK_2BIG);
715
716     zzMarkedPos -= number;
717   }
718
719
720   /**
721    * Resumes scanning until the next regular expression is matched,
722    * the end of input is encountered or an I/O-Error occurs.
723    *
724    * @return      the next token
725    * @exception   java.io.IOException  if any I/O-Error occurs
726    */
727   public int yylex() throws java.io.IOException {
728     int zzInput;
729     int zzAction;
730
731     // cached fields:
732     int zzCurrentPosL;
733     int zzMarkedPosL;
734     int zzEndReadL = zzEndRead;
735     char [] zzBufferL = zzBuffer;
736     char [] zzCMapL = ZZ_CMAP;
737
738     int [] zzTransL = ZZ_TRANS;
739     int [] zzRowMapL = ZZ_ROWMAP;
740     int [] zzAttrL = ZZ_ATTRIBUTE;
741
742     while (true) {
743       zzMarkedPosL = zzMarkedPos;
744
745       yychar+= zzMarkedPosL-zzStartRead;
746
747       zzAction = -1;
748
749       zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
750   
751       zzState = ZZ_LEXSTATE[zzLexicalState];
752
753       // set up zzAction for empty match case:
754       int zzAttributes = zzAttrL[zzState];
755       if ( (zzAttributes & 1) == 1 ) {
756         zzAction = zzState;
757       }
758
759
760       zzForAction: {
761         while (true) {
762     
763           if (zzCurrentPosL < zzEndReadL) {
764             zzInput = Character.codePointAt(zzBufferL, zzCurrentPosL, zzEndReadL);
765             zzCurrentPosL += Character.charCount(zzInput);
766           }
767           else if (zzAtEOF) {
768             zzInput = YYEOF;
769             break zzForAction;
770           }
771           else {
772             // store back cached positions
773             zzCurrentPos  = zzCurrentPosL;
774             zzMarkedPos   = zzMarkedPosL;
775             boolean eof = zzRefill();
776             // get translated positions and possibly new buffer
777             zzCurrentPosL  = zzCurrentPos;
778             zzMarkedPosL   = zzMarkedPos;
779             zzBufferL      = zzBuffer;
780             zzEndReadL     = zzEndRead;
781             if (eof) {
782               zzInput = YYEOF;
783               break zzForAction;
784             }
785             else {
786               zzInput = Character.codePointAt(zzBufferL, zzCurrentPosL, zzEndReadL);
787               zzCurrentPosL += Character.charCount(zzInput);
788             }
789           }
790           int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ];
791           if (zzNext == -1) break zzForAction;
792           zzState = zzNext;
793
794           zzAttributes = zzAttrL[zzState];
795           if ( (zzAttributes & 1) == 1 ) {
796             zzAction = zzState;
797             zzMarkedPosL = zzCurrentPosL;
798             if ( (zzAttributes & 8) == 8 ) break zzForAction;
799           }
800
801         }
802       }
803
804       // store back cached position
805       zzMarkedPos = zzMarkedPosL;
806
807       if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
808         zzAtEOF = true;
809           {   return -1;
810  }
811       }
812       else {
813         switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
814           case 1: 
815             { 
816             }
817           case 8: break;
818           case 2: 
819             { return 0;
820             }
821           case 9: break;
822           case 3: 
823             { return 1;
824             }
825           case 10: break;
826           case 4: 
827             { yypushback(1);
828                                    yybegin(PSNART);
829             }
830           case 11: break;
831           case 5: 
832             { if (scilabLexer.getKeyword(start - yychar, false) == ScilabLexerConstants.STRING) {
833                                       savePos = start - yychar - scilabLexer.beginString - scilabLexer.start;
834                                       yybegin(SPEC);
835                                    } else {
836                                       yybegin(RL);
837                                    }
838             }
839           case 12: break;
840           case 6: 
841             { if (--savePos == 0) {
842                                       yybegin(RL);
843                                    }
844             }
845           case 13: break;
846           case 7: 
847             { char c = yycharat(yylength() - 2);
848                                    if (c == ')' || c == ']' || c == '}') {
849                                       transp = true;
850                                       return 0;
851                                    }
852             }
853           case 14: break;
854           default:
855             zzScanError(ZZ_NO_MATCH);
856         }
857       }
858     }
859   }
860
861
862 }