001: /*
002: * Processor.java February 2006
003: *
004: * Copyright (C) 2006, Niall Gallagher <niallg@users.sf.net>
005: *
006: * This library is free software; you can redistribute it and/or
007: * modify it under the terms of the GNU Lesser General Public
008: * License as published by the Free Software Foundation.
009: *
010: * This library is distributed in the hope that it will be useful,
011: * but WITHOUT ANY WARRANTY; without even the implied warranty of
012: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
013: * GNU Lesser General Public License for more details.
014: *
015: * You should have received a copy of the GNU Lesser General
016: * Public License along with this library; if not, write to the
017: * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
018: * Boston, MA 02111-1307 USA
019: */
020:
021: package simple.page.translate;
022:
023: import java.io.Writer;
024:
025: /**
026: * The <code>Processor</code> object is used to process a stream of
027: * characters from a JSP source file. This performs the building
028: * process for the translator in a simple stream based manner, such
029: * a process allows translators to cascade, such that multiple
030: * syntaxes can be present in a single JSP source file.
031: *
032: * @author Niall Gallagher
033: *
034: * @see simple.page.translate.Translator
035: */
036: final class Processor extends Writer {
037:
038: /**
039: * This breaks up the document into digestable parsable tokens.
040: */
041: private Tokenizer lexer;
042:
043: /**
044: * This parses the tokens emitted from the lexical analysis.
045: */
046: private Parser parser;
047:
048: /**
049: * Constructor for the <code>Processor</code> object. This takes
050: * the builder used to construct the document definition and the
051: * document definition that accumulates the code segments.
052: *
053: * @param source this is the document definition to populate
054: * @param builder this is the builder used to build the source
055: */
056: public Processor(Definition source, Builder builder) {
057: this .parser = new Parser(source, builder);
058: this .lexer = new Tokenizer(parser);
059: this .prepare(parser);
060: }
061:
062: /**
063: * Each parses can dynamically specify its own token types. This
064: * enables it to digest the tokens emitted from lexical analysis.
065: * Once this has been invoked the lexer is ready to receve the
066: * soure for the JSP file.
067: *
068: * @param parser this is the parser used to digest the tokens
069: */
070: public void prepare(Parser parser) {
071: parser.begin(lexer);
072: }
073:
074: /**
075: * This is used to write a character buffer to the lexer. The data
076: * written to the lexer is analysed and used to emit tokens to
077: * the parse. The will delegate to the <code>append</code> method.
078: *
079: * @param text this is some source text from the JSP file
080: */
081: public void write(char[] text) {
082: lexer.scan(text);
083: }
084:
085: /**
086: * This is used to write a character buffer to the lexer. The data
087: * written to the lexer is analysed and used to emit tokens to
088: * the parse. The will delegate to the <code>append</code> method.
089: *
090: * @param text this is some source text from the JSP file
091: * @param off this is the offset within the text to read from
092: * @param len this is the number of characters to consider
093: */
094: public void write(char[] text, int off, int len) {
095: lexer.scan(text, off, len);
096: }
097:
098: /**
099: * This method is used to flush any buffered data to the lexer. The
100: * current implementation of this method exists to fulfil the
101: * super class abstract method, as characters are not buffered here.
102: */
103: public void flush() {
104: }
105:
106: /**
107: * Once the JSP source has been written the processor must be closed
108: * so that the lexer can perform a final emit of tokens to the
109: * parse. If the close method is not invoked some JSP source may not
110: * be flushed to the lexer, and thus may result in an incomplete JSP.
111: */
112: public void close() {
113: parser.finish();
114: }
115: }
|