+++ /dev/null
-package net.mograsim.plugin.asm.editor;\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
-public class AsmLabelRule 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 AsmLabelRule(IToken token)\r
- {\r
- Assert.isNotNull(token);\r
- fToken = token;\r
- }\r
-\r
- @Override\r
- public IToken evaluate(ICharacterScanner scanner)\r
- {\r
- int c = scanner.read();\r
- int i = 1;\r
- if (Character.isJavaIdentifierStart(c))\r
- {\r
- do\r
- {\r
- c = scanner.read();\r
- i++;\r
- } while (Character.isJavaIdentifierPart(c));\r
- if (c == ':')\r
- return fToken;\r
- return abort(scanner, i);\r
- }\r
- scanner.unread();\r
- return Token.UNDEFINED;\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
-}
\ No newline at end of file
+++ /dev/null
-package net.mograsim.plugin.asm.editor;\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
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;\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
+public class AsmLabelRule 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 AsmLabelRule(IToken token)\r
+ {\r
+ Assert.isNotNull(token);\r
+ fToken = token;\r
+ }\r
+\r
+ @Override\r
+ public IToken evaluate(ICharacterScanner scanner)\r
+ {\r
+ int c = scanner.read();\r
+ int i = 1;\r
+ if (Character.isJavaIdentifierStart(c))\r
+ {\r
+ do\r
+ {\r
+ c = scanner.read();\r
+ i++;\r
+ } while (Character.isJavaIdentifierPart(c));\r
+ if (c == ':')\r
+ return fToken;\r
+ return abort(scanner, i);\r
+ }\r
+ scanner.unread();\r
+ return Token.UNDEFINED;\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
+}
\ No newline at end of file
--- /dev/null
+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
--- /dev/null
+package net.mograsim.plugin.asm.editor.rules;\r
+\r
+import java.util.Set;\r
+\r
+import org.eclipse.jface.text.rules.IToken;\r
+import org.eclipse.jface.text.rules.IWordDetector;\r
+import org.eclipse.jface.text.rules.WordRule;\r
+\r
+import net.mograsim.plugin.AsmOps;\r
+\r
+public class InstructionRule extends WordRule\r
+{\r
+ public InstructionRule(IToken defaultToken)\r
+ {\r
+ this(defaultToken, false);\r
+ }\r
+\r
+ public InstructionRule(IToken defaultToken, boolean ignoreCase)\r
+ {\r
+ super(new InstructionDetector(), defaultToken, ignoreCase);\r
+ AsmOps.addListener(this::update);\r
+ }\r
+\r
+ void update(Set<String> words)\r
+ {\r
+ fWords.clear();\r
+ words.forEach(s -> fWords.put(s, fDefaultToken));\r
+ }\r
+\r
+ static class InstructionDetector implements IWordDetector\r
+ {\r
+ @Override\r
+ public boolean isWordStart(char c)\r
+ {\r
+ return Character.isJavaIdentifierStart(c);\r
+ }\r
+\r
+ @Override\r
+ public boolean isWordPart(char c)\r
+ {\r
+ return Character.isJavaIdentifierPart(c);\r
+ }\r
+ }\r
+}\r