/* | |
* | |
* Copyright 2002-2004 The Ant-Contrib project | |
* | |
* Licensed under the Apache License, Version 2.0 (the "License"); | |
* you may not use this file except in compliance with the License. | |
* You may obtain a copy of the License at | |
* | |
* http://www.apache.org/licenses/LICENSE-2.0 | |
* | |
* Unless required by applicable law or agreed to in writing, software | |
* distributed under the License is distributed on an "AS IS" BASIS, | |
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
* See the License for the specific language governing permissions and | |
* limitations under the License. | |
*/ | |
package net.sf.antcontrib.cpptasks.parser; | |
import java.io.IOException; | |
import java.io.Reader; | |
import java.util.Vector; | |
/** | |
* A parser that extracts #include statements from a Reader. | |
* | |
* @author Adam Murdoch | |
* @author Curt Arnold | |
*/ | |
public final class CParser extends AbstractParser implements Parser { | |
private final Vector includes = new Vector(); | |
private AbstractParserState newLineState; | |
/** | |
* | |
* | |
*/ | |
public CParser() { | |
AbstractParserState quote = new FilenameState(this, new char[]{'"'}); | |
AbstractParserState bracket = new FilenameState(this, new char[]{'>'}); | |
AbstractParserState postE = new PostE(this, bracket, quote); | |
// | |
// nclude | |
// | |
AbstractParserState e = new LetterState(this, 'e', postE, null); | |
AbstractParserState d = new LetterState(this, 'd', e, null); | |
AbstractParserState u = new LetterState(this, 'u', d, null); | |
AbstractParserState l = new LetterState(this, 'l', u, null); | |
AbstractParserState c = new LetterState(this, 'c', l, null); | |
AbstractParserState n = new LetterState(this, 'n', c, null); | |
// | |
// mport is equivalent to nclude | |
// | |
AbstractParserState t = new LetterState(this, 't', postE, null); | |
AbstractParserState r = new LetterState(this, 'r', t, null); | |
AbstractParserState o = new LetterState(this, 'o', r, null); | |
AbstractParserState p = new LetterState(this, 'p', o, null); | |
AbstractParserState m = new LetterState(this, 'm', p, null); | |
// | |
// switch between | |
// | |
AbstractParserState n_m = new BranchState(this, new char[]{'n', 'm'}, | |
new AbstractParserState[]{n, m}, null); | |
AbstractParserState i = new WhitespaceOrLetterState(this, 'i', n_m); | |
newLineState = new LetterState(this, '#', i, null); | |
} | |
public void addFilename(String include) { | |
includes.addElement(include); | |
} | |
public String[] getIncludes() { | |
String[] retval = new String[includes.size()]; | |
includes.copyInto(retval); | |
return retval; | |
} | |
public AbstractParserState getNewLineState() { | |
return newLineState; | |
} | |
public void parse(Reader reader) throws IOException { | |
includes.setSize(0); | |
super.parse(reader); | |
} | |
} |