All Downloads are FREE. Search and download functionalities are using the official Maven repository.

java_cup.runtime.ComplexSymbolFactory Maven / Gradle / Ivy

Go to download

A fork of the Java Cup parser generator with some bug fixes and enhancements. (Forked at version 11b)

The newest version!
package java_cup.runtime;

import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamWriter;

/**
 * Default Implementation for SymbolFactory, creates
 * plain old Symbols
 *
 * @author Michael Petter
 * @version last updated 27-03-2006
 */

/* *************************************************
  class DefaultSymbolFactory
  interface for creating new symbols  
 ***************************************************/
public class ComplexSymbolFactory implements SymbolFactory {
    public static class Location {
        private String unit = "unknown";
        private int line, column, offset = -1;

        /**
         * Copy Constructor for other ComplexSymbolFactory based Locations
         *
         */
        public Location(Location other) {
            this(other.unit, other.line, other.column, other.offset);
        }

        /**
         * Location Object
         * stores compilation unit, line, column and offset to the file start
         *
         * @param unit   compilation unit, e.g. file name
         * @param line   line number
         * @param column column number
         * @param offset offset from file start
         */
        public Location(String unit, int line, int column, int offset) {
            this(unit, line, column);
            this.offset = offset;
        }

        /**
         * Location Object
         * stores compilation unit, line and column
         *
         * @param unit   compilation unit, e.g. file name
         * @param line   line number
         * @param column column number
         */
        public Location(String unit, int line, int column) {
            this.unit = unit;
            this.line = line;
            this.column = column;
        }

        /**
         * Location Object
         * stores line, column and offset to the file start
         *
         * @param line   line number
         * @param column column number
         * @param offset offset from file start
         */
        public Location(int line, int column, int offset) {
            this(line, column);
            this.offset = offset;
        }

        /**
         * Location Object
         * stores line and column
         *
         * @param line   line number
         * @param column column number
         */
        public Location(int line, int column) {
            this.line = line;
            this.column = column;
        }

        /**
         * getColumn
         *
         * @return column if known, else -1
         */
        public int getColumn() {
            return column;
        }

        /**
         * getLine
         *
         * @return line if known, else -1
         */
        public int getLine() {
            return line;
        }

        /**
         * move moves this Location by the given differences.
         *
         */
        public void move(int linediff, int coldiff, int offsetdiff) {
            if (this.line >= 0)
                this.line += linediff;
            if (this.column >= 0)
                this.column += coldiff;
            if (this.offset >= 0)
                this.offset += offsetdiff;
        }

        /**
         * Cloning factory method
         *
         * @return new cloned Location
         */
        public static Location clone(Location other) {
            return new Location(other);
        }

        /**
         * getUnit
         *
         * @return compilation unit if known, else 'unknown'
         */
        public String getUnit() {
            return unit;
        }

        /**
         * getLine
         *
         * @return line if known, else -1
         */
        public String toString() {
            return getUnit() + ":" + getLine() + "/" + getColumn() + "(" + offset + ")";
        }

        /**
         * Writes the location information directly into an XML document
         *
         * @param writer      the destination XML Document
         * @param orientation adds details about the orientation of this location as an attribute; often used with the strings "left" or "right"
         * @throws XMLStreamException
         */
        public void toXML(XMLStreamWriter writer, String orientation) throws XMLStreamException {
            writer.writeStartElement("location");
            writer.writeAttribute("compilationunit", unit);
            writer.writeAttribute("orientation", orientation);
            writer.writeAttribute("linenumber", line + "");
            writer.writeAttribute("columnnumber", column + "");
            writer.writeAttribute("offset", offset + "");
            writer.writeEndElement();
        }

        /**
         * getOffset
         *
         * @return offset to start if known, else -1
         */
        public int getOffset() {
            return offset;
        }
    }

    /**
     * ComplexSymbol with detailed Location Informations and a Name
     */
    public static class ComplexSymbol extends Symbol {
        protected String name;
        public Location xleft, xright;

        public ComplexSymbol(String name, int id) {
            super(id);
            this.name = name;
        }

        public ComplexSymbol(String name, int id, Object value) {
            super(id, value);
            this.name = name;
        }

        public String toString() {
            if (xleft == null || xright == null) return "Symbol: " + name;
            return "Symbol: " + name + " (" + xleft + " - " + xright + ")";
        }

        public String getName() {
            return name;
        }

        public ComplexSymbol(String name, int id, int state) {
            super(id, state);
            this.name = name;
        }

        public ComplexSymbol(String name, int id, Symbol left, Symbol right) {
            super(id, left, right);
            this.name = name;
            if (left != null) this.xleft = ((ComplexSymbol) left).xleft;
            if (right != null) this.xright = ((ComplexSymbol) right).xright;
        }

        public ComplexSymbol(String name, int id, Location left, Location right) {
            super(id, left.offset, right.offset);
            this.name = name;
            this.xleft = left;
            this.xright = right;
        }

        public ComplexSymbol(String name, int id, Symbol left, Symbol right, Object value) {
            super(id, left.left, right.right, value);
            this.name = name;
            if (left != null) this.xleft = ((ComplexSymbol) left).xleft;
            if (right != null) this.xright = ((ComplexSymbol) right).xright;
        }

        public ComplexSymbol(String name, int id, Symbol left, Object value) {
            super(id, left.right, left.right, value);
            this.name = name;
            if (left != null) {
                this.xleft = ((ComplexSymbol) left).xright;
                this.xright = ((ComplexSymbol) left).xright;
            }
        }

        public ComplexSymbol(String name, int id, Location left, Location right, Object value) {
            super(id, left.offset, right.offset, value);
            this.name = name;
            this.xleft = left;
            this.xright = right;
        }

        public Location getLeft() {
            return xleft;
        }

        public Location getRight() {
            return xright;
        }
    }


    // Factory methods

    /**
     * newSymbol
     * creates a complex symbol with Location objects for left and right boundaries;
     * this is used for terminals with values!
     */
    public Symbol newSymbol(String name, int id, Location left, Location right, Object value) {
        return new ComplexSymbol(name, id, left, right, value);
    }

    /**
     * newSymbol
     * creates a complex symbol with Location objects for left and right boundaries;
     * this is used for terminals without values!
     */
    public Symbol newSymbol(String name, int id, Location left, Location right) {
        return new ComplexSymbol(name, id, left, right);
    }

    public Symbol newSymbol(String name, int id, Symbol left, Object value) {
        return new ComplexSymbol(name, id, left, value);
    }

    public Symbol newSymbol(String name, int id, Symbol left, Symbol right, Object value) {
        return new ComplexSymbol(name, id, left, right, value);
    }

    public Symbol newSymbol(String name, int id, Symbol left, Symbol right) {
        return new ComplexSymbol(name, id, left, right);
    }

    public Symbol newSymbol(String name, int id) {
        return new ComplexSymbol(name, id);
    }

    public Symbol newSymbol(String name, int id, Object value) {
        return new ComplexSymbol(name, id, value);
    }

    public Symbol startSymbol(String name, int id, int state) {
        return new ComplexSymbol(name, id, state);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy