1 | /* |
---|
2 | * Created on Jan 27, 2005 |
---|
3 | * |
---|
4 | * TODO To change the template for this generated file go to |
---|
5 | * Window - Preferences - Java - Code Style - Code Templates |
---|
6 | */ |
---|
7 | package org.modelica.mdt.editor; |
---|
8 | |
---|
9 | import java.util.ArrayList; |
---|
10 | import java.util.List; |
---|
11 | |
---|
12 | import org.eclipse.jface.text.TextAttribute; |
---|
13 | import org.eclipse.jface.text.rules.EndOfLineRule; |
---|
14 | import org.eclipse.jface.text.rules.IRule; |
---|
15 | import org.eclipse.jface.text.rules.IToken; |
---|
16 | import org.eclipse.jface.text.rules.IWhitespaceDetector; |
---|
17 | import org.eclipse.jface.text.rules.IWordDetector; |
---|
18 | import org.eclipse.jface.text.rules.RuleBasedScanner; |
---|
19 | import org.eclipse.jface.text.rules.MultiLineRule; |
---|
20 | import org.eclipse.jface.text.rules.WhitespaceRule; |
---|
21 | import org.eclipse.jface.text.rules.WordRule; |
---|
22 | import org.eclipse.jface.text.rules.Token; |
---|
23 | import org.eclipse.swt.SWT; |
---|
24 | import org.eclipse.swt.graphics.Color; |
---|
25 | import org.eclipse.swt.graphics.RGB; |
---|
26 | import org.eclipse.swt.widgets.Display; |
---|
27 | |
---|
28 | /** |
---|
29 | * @author Peter Bunus |
---|
30 | * @author Andreas Remar, x05andre@ida.liu.se |
---|
31 | * |
---|
32 | * 2005-09-14, Andreas Remar |
---|
33 | * Recoded from scratch, most code abducted from PyDev |
---|
34 | */ |
---|
35 | public class ModelicaRuleScanner extends RuleBasedScanner |
---|
36 | implements ModelicaSyntax { |
---|
37 | |
---|
38 | private static Color COMMENT_COLOR = new Color(Display.getCurrent(), new RGB(0, 139, 0)); |
---|
39 | private static Color KEYWORD_COLOR = new Color(Display.getCurrent(), new RGB(139, 0, 0)); |
---|
40 | private static Color CODE_COLOR = new Color(Display.getCurrent(), new RGB(0, 0, 0)); |
---|
41 | private static Color TYPE_COLOR = new Color(Display.getCurrent(), new RGB(0, 0, 139)); |
---|
42 | private static Color NUMBER_COLOR = new Color(Display.getCurrent(), new RGB(139, 0, 139)); |
---|
43 | private static Color ERROR_COLOR = new Color(Display.getCurrent(), new RGB(255, 0, 0)); |
---|
44 | |
---|
45 | /** |
---|
46 | * Whitespace detector |
---|
47 | */ |
---|
48 | static private class WhiteSpace implements IWhitespaceDetector { |
---|
49 | public boolean isWhitespace(char c) {return Character.isWhitespace(c);} |
---|
50 | } |
---|
51 | |
---|
52 | /** |
---|
53 | * Modelica keyword detector |
---|
54 | */ |
---|
55 | static private class ModelicaKeywordDetector implements IWordDetector { |
---|
56 | // keywords list has to be alphabetized for this to work properly |
---|
57 | static public String[] keywords = { |
---|
58 | "algorithm","and","annotation","block","break", |
---|
59 | "class","connector","constant", |
---|
60 | "der","discrete", |
---|
61 | "each","elseif","elsewhen","encapsulated","end", |
---|
62 | "enumeration","equation", |
---|
63 | "extends","external","false","final", |
---|
64 | "flow","for","function", |
---|
65 | "if","import","in","initial","inner","input", |
---|
66 | "loop","model","not","or","outer", |
---|
67 | "output","package","parameter", |
---|
68 | "partial","protected","public","record", |
---|
69 | "redeclare","replacable","return", |
---|
70 | "then","time","true","type","when","while","within" |
---|
71 | }; |
---|
72 | |
---|
73 | public ModelicaKeywordDetector() { |
---|
74 | } |
---|
75 | |
---|
76 | public boolean isWordStart(char c) { |
---|
77 | return Character.isJavaIdentifierStart(c); |
---|
78 | } |
---|
79 | |
---|
80 | public boolean isWordPart(char c) { |
---|
81 | return Character.isJavaIdentifierPart(c); |
---|
82 | } |
---|
83 | } |
---|
84 | |
---|
85 | /** |
---|
86 | * Modelica type detector |
---|
87 | */ |
---|
88 | static private class ModelicaTypeDetector implements IWordDetector { |
---|
89 | // keywords list has to be alphabetized for this to work properly |
---|
90 | static public String[] keywords = { |
---|
91 | "Boolean","Integer","Real","String" |
---|
92 | }; |
---|
93 | |
---|
94 | public ModelicaTypeDetector() { |
---|
95 | } |
---|
96 | |
---|
97 | public boolean isWordStart(char c) { |
---|
98 | return Character.isJavaIdentifierStart(c); |
---|
99 | } |
---|
100 | |
---|
101 | public boolean isWordPart(char c) { |
---|
102 | return Character.isJavaIdentifierPart(c); |
---|
103 | } |
---|
104 | } |
---|
105 | |
---|
106 | static public class NumberDetector implements IWordDetector{ |
---|
107 | /** |
---|
108 | * @see org.eclipse.jface.text.rules.IWordDetector#isWordStart(char) |
---|
109 | */ |
---|
110 | public boolean isWordStart(char c) { |
---|
111 | return Character.isDigit(c); |
---|
112 | } |
---|
113 | |
---|
114 | /** |
---|
115 | * @see org.eclipse.jface.text.rules.IWordDetector#isWordPart(char) |
---|
116 | */ |
---|
117 | public boolean isWordPart(char c) { |
---|
118 | return Character.isDigit(c) || c == 'e' || c == '.'; |
---|
119 | } |
---|
120 | } |
---|
121 | |
---|
122 | public ModelicaRuleScanner() { |
---|
123 | super(); |
---|
124 | |
---|
125 | setupRules(); |
---|
126 | } |
---|
127 | |
---|
128 | private void setupRules() |
---|
129 | { |
---|
130 | IToken commentToken = new Token(new TextAttribute(COMMENT_COLOR,null,SWT.BOLD)); |
---|
131 | IToken keywordToken = new Token(new TextAttribute(KEYWORD_COLOR,null,SWT.BOLD)); |
---|
132 | IToken defaultToken = new Token(new TextAttribute(CODE_COLOR,null,SWT.BOLD)); |
---|
133 | IToken typeToken = new Token(new TextAttribute(TYPE_COLOR,null,SWT.BOLD)); |
---|
134 | IToken numberToken = new Token(new TextAttribute(NUMBER_COLOR,null,SWT.BOLD)); |
---|
135 | IToken errorToken = new Token(new TextAttribute(ERROR_COLOR,null,SWT.BOLD)); |
---|
136 | |
---|
137 | setDefaultReturnToken(errorToken); |
---|
138 | List rules = new ArrayList(); |
---|
139 | |
---|
140 | rules.add(new WhitespaceRule(new WhiteSpace())); |
---|
141 | |
---|
142 | WordRule wordRule = new WordRule(new ModelicaKeywordDetector(), defaultToken); |
---|
143 | for (int i=0; i<ModelicaKeywordDetector.keywords.length;i++) { |
---|
144 | wordRule.addWord(ModelicaKeywordDetector.keywords[i], keywordToken); |
---|
145 | } |
---|
146 | for (int i=0; i<ModelicaTypeDetector.keywords.length;i++) { |
---|
147 | wordRule.addWord(ModelicaTypeDetector.keywords[i], typeToken); |
---|
148 | } |
---|
149 | rules.add(wordRule); |
---|
150 | |
---|
151 | rules.add(new MultiLineRule( "\"", "\"", commentToken,'\\')); |
---|
152 | rules.add(new EndOfLineRule("//", commentToken,'\\')); |
---|
153 | rules.add(new MultiLineRule("/*", "*/", commentToken, (char) 0, true)); |
---|
154 | rules.add(new WordRule(new NumberDetector(), numberToken)); |
---|
155 | |
---|
156 | IRule[] result = new IRule[rules.size()]; |
---|
157 | rules.toArray(result); |
---|
158 | setRules(result); |
---|
159 | } |
---|
160 | } |
---|