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