+package net.mograsim.plugin.asm.editor.rules;\r
+\r
+import org.eclipse.core.runtime.Assert;\r
+import org.eclipse.jface.text.rules.ICharacterScanner;\r
+import org.eclipse.jface.text.rules.IRule;\r
+import org.eclipse.jface.text.rules.IToken;\r
+import org.eclipse.jface.text.rules.Token;\r
+\r
+import net.mograsim.plugin.asm.AsmNumberUtil;\r
+\r
+public class AsmNumberRule implements IRule\r
+{\r
+\r
+ /** The token to be returned when this rule is successful */\r
+ protected IToken fToken;\r
+\r
+ /**\r
+ * Creates a rule which will return the specified token when a numerical sequence is detected.\r
+ *\r
+ * @param token the token to be returned\r
+ */\r
+ public AsmNumberRule(IToken token)\r
+ {\r
+ Assert.isNotNull(token);\r
+ fToken = token;\r
+ }\r
+\r
+ @Override\r
+ public IToken evaluate(ICharacterScanner scanner)\r
+ {\r
+ int i = 1;\r
+ int c = scanner.read();\r
+ if (!AsmNumberUtil.isStart(c))\r
+ return abort(scanner, i);\r
+ StringBuilder sb = new StringBuilder();\r
+ sb.appendCodePoint(c);\r
+ while (true)\r
+ {\r
+ c = scanner.read();\r
+ i++;\r
+ if (AsmNumberUtil.isPart(c))\r
+ sb.appendCodePoint(c);\r
+ else\r
+ break;\r
+ }\r
+ if (!AsmNumberUtil.isNumber(sb))\r
+ return abort(scanner, i);\r
+ scanner.unread();\r
+ return fToken;\r
+ }\r
+\r
+ private static IToken abort(ICharacterScanner scanner, int i)\r
+ {\r
+ for (int j = 0; j < i; j++)\r
+ scanner.unread();\r
+ return Token.UNDEFINED;\r
+ }\r
+\r
+}\r