/* * #%~ * org.overture.ide.ui * %% * Copyright (C) 2008 - 2014 Overture * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * <http://www.gnu.org/licenses/gpl-3.0.html>. * #~% */ package org.overture.ide.ui.editor.syntax; import java.util.ArrayList; import java.util.List; import org.eclipse.jface.text.TextAttribute; import org.eclipse.jface.text.rules.IRule; import org.eclipse.jface.text.rules.IToken; import org.eclipse.jface.text.rules.MultiLineRule; import org.eclipse.jface.text.rules.RuleBasedScanner; import org.eclipse.jface.text.rules.SingleLineRule; import org.eclipse.jface.text.rules.Token; import org.eclipse.jface.text.rules.WhitespaceRule; import org.eclipse.jface.text.rules.WordRule; import org.eclipse.swt.SWT; public abstract class VdmCodeScanner extends RuleBasedScanner { private IVdmKeywords fgKeywords = getKeywords(); public static final String[] latexOperators = { "\\begin{vdm_al}", "\\end{vdm_al}" }; public VdmCodeScanner(VdmColorProvider provider) { IToken keyword = new Token(new TextAttribute(provider.getColor(VdmColorProvider.KEYWORD), null, SWT.BOLD)); IToken type = new Token(new TextAttribute(provider.getColor(VdmColorProvider.TYPE), null, SWT.BOLD)); final IToken stringBold = new Token(new TextAttribute(provider.getColor(VdmColorProvider.DEFAULT), null, SWT.BOLD | SWT.ITALIC)); IToken comment = new Token(new TextAttribute(provider.getColor(VdmColorProvider.SINGLE_LINE_COMMENT))); IToken latex = new Token(new TextAttribute(provider.getColor(VdmColorProvider.LATEX))); final IToken other = new Token(new TextAttribute(provider.getColor(VdmColorProvider.DEFAULT))); List<IRule> rules = new ArrayList<IRule>(); // Add generic whitespace rule. rules.add(new WhitespaceRule(new VdmWhitespaceDetector())); // TODO: this is a hack to get latex related stuff commented //rules.add(new SingleLineRule("\\begin{vdm_al", "}", comment)); //rules.add(new SingleLineRule("\\end{vdm_al", "}", comment)); rules.add(new MultiLineRule("\\end{vdm_al}","\\begin{vdm_al}", latex,(char) 0,true)); rules.add(new MultiLineRule("\\section{","\\begin{vdm_al}", latex,(char) 0,false)); // rules.add(new SingleLineRule("\\end{vdm_al", "}", comment,)); if (fgKeywords.supportsQuoteTypes()) { rules.add(new QuoteRule(type)); } if (fgKeywords.supportsTypleSelect()) { rules.add(new TupleSelectRule(stringBold)); } for (String prefix : fgKeywords.getUnderscorePrefixKeywords()) { rules.add(new PrefixedUnderscoreRule(prefix, keyword)); } for (String prefix : fgKeywords.getUnderscorePrefixReservedWords()) { rules.add(new PrefixedUnderscoreRule(prefix, stringBold)); } MultipleWordsWordRule multipleWordRule = new MultipleWordsWordRule(new VdmWordDetector(), Token.UNDEFINED, false); for (int i = 0; i < fgKeywords.getMultipleKeywords().length; i++) { multipleWordRule.addWord(fgKeywords.getMultipleKeywords()[i], keyword); } rules.add(multipleWordRule); // Add word rule for keywords. WordRule wordRule = new WordRule(new VdmWordDetector(), other);// Not sure why Token.UNDEFINED doesn't // work but // it makes S'end' colored. for (int i = 0; i < fgKeywords.getAllSingleWordKeywords().length; i++) { wordRule.addWord(fgKeywords.getAllSingleWordKeywords()[i], keyword); } rules.add(wordRule); IRule[] result = new IRule[rules.size()]; rules.toArray(result); setRules(result); // sets the default style. If styledText.getStyleRangeAtOffset is called on the editor this default style is // returned instead of null setDefaultReturnToken(other); } // /** // * overrides super method to debug rule scanners // */ // public IToken nextToken() // { // // fTokenOffset = fOffset; // fColumn = UNDEFINED; // // if (fRules != null) // { // for (int i = 0; i < fRules.length; i++) // { // int o = fOffset; // // IToken token = (fRules[i].evaluate(this)); // if (o != fOffset) // { // try // { // // String text = fDocument.get(o, fOffset - o); // System.out.println("Offset changed from: " +o+" to: "+ fOffset // + ", scanned '" + text + "' with rule " // + fRules[i].getClass().getSimpleName() // + " is token undefined: "+( token.isUndefined()?"yes":"no")); // } catch (BadLocationException e) // { // e.printStackTrace(); // } // } // // if (!token.isUndefined()) // return token; // } // } // // if (read() == EOF) // return Token.EOF; // return fDefaultReturnToken; // } protected abstract IVdmKeywords getKeywords(); }