|
What this is
Other links
The source code/* * XModeHandler.java - XML handler for mode files * :tabSize=8:indentSize=8:noTabs=false: * :folding=explicit:collapseFolds=1: * * Copyright (C) 1999 mike dillon * Portions copyright (C) 2000, 2001 Slava Pestov * * 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 2 * of the License, or 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, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ package org.gjt.sp.jedit.syntax; //{{{ Imports import com.microstar.xml.*; import gnu.regexp.*; import java.io.*; import java.util.*; import org.gjt.sp.util.Log; //}}} /** * XML handler for mode definition files. */ public abstract class XModeHandler extends HandlerBase { //{{{ XModeHandler constructor public XModeHandler (String modeName) { this.modeName = modeName; marker = new TokenMarker(); marker.addRuleSet(new ParserRuleSet(modeName,"MAIN")); stateStack = new Stack(); // default value lastNoWordSep = "_"; } //}}} //{{{ resolveEntity() method public Object resolveEntity(String publicId, String systemId) { if("xmode.dtd".equals(systemId)) { // this will result in a slight speed up, since we // don't need to read the DTD anyway, as AElfred is // non-validating return new StringReader(""); /* try { return new BufferedReader(new InputStreamReader( getClass().getResourceAsStream( "/org/gjt/sp/jedit/syntax/xmode.dtd"))); } catch(Exception e) { error("dtd",e); } */ } return null; } //}}} //{{{ attribute() method public void attribute(String aname, String value, boolean isSpecified) { aname = (aname == null) ? null : aname.intern(); if (aname == "NAME") { propName = value; } else if (aname == "VALUE") { propValue = value; } else if (aname == "TYPE") { lastTokenID = Token.stringToToken(value); if(lastTokenID == -1) error("token-invalid",value); } else if (aname == "AT_LINE_START") { lastAtLineStart = (isSpecified) ? (value.equals("TRUE")) : false; } else if (aname == "AT_WHITESPACE_END") { lastAtWhitespaceEnd = (isSpecified) ? (value.equals("TRUE")) : false; } else if (aname == "AT_WORD_START") { lastAtWordStart = (isSpecified) ? (value.equals("TRUE")) : false; } else if (aname == "NO_LINE_BREAK") { lastNoLineBreak = (isSpecified) ? (value.equals("TRUE")) : false; } else if (aname == "NO_WORD_BREAK") { lastNoWordBreak = (isSpecified) ? (value.equals("TRUE")) : false; } else if (aname == "NO_ESCAPE") { lastNoEscape = (isSpecified) ? (value.equals("TRUE")) : false; } else if (aname == "EXCLUDE_MATCH") { lastExcludeMatch = (isSpecified) ? (value.equals("TRUE")) : false; } else if (aname == "IGNORE_CASE") { lastIgnoreCase = (isSpecified) ? (value.equals("TRUE")) : true; } else if (aname == "HIGHLIGHT_DIGITS") { lastHighlightDigits = (isSpecified) ? (value.equals("TRUE")) : false; } else if (aname == "DIGIT_RE") { lastDigitRE = value; } else if (aname == "NO_WORD_SEP") { if(isSpecified) lastNoWordSep = value; } else if (aname == "AT_CHAR") { try { if (isSpecified) termChar = Integer.parseInt(value); } catch (NumberFormatException e) { error("termchar-invalid",value); termChar = -1; } } else if (aname == "ESCAPE") { lastEscape = value; } else if (aname == "SET") { lastSetName = value; } else if (aname == "DELEGATE") { String delegateMode, delegateSetName; if(value != null) { int index = value.indexOf("::"); if(index != -1) { delegateMode = value.substring(0,index); delegateSetName = value.substring(index + 2); } else { delegateMode = modeName; delegateSetName = value; } TokenMarker delegateMarker = getTokenMarker(delegateMode); if(delegateMarker == null) error("delegate-invalid",value); else { lastDelegateSet = delegateMarker .getRuleSet(delegateSetName); if(delegateMarker == marker && lastDelegateSet == null) { // stupid hack to handle referencing // a rule set that is defined later! lastDelegateSet = new ParserRuleSet( delegateMode, delegateSetName); lastDelegateSet.setDefault(Token.INVALID); marker.addRuleSet(lastDelegateSet); } else if(lastDelegateSet == null) error("delegate-invalid",value); } } } else if (aname == "DEFAULT") { lastDefaultID = Token.stringToToken(value); if(lastDefaultID == -1) { error("token-invalid",value); lastDefaultID = Token.NULL; } } else if (aname == "HASH_CHAR") { if(value.length() != 1) { error("hash-char-invalid",value); lastDefaultID = Token.NULL; } else lastHashChar = value.charAt(0); } } //}}} //{{{ doctypeDecl() method public void doctypeDecl(String name, String publicId, String systemId) throws Exception { if ("MODE".equalsIgnoreCase(name)) return; error("doctype-invalid",name); } //}}} //{{{ charData() method public void charData(char[] c, int off, int len) { String tag = peekElement(); String text = new String(c, off, len); if (tag == "EOL_SPAN" || tag == "EOL_SPAN_REGEXP" || tag == "MARK_PREVIOUS" || tag == "MARK_FOLLOWING" || tag == "SEQ" || tag == "SEQ_REGEXP" || tag == "BEGIN" ) { lastStart = text; lastStartPosMatch = ((lastAtLineStart ? ParserRule.AT_LINE_START : 0) | (lastAtWhitespaceEnd ? ParserRule.AT_WHITESPACE_END : 0) | (lastAtWordStart ? ParserRule.AT_WORD_START : 0)); lastAtLineStart = false; lastAtWordStart = false; lastAtWhitespaceEnd = false; } else if (tag == "END") { lastEnd = text; lastEndPosMatch = ((lastAtLineStart ? ParserRule.AT_LINE_START : 0) | (lastAtWhitespaceEnd ? ParserRule.AT_WHITESPACE_END : 0) | (lastAtWordStart ? ParserRule.AT_WORD_START : 0)); lastAtLineStart = false; lastAtWordStart = false; lastAtWhitespaceEnd = false; } else { lastKeyword = text; } } //}}} //{{{ startElement() method public void startElement (String tag) { tag = pushElement(tag); if (tag == "WHITESPACE") { Log.log(Log.WARNING,this,modeName + ": WHITESPACE rule " + "no longer needed"); } else if (tag == "KEYWORDS") { keywords = new KeywordMap(rules.getIgnoreCase()); } else if (tag == "RULES") { if(lastSetName == null) lastSetName = "MAIN"; rules = marker.getRuleSet(lastSetName); if(rules == null) { rules = new ParserRuleSet(modeName,lastSetName); marker.addRuleSet(rules); } rules.setIgnoreCase(lastIgnoreCase); rules.setHighlightDigits(lastHighlightDigits); if(lastDigitRE != null) { try { rules.setDigitRegexp(new RE(lastDigitRE, lastIgnoreCase ? RE.REG_ICASE : 0, ParserRule.RE_SYNTAX_JEDIT)); } catch(REException e) { error("regexp",e); } } if(lastEscape != null) rules.setEscapeRule(ParserRule.createEscapeRule(lastEscape)); rules.setDefault(lastDefaultID); rules.setNoWordSep(lastNoWordSep); } } //}}} //{{{ endElement() method public void endElement (String name) { if (name == null) return; String tag = popElement(); if (name.equals(tag)) { //{{{ PROPERTY if (tag == "PROPERTY") { props.put(propName,propValue); } //}}} //{{{ PROPS else if (tag == "PROPS") { if(peekElement().equals("RULES")) rules.setProperties(props); else modeProps = props; props = new Hashtable(); } //}}} //{{{ RULES else if (tag == "RULES") { rules.setKeywords(keywords); keywords = null; lastSetName = null; lastEscape = null; lastIgnoreCase = true; lastHighlightDigits = false; lastDigitRE = null; lastDefaultID = Token.NULL; lastNoWordSep = "_"; rules = null; } //}}} //{{{ IMPORT else if (tag == "IMPORT") { rules.addRuleSet(lastDelegateSet); lastDelegateSet = null; } //}}} //{{{ TERMINATE else if (tag == "TERMINATE") { rules.setTerminateChar(termChar); termChar = -1; } //}}} //{{{ SEQ else if (tag == "SEQ") { if(lastStart == null) { error("empty-tag","SEQ"); return; } rules.addRule(ParserRule.createSequenceRule( lastStartPosMatch,lastStart,lastDelegateSet, lastTokenID)); reset(); } //}}} //{{{ SEQ_REGEXP else if (tag == "SEQ_REGEXP") { if(lastStart == null) { error("empty-tag","SEQ_REGEXP"); return; } try { rules.addRule(ParserRule.createRegexpSequenceRule( lastHashChar,lastStartPosMatch, lastStart,lastDelegateSet,lastTokenID, lastIgnoreCase)); } catch(REException re) { error("regexp",re); } reset(); } //}}} //{{{ SPAN else if (tag == "SPAN") { if(lastStart == null) { error("empty-tag","BEGIN"); return; } if(lastEnd == null) { error("empty-tag","END"); return; } rules.addRule(ParserRule .createSpanRule( lastStartPosMatch,lastStart, lastEndPosMatch,lastEnd, lastDelegateSet, lastTokenID,lastExcludeMatch, lastNoLineBreak, lastNoWordBreak, lastNoEscape)); reset(); } //}}} //{{{ SPAN_REGEXP else if (tag == "SPAN_REGEXP") { if(lastStart == null) { error("empty-tag","BEGIN"); return; } if(lastEnd == null) { error("empty-tag","END"); return; } try { rules.addRule(ParserRule .createRegexpSpanRule( lastHashChar, lastStartPosMatch,lastStart, lastEndPosMatch,lastEnd, lastDelegateSet, lastTokenID, lastExcludeMatch, lastNoLineBreak, lastNoWordBreak, lastIgnoreCase, lastNoEscape)); } catch(REException re) { error("regexp",re); } reset(); } //}}} //{{{ EOL_SPAN else if (tag == "EOL_SPAN") { if(lastStart == null) { error("empty-tag","EOL_SPAN"); return; } rules.addRule(ParserRule.createEOLSpanRule( lastStartPosMatch,lastStart, lastDelegateSet,lastTokenID, lastExcludeMatch)); reset(); } //}}} //{{{ EOL_SPAN_REGEXP else if (tag == "EOL_SPAN_REGEXP") { if(lastStart == null) { error("empty-tag","EOL_SPAN_REGEXP"); return; } try { rules.addRule(ParserRule.createRegexpEOLSpanRule( lastHashChar,lastStartPosMatch,lastStart, lastDelegateSet,lastTokenID, lastExcludeMatch,lastIgnoreCase)); } catch(REException re) { error("regexp",re); } reset(); } //}}} //{{{ MARK_FOLLOWING else if (tag == "MARK_FOLLOWING") { if(lastStart == null) { error("empty-tag","MARK_FOLLOWING"); return; } rules.addRule(ParserRule .createMarkFollowingRule( lastStartPosMatch,lastStart, lastTokenID,lastExcludeMatch)); reset(); } //}}} //{{{ MARK_PREVIOUS else if (tag == "MARK_PREVIOUS") { if(lastStart == null) { error("empty-tag","MARK_PREVIOUS"); return; } rules.addRule(ParserRule .createMarkPreviousRule( lastStartPosMatch,lastStart, lastTokenID,lastExcludeMatch)); reset(); } //}}} //{{{ Keywords else { byte token = Token.stringToToken(tag); if(token != -1) addKeyword(lastKeyword,token); } //}}} } else { // can't happen throw new InternalError(); } } //}}} //{{{ startDocument() method public void startDocument() { props = new Hashtable(); pushElement(null); } //}}} //{{{ endDocument() method public void endDocument() { ParserRuleSet[] rulesets = marker.getRuleSets(); for(int i = 0; i < rulesets.length; i++) { rulesets[i].resolveImports(); } } //}}} //{{{ getTokenMarker() method public TokenMarker getTokenMarker() { return marker; } //}}} //{{{ getModeProperties() method public Hashtable getModeProperties() { return modeProps; } //}}} //{{{ Protected members //{{{ error() method /** * Reports an error. * You must override this method so that the mode loader can do error * reporting. * @param msg The error type * @param subst A |
... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.