Improved package structure
[Mograsim.git] / net.mograsim.plugin.core / src / net / mograsim / plugin / asm / editor / rules / AsmNumberRule.java
diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/rules/AsmNumberRule.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/rules/AsmNumberRule.java
new file mode 100644 (file)
index 0000000..728030d
--- /dev/null
@@ -0,0 +1,59 @@
+package net.mograsim.plugin.asm.editor.rules;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.jface.text.rules.ICharacterScanner;
+import org.eclipse.jface.text.rules.IRule;
+import org.eclipse.jface.text.rules.IToken;
+import org.eclipse.jface.text.rules.Token;
+
+import net.mograsim.plugin.asm.AsmNumberUtil;
+
+public class AsmNumberRule implements IRule
+{
+
+       /** The token to be returned when this rule is successful */
+       protected IToken fToken;
+
+       /**
+        * Creates a rule which will return the specified token when a numerical sequence is detected.
+        *
+        * @param token the token to be returned
+        */
+       public AsmNumberRule(IToken token)
+       {
+               Assert.isNotNull(token);
+               fToken = token;
+       }
+
+       @Override
+       public IToken evaluate(ICharacterScanner scanner)
+       {
+               int i = 1;
+               int c = scanner.read();
+               if (!AsmNumberUtil.isStart(c))
+                       return abort(scanner, i);
+               StringBuilder sb = new StringBuilder();
+               sb.appendCodePoint(c);
+               while (true)
+               {
+                       c = scanner.read();
+                       i++;
+                       if (AsmNumberUtil.isPart(c))
+                               sb.appendCodePoint(c);
+                       else
+                               break;
+               }
+               if (!AsmNumberUtil.isNumber(sb))
+                       return abort(scanner, i);
+               scanner.unread();
+               return fToken;
+       }
+
+       private static IToken abort(ICharacterScanner scanner, int i)
+       {
+               for (int j = 0; j < i; j++)
+                       scanner.unread();
+               return Token.UNDEFINED;
+       }
+
+}