Improved package structure
[Mograsim.git] / net.mograsim.plugin.core / src / net / mograsim / plugin / asm / editor / rules / AsmNumberRule.java
1 package net.mograsim.plugin.asm.editor.rules;\r
2 \r
3 import org.eclipse.core.runtime.Assert;\r
4 import org.eclipse.jface.text.rules.ICharacterScanner;\r
5 import org.eclipse.jface.text.rules.IRule;\r
6 import org.eclipse.jface.text.rules.IToken;\r
7 import org.eclipse.jface.text.rules.Token;\r
8 \r
9 import net.mograsim.plugin.asm.AsmNumberUtil;\r
10 \r
11 public class AsmNumberRule implements IRule\r
12 {\r
13 \r
14         /** The token to be returned when this rule is successful */\r
15         protected IToken fToken;\r
16 \r
17         /**\r
18          * Creates a rule which will return the specified token when a numerical sequence is detected.\r
19          *\r
20          * @param token the token to be returned\r
21          */\r
22         public AsmNumberRule(IToken token)\r
23         {\r
24                 Assert.isNotNull(token);\r
25                 fToken = token;\r
26         }\r
27 \r
28         @Override\r
29         public IToken evaluate(ICharacterScanner scanner)\r
30         {\r
31                 int i = 1;\r
32                 int c = scanner.read();\r
33                 if (!AsmNumberUtil.isStart(c))\r
34                         return abort(scanner, i);\r
35                 StringBuilder sb = new StringBuilder();\r
36                 sb.appendCodePoint(c);\r
37                 while (true)\r
38                 {\r
39                         c = scanner.read();\r
40                         i++;\r
41                         if (AsmNumberUtil.isPart(c))\r
42                                 sb.appendCodePoint(c);\r
43                         else\r
44                                 break;\r
45                 }\r
46                 if (!AsmNumberUtil.isNumber(sb))\r
47                         return abort(scanner, i);\r
48                 scanner.unread();\r
49                 return fToken;\r
50         }\r
51 \r
52         private static IToken abort(ICharacterScanner scanner, int i)\r
53         {\r
54                 for (int j = 0; j < i; j++)\r
55                         scanner.unread();\r
56                 return Token.UNDEFINED;\r
57         }\r
58 \r
59 }\r