source: trunk/src/org/modelica/mdt/editor/ModelicaRuleScanner.java @ 9

Last change on this file since 9 was 9, checked in by remar, 19 years ago
  • Removed Peter Bunus code
  • Added code abducted from the PyDev? Eclipse plug-in
  • Made a correct list of Modelica keywords and types
File size: 5.3 KB
Line 
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 */
7package org.modelica.mdt.editor;
8
9import java.util.ArrayList;
10import java.util.List;
11
12import org.eclipse.jface.text.TextAttribute;
13import org.eclipse.jface.text.rules.EndOfLineRule;
14import org.eclipse.jface.text.rules.IRule;
15import org.eclipse.jface.text.rules.IToken;
16import org.eclipse.jface.text.rules.IWhitespaceDetector;
17import org.eclipse.jface.text.rules.IWordDetector;
18import org.eclipse.jface.text.rules.RuleBasedScanner;
19import org.eclipse.jface.text.rules.MultiLineRule;
20import org.eclipse.jface.text.rules.WhitespaceRule;
21import org.eclipse.jface.text.rules.WordRule;
22import org.eclipse.jface.text.rules.Token;
23import org.eclipse.swt.SWT;
24import org.eclipse.swt.graphics.Color;
25import org.eclipse.swt.graphics.RGB;
26import 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 */
35public 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}
Note: See TracBrowser for help on using the repository browser.