+++ /dev/null
-package net.mograsim.plugin.asm.editor;
-
-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;
-
-public class AsmLabelRule 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 AsmLabelRule(IToken token)
- {
- Assert.isNotNull(token);
- fToken = token;
- }
-
- @Override
- public IToken evaluate(ICharacterScanner scanner)
- {
- int c = scanner.read();
- int i = 1;
- if (Character.isJavaIdentifierStart(c))
- {
- do
- {
- c = scanner.read();
- i++;
- } while (Character.isJavaIdentifierPart(c));
- if (c == ':')
- return fToken;
- return abort(scanner, i);
- }
- scanner.unread();
- return Token.UNDEFINED;
- }
-
- private static IToken abort(ICharacterScanner scanner, int i)
- {
- for (int j = 0; j < i; j++)
- scanner.unread();
- return Token.UNDEFINED;
- }
-}
\ No newline at end of file
+++ /dev/null
-package net.mograsim.plugin.asm.editor;
-
-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;
- }
-
-}
package net.mograsim.plugin.asm.editor;
-import java.util.Set;
-
import org.eclipse.jface.resource.ColorRegistry;
import org.eclipse.jface.resource.FontRegistry;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.rules.DefaultDamagerRepairer;
import org.eclipse.jface.text.rules.EndOfLineRule;
import org.eclipse.jface.text.rules.IRule;
-import org.eclipse.jface.text.rules.IWordDetector;
import org.eclipse.jface.text.rules.RuleBasedScanner;
import org.eclipse.jface.text.rules.Token;
-import org.eclipse.jface.text.rules.WordRule;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.themes.ITheme;
-import net.mograsim.plugin.AsmOps;
+import net.mograsim.plugin.asm.editor.rules.AsmLabelRule;
+import net.mograsim.plugin.asm.editor.rules.AsmNumberRule;
+import net.mograsim.plugin.asm.editor.rules.InstructionRule;
public class AsmPresentationReconciler extends PresentationReconciler
{
rules = new IRule[4];
rules[0] = new EndOfLineRule(";", comment);
rules[1] = new AsmLabelRule(label);
- WordRule ops = new WordRule(new IWordDetector()
- {
-
- @Override
- public boolean isWordStart(char c)
- {
- return Character.isJavaIdentifierStart(c);
- }
-
- @Override
- public boolean isWordPart(char c)
- {
- return Character.isJavaIdentifierPart(c);
- }
- }, std, true)
- {
- {
- AsmOps.addListener(this::update);
- }
-
- void update(Set<String> words)
- {
- fWords.clear();
- words.forEach(s -> fWords.put(s, op));
- }
- };
- rules[2] = ops;
+ rules[2] = new InstructionRule(op, true);
rules[3] = new AsmNumberRule(number);
scanner.setRules(rules);
--- /dev/null
+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;
+
+public class AsmLabelRule 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 AsmLabelRule(IToken token)
+ {
+ Assert.isNotNull(token);
+ fToken = token;
+ }
+
+ @Override
+ public IToken evaluate(ICharacterScanner scanner)
+ {
+ int c = scanner.read();
+ int i = 1;
+ if (Character.isJavaIdentifierStart(c))
+ {
+ do
+ {
+ c = scanner.read();
+ i++;
+ } while (Character.isJavaIdentifierPart(c));
+ if (c == ':')
+ return fToken;
+ return abort(scanner, i);
+ }
+ scanner.unread();
+ return Token.UNDEFINED;
+ }
+
+ private static IToken abort(ICharacterScanner scanner, int i)
+ {
+ for (int j = 0; j < i; j++)
+ scanner.unread();
+ return Token.UNDEFINED;
+ }
+}
\ No newline at end of file
--- /dev/null
+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;
+ }
+
+}
--- /dev/null
+package net.mograsim.plugin.asm.editor.rules;
+
+import java.util.Set;
+
+import org.eclipse.jface.text.rules.IToken;
+import org.eclipse.jface.text.rules.IWordDetector;
+import org.eclipse.jface.text.rules.WordRule;
+
+import net.mograsim.plugin.AsmOps;
+
+public class InstructionRule extends WordRule
+{
+ public InstructionRule(IToken defaultToken)
+ {
+ this(defaultToken, false);
+ }
+
+ public InstructionRule(IToken defaultToken, boolean ignoreCase)
+ {
+ super(new InstructionDetector(), defaultToken, ignoreCase);
+ AsmOps.addListener(this::update);
+ }
+
+ void update(Set<String> words)
+ {
+ fWords.clear();
+ words.forEach(s -> fWords.put(s, fDefaultToken));
+ }
+
+ static class InstructionDetector implements IWordDetector
+ {
+ @Override
+ public boolean isWordStart(char c)
+ {
+ return Character.isJavaIdentifierStart(c);
+ }
+
+ @Override
+ public boolean isWordPart(char c)
+ {
+ return Character.isJavaIdentifierPart(c);
+ }
+ }
+}