Ticket #11634: 0008-Moved-global-SOM-management-out-of-NavigationCompone.patch

File 0008-Moved-global-SOM-management-out-of-NavigationCompone.patch, 187.9 KB (added by michael2402, 9 years ago)
  • src/org/openstreetmap/josm/actions/mapmode/ParallelWayAction.java

    From 29baba3b6eb9b323c9adfac05ce3d5c9dd52ff23 Mon Sep 17 00:00:00 2001
    From: Michael Zangl <michael.zangl@student.kit.edu>
    Date: Wed, 1 Jul 2015 15:10:08 +0200
    Subject: [PATCH 8/8] Moved global SOM management out of NavigationComponent to
     SystemOfMeasurement class
    
    ---
     .../josm/actions/mapmode/ParallelWayAction.java    |    3 +-
     .../josm/data/SystemOfMeasurement.java             |   74 +
     src/org/openstreetmap/josm/gui/MapStatus.java      |    8 +-
     .../josm/gui/NavigatableComponent.java             |   79 +-
     src/org/openstreetmap/josm/gui/layer/GpxLayer.java |    5 +-
     .../gui/layer/gpx/ChooseTrackVisibilityAction.java |    4 +-
     .../mappaint/mapcss/parsergen/MapCSSParser.java    | 3650 ++++++++++++++++++++
     .../mapcss/parsergen/MapCSSParserConstants.java    |  195 ++
     .../mapcss/parsergen/MapCSSParserTokenManager.java | 1450 ++++++++
     .../mappaint/mapcss/parsergen/ParseException.java  |  195 ++
     .../mapcss/parsergen/SimpleCharStream.java         |  474 +++
     .../josm/gui/mappaint/mapcss/parsergen/Token.java  |  131 +
     .../mappaint/mapcss/parsergen/TokenMgrError.java   |  146 +
     .../projection/ProjectionPreference.java           |    3 +-
     14 files changed, 6352 insertions(+), 65 deletions(-)
     create mode 100644 src/org/openstreetmap/josm/gui/mappaint/mapcss/parsergen/MapCSSParser.java
     create mode 100644 src/org/openstreetmap/josm/gui/mappaint/mapcss/parsergen/MapCSSParserConstants.java
     create mode 100644 src/org/openstreetmap/josm/gui/mappaint/mapcss/parsergen/MapCSSParserTokenManager.java
     create mode 100644 src/org/openstreetmap/josm/gui/mappaint/mapcss/parsergen/ParseException.java
     create mode 100644 src/org/openstreetmap/josm/gui/mappaint/mapcss/parsergen/SimpleCharStream.java
     create mode 100644 src/org/openstreetmap/josm/gui/mappaint/mapcss/parsergen/Token.java
     create mode 100644 src/org/openstreetmap/josm/gui/mappaint/mapcss/parsergen/TokenMgrError.java
    
    diff --git a/src/org/openstreetmap/josm/actions/mapmode/ParallelWayAction.java b/src/org/openstreetmap/josm/actions/mapmode/ParallelWayAction.java
    index 9f1d4d5..f09880b 100644
    a b import org.openstreetmap.josm.data.osm.WaySegment;  
    3131import org.openstreetmap.josm.data.osm.visitor.paint.PaintColors;
    3232import org.openstreetmap.josm.gui.MapFrame;
    3333import org.openstreetmap.josm.gui.MapView;
    34 import org.openstreetmap.josm.gui.NavigatableComponent;
    3534import org.openstreetmap.josm.gui.layer.Layer;
    3635import org.openstreetmap.josm.gui.layer.MapViewPaintable;
    3736import org.openstreetmap.josm.gui.layer.OsmDataLayer;
    public class ParallelWayAction extends MapMode implements ModifierListener, MapV  
    423422            // TODO: Very simple snapping
    424423            // - Snap steps relative to the distance?
    425424            double snapDistance;
    426             SystemOfMeasurement som = NavigatableComponent.getSystemOfMeasurement();
     425            SystemOfMeasurement som = SystemOfMeasurement.getSystemOfMeasurement();
    427426            if (som.equals(SystemOfMeasurement.CHINESE)) {
    428427                snapDistance = snapDistanceChinese * SystemOfMeasurement.CHINESE.aValue;
    429428            } else if (som.equals(SystemOfMeasurement.IMPERIAL)) {
  • src/org/openstreetmap/josm/data/SystemOfMeasurement.java

    diff --git a/src/org/openstreetmap/josm/data/SystemOfMeasurement.java b/src/org/openstreetmap/josm/data/SystemOfMeasurement.java
    index ba694b3..1a3bb86 100644
    a b import java.text.NumberFormat;  
    77import java.util.LinkedHashMap;
    88import java.util.Locale;
    99import java.util.Map;
     10import java.util.concurrent.CopyOnWriteArrayList;
    1011
    1112import org.openstreetmap.josm.Main;
     13import org.openstreetmap.josm.gui.preferences.projection.ProjectionPreference;
    1214
    1315/**
    1416 * A system of units used to express length and area measurements.
     17 * <p>
     18 * This class also manages one globally set system of measurement stored in the {@link ProjectionPreference}
    1519 * @since 3406 (creation)
    1620 * @since 6992 (extraction in this package)
    1721 */
    1822public class SystemOfMeasurement {
    1923
    2024    /**
     25     * Interface to notify listeners of the change of the system of measurement.
     26     */
     27    public interface SoMChangeListener {
     28        /**
     29         * The current SoM has changed.
     30         * @param oldSoM The old system of measurement
     31         * @param newSoM The new (current) system of measurement
     32         */
     33        void systemOfMeasurementChanged(String oldSoM, String newSoM);
     34    }
     35
     36    /**
    2137     * Metric system (international standard).
    2238     * @since 3406
    2339     */
    public class SystemOfMeasurement {  
    5470        ALL_SYSTEMS.put(marktr("Nautical Mile"), NAUTICAL_MILE);
    5571    }
    5672
     73    private static final CopyOnWriteArrayList<SoMChangeListener> somChangeListeners = new CopyOnWriteArrayList<>();
     74
     75    /**
     76     * Removes a global SoM change listener
     77     *
     78     * @param listener the listener. Ignored if null or already absent
     79     * @since 6056
     80     */
     81    public static void removeSoMChangeListener(SoMChangeListener listener) {
     82        somChangeListeners.remove(listener);
     83    }
     84
     85    /**
     86     * Adds a SoM change listener
     87     *
     88     * @param listener the listener. Ignored if null or already registered.
     89     * @since 6056
     90     */
     91    public static void addSoMChangeListener(SoMChangeListener listener) {
     92        if (listener != null) {
     93            somChangeListeners.addIfAbsent(listener);
     94        }
     95    }
     96
     97    protected static void fireSoMChanged(String oldSoM, String newSoM) {
     98        for (SoMChangeListener l : somChangeListeners) {
     99            l.systemOfMeasurementChanged(oldSoM, newSoM);
     100        }
     101    }
     102
     103    /**
     104     * Returns the current global system of measurement.
     105     * @return The current system of measurement (metric system by default).
     106     * @since 3490
     107     */
     108    public static SystemOfMeasurement getSystemOfMeasurement() {
     109        SystemOfMeasurement som = SystemOfMeasurement.ALL_SYSTEMS.get(ProjectionPreference.PROP_SYSTEM_OF_MEASUREMENT.get());
     110        if (som == null)
     111            return SystemOfMeasurement.METRIC;
     112        return som;
     113    }
     114
     115    /**
     116     * Sets the current global system of measurement.
     117     * @param somKey The system of measurement key. Must be defined in {@link SystemOfMeasurement#ALL_SYSTEMS}.
     118     * @throws IllegalArgumentException if {@code somKey} is not known
     119     * @since 6056
     120     */
     121    public static void setSystemOfMeasurement(String somKey) {
     122        if (!SystemOfMeasurement.ALL_SYSTEMS.containsKey(somKey)) {
     123            throw new IllegalArgumentException("Invalid system of measurement: "+somKey);
     124        }
     125        String oldKey = ProjectionPreference.PROP_SYSTEM_OF_MEASUREMENT.get();
     126        if (ProjectionPreference.PROP_SYSTEM_OF_MEASUREMENT.put(somKey)) {
     127            fireSoMChanged(oldKey, somKey);
     128        }
     129    }
     130
    57131    /** First value, in meters, used to translate unit according to above formula. */
    58132    public final double aValue;
    59133    /** Second value, in meters, used to translate unit according to above formula. */
  • src/org/openstreetmap/josm/gui/MapStatus.java

    diff --git a/src/org/openstreetmap/josm/gui/MapStatus.java b/src/org/openstreetmap/josm/gui/MapStatus.java
    index 61f1604..51e87e2 100644
    a b import org.openstreetmap.josm.Main;  
    5353import org.openstreetmap.josm.data.Preferences.PreferenceChangeEvent;
    5454import org.openstreetmap.josm.data.Preferences.PreferenceChangedListener;
    5555import org.openstreetmap.josm.data.SystemOfMeasurement;
     56import org.openstreetmap.josm.data.SystemOfMeasurement.SoMChangeListener;
    5657import org.openstreetmap.josm.data.coor.CoordinateFormat;
    5758import org.openstreetmap.josm.data.coor.LatLon;
    5859import org.openstreetmap.josm.data.osm.DataSet;
    5960import org.openstreetmap.josm.data.osm.OsmPrimitive;
    6061import org.openstreetmap.josm.data.osm.Way;
    6162import org.openstreetmap.josm.data.preferences.ColorProperty;
    62 import org.openstreetmap.josm.gui.NavigatableComponent.SoMChangeListener;
    6363import org.openstreetmap.josm.gui.help.Helpful;
    6464import org.openstreetmap.josm.gui.preferences.projection.ProjectionPreference;
    6565import org.openstreetmap.josm.gui.progress.PleaseWaitProgressMonitor;
    public class MapStatus extends JPanel implements Helpful, Destroyable, Preferenc  
    864864            });
    865865        }
    866866
    867         NavigatableComponent.addSoMChangeListener(somListener = new SoMChangeListener() {
     867        SystemOfMeasurement.addSoMChangeListener(somListener = new SoMChangeListener() {
    868868            @Override
    869869            public void systemOfMeasurementChanged(String oldSoM, String newSoM) {
    870870                setDist(distValue);
    public class MapStatus extends JPanel implements Helpful, Destroyable, Preferenc  
    907907     * @since 6960
    908908     */
    909909    public void updateSystemOfMeasurement(String newsom) {
    910         NavigatableComponent.setSystemOfMeasurement(newsom);
     910        SystemOfMeasurement.setSystemOfMeasurement(newsom);
    911911        if (Main.pref.getBoolean("statusbar.notify.change-system-of-measurement", true)) {
    912912            new Notification(tr("System of measurement changed to {0}", newsom))
    913913                .setDuration(Notification.TIME_SHORT)
    public class MapStatus extends JPanel implements Helpful, Destroyable, Preferenc  
    10191019
    10201020    @Override
    10211021    public void destroy() {
    1022         NavigatableComponent.removeSoMChangeListener(somListener);
     1022        SystemOfMeasurement.removeSoMChangeListener(somListener);
    10231023        Main.pref.removePreferenceChangeListener(this);
    10241024
    10251025        // MapFrame gets destroyed when the last layer is removed, but the status line background
  • src/org/openstreetmap/josm/gui/NavigatableComponent.java

    diff --git a/src/org/openstreetmap/josm/gui/NavigatableComponent.java b/src/org/openstreetmap/josm/gui/NavigatableComponent.java
    index 03e70fe..c5505f9 100644
    a b import org.openstreetmap.josm.gui.download.DownloadDialog;  
    5151import org.openstreetmap.josm.gui.help.Helpful;
    5252import org.openstreetmap.josm.gui.mappaint.MapPaintStyles;
    5353import org.openstreetmap.josm.gui.mappaint.mapcss.MapCSSStyleSource;
    54 import org.openstreetmap.josm.gui.preferences.projection.ProjectionPreference;
    5554import org.openstreetmap.josm.tools.Predicate;
    5655import org.openstreetmap.josm.tools.Utils;
    5756
    public class NavigatableComponent extends JComponent implements Helpful {  
    7877     * Interface to notify listeners of the change of the system of measurement.
    7978     * @since 6056
    8079     */
    81     public interface SoMChangeListener {
    82         /**
    83          * The current SoM has changed.
    84          * @param oldSoM The old system of measurement
    85          * @param newSoM The new (current) system of measurement
    86          */
    87         void systemOfMeasurementChanged(String oldSoM, String newSoM);
     80    public interface SoMChangeListener extends SystemOfMeasurement.SoMChangeListener {
    8881    }
    8982
    9083    public transient Predicate<OsmPrimitive> isSelectablePredicate = new Predicate<OsmPrimitive>() {
    public class NavigatableComponent extends JComponent implements Helpful {  
    137130        }
    138131    }
    139132
    140     private static final CopyOnWriteArrayList<SoMChangeListener> somChangeListeners = new CopyOnWriteArrayList<>();
    141133
    142134    /**
    143135     * Removes a SoM change listener
    public class NavigatableComponent extends JComponent implements Helpful {  
    145137     * @param listener the listener. Ignored if null or already absent
    146138     * @since 6056
    147139     */
     140    @Deprecated
    148141    public static void removeSoMChangeListener(NavigatableComponent.SoMChangeListener listener) {
    149         somChangeListeners.remove(listener);
     142        SystemOfMeasurement.removeSoMChangeListener(listener);
    150143    }
    151144
    152145    /**
    public class NavigatableComponent extends JComponent implements Helpful {  
    155148     * @param listener the listener. Ignored if null or already registered.
    156149     * @since 6056
    157150     */
     151    @Deprecated
    158152    public static void addSoMChangeListener(NavigatableComponent.SoMChangeListener listener) {
    159         if (listener != null) {
    160             somChangeListeners.addIfAbsent(listener);
    161         }
     153        SystemOfMeasurement.addSoMChangeListener(listener);
    162154    }
    163155
    164     protected static void fireSoMChanged(String oldSoM, String newSoM) {
    165         for (SoMChangeListener l : somChangeListeners) {
    166             l.systemOfMeasurementChanged(oldSoM, newSoM);
    167         }
     156    /**
     157     * Returns the current system of measurement.
     158     * @return The current system of measurement (metric system by default).
     159     * @since 3490
     160     */
     161    @Deprecated
     162    public static SystemOfMeasurement getSystemOfMeasurement() {
     163        return SystemOfMeasurement.getSystemOfMeasurement();
    168164    }
    169165
    170166    /**
    171      * The scale factor in x or y-units per pixel. This means, if scale = 10,
    172      * every physical pixel on screen are 10 x or 10 y units in the
    173      * northing/easting space of the projection.
     167     * Sets the current system of measurement.
     168     * @param somKey The system of measurement key. Must be defined in {@link SystemOfMeasurement#ALL_SYSTEMS}.
     169     * @throws IllegalArgumentException if {@code somKey} is not known
     170     * @since 6056
    174171     */
    175     private double scale = Main.getProjection().getDefaultZoomInPPD();
     172    @Deprecated
     173    public static void setSystemOfMeasurement(String somKey) {
     174        SystemOfMeasurement.setSystemOfMeasurement(somKey);
     175    }
    176176
     177    private double scale = Main.getProjection().getDefaultZoomInPPD();
    177178    /**
    178179     * Center n/e coordinate of the desired screen center.
    179180     */
    public class NavigatableComponent extends JComponent implements Helpful {  
    211212     * @since 3406
    212213     */
    213214    public static String getDistText(double dist) {
    214         return getSystemOfMeasurement().getDistText(dist);
     215        return SystemOfMeasurement.getSystemOfMeasurement().getDistText(dist);
    215216    }
    216217
    217218    /**
    public class NavigatableComponent extends JComponent implements Helpful {  
    223224     * @since 7135
    224225     */
    225226    public static String getDistText(final double dist, final NumberFormat format, final double threshold) {
    226         return getSystemOfMeasurement().getDistText(dist, format, threshold);
     227        return SystemOfMeasurement.getSystemOfMeasurement().getDistText(dist, format, threshold);
    227228    }
    228229
    229230    /**
    public class NavigatableComponent extends JComponent implements Helpful {  
    233234     * @since 5560
    234235     */
    235236    public static String getAreaText(double area) {
    236         return getSystemOfMeasurement().getAreaText(area);
     237        return SystemOfMeasurement.getSystemOfMeasurement().getAreaText(area);
    237238    }
    238239
    239240    /**
    public class NavigatableComponent extends JComponent implements Helpful {  
    245246     * @since 7135
    246247     */
    247248    public static String getAreaText(final double area, final NumberFormat format, final double threshold) {
    248         return getSystemOfMeasurement().getAreaText(area, format, threshold);
     249        return SystemOfMeasurement.getSystemOfMeasurement().getAreaText(area, format, threshold);
    249250    }
    250251
    251252    public String getDist100PixelText() {
    public class NavigatableComponent extends JComponent implements Helpful {  
    14341435        return (int) id.getValue();
    14351436    }
    14361437
    1437     /**
    1438      * Returns the current system of measurement.
    1439      * @return The current system of measurement (metric system by default).
    1440      * @since 3490
    1441      */
    1442     public static SystemOfMeasurement getSystemOfMeasurement() {
    1443         SystemOfMeasurement som = SystemOfMeasurement.ALL_SYSTEMS.get(ProjectionPreference.PROP_SYSTEM_OF_MEASUREMENT.get());
    1444         if (som == null)
    1445             return SystemOfMeasurement.METRIC;
    1446         return som;
    1447     }
    1448 
    1449     /**
    1450      * Sets the current system of measurement.
    1451      * @param somKey The system of measurement key. Must be defined in {@link SystemOfMeasurement#ALL_SYSTEMS}.
    1452      * @throws IllegalArgumentException if {@code somKey} is not known
    1453      * @since 6056
    1454      */
    1455     public static void setSystemOfMeasurement(String somKey) {
    1456         if (!SystemOfMeasurement.ALL_SYSTEMS.containsKey(somKey)) {
    1457             throw new IllegalArgumentException("Invalid system of measurement: "+somKey);
    1458         }
    1459         String oldKey = ProjectionPreference.PROP_SYSTEM_OF_MEASUREMENT.get();
    1460         if (ProjectionPreference.PROP_SYSTEM_OF_MEASUREMENT.put(somKey)) {
    1461             fireSoMChanged(oldKey, somKey);
    1462         }
    1463     }
    1464 
    14651438    private static class CursorInfo {
    14661439        private final Cursor cursor;
    14671440        private final Object object;
  • src/org/openstreetmap/josm/gui/layer/GpxLayer.java

    diff --git a/src/org/openstreetmap/josm/gui/layer/GpxLayer.java b/src/org/openstreetmap/josm/gui/layer/GpxLayer.java
    index cca96d9..9d188a4 100644
    a b import org.openstreetmap.josm.Main;  
    2525import org.openstreetmap.josm.actions.RenameLayerAction;
    2626import org.openstreetmap.josm.actions.SaveActionBase;
    2727import org.openstreetmap.josm.data.Bounds;
     28import org.openstreetmap.josm.data.SystemOfMeasurement;
    2829import org.openstreetmap.josm.data.gpx.GpxConstants;
    2930import org.openstreetmap.josm.data.gpx.GpxData;
    3031import org.openstreetmap.josm.data.gpx.GpxTrack;
    public class GpxLayer extends Layer {  
    149150                info.append("</td><td>");
    150151                info.append(getTimespanForTrack(trk));
    151152                info.append("</td><td>");
    152                 info.append(NavigatableComponent.getSystemOfMeasurement().getDistText(trk.length()));
     153                info.append(SystemOfMeasurement.getSystemOfMeasurement().getDistText(trk.length()));
    153154                info.append("</td><td>");
    154155                if (trk.getAttributes().containsKey("url")) {
    155156                    info.append(trk.get("url"));
    public class GpxLayer extends Layer {  
    221222        info.append(trn("{0} track, ", "{0} tracks, ", data.tracks.size(), data.tracks.size()))
    222223            .append(trn("{0} route, ", "{0} routes, ", data.routes.size(), data.routes.size()))
    223224            .append(trn("{0} waypoint", "{0} waypoints", data.waypoints.size(), data.waypoints.size())).append("<br>")
    224             .append(tr("Length: {0}", NavigatableComponent.getSystemOfMeasurement().getDistText(data.length())))
     225            .append(tr("Length: {0}", SystemOfMeasurement.getSystemOfMeasurement().getDistText(data.length())))
    225226            .append("<br></html>");
    226227        return info.toString();
    227228    }
  • src/org/openstreetmap/josm/gui/layer/gpx/ChooseTrackVisibilityAction.java

    diff --git a/src/org/openstreetmap/josm/gui/layer/gpx/ChooseTrackVisibilityAction.java b/src/org/openstreetmap/josm/gui/layer/gpx/ChooseTrackVisibilityAction.java
    index d1b7ac1..848da50 100644
    a b import javax.swing.table.TableCellRenderer;  
    3232import javax.swing.table.TableRowSorter;
    3333
    3434import org.openstreetmap.josm.Main;
     35import org.openstreetmap.josm.data.SystemOfMeasurement;
    3536import org.openstreetmap.josm.data.gpx.GpxConstants;
    3637import org.openstreetmap.josm.data.gpx.GpxTrack;
    3738import org.openstreetmap.josm.gui.ExtendedDialog;
    38 import org.openstreetmap.josm.gui.NavigatableComponent;
    3939import org.openstreetmap.josm.gui.layer.GpxLayer;
    4040import org.openstreetmap.josm.tools.GBC;
    4141import org.openstreetmap.josm.tools.ImageProvider;
    public class ChooseTrackVisibilityAction extends AbstractAction {  
    8282         */
    8383        @Override
    8484        public String toString() {
    85             return NavigatableComponent.getSystemOfMeasurement().getDistText(value);
     85            return SystemOfMeasurement.getSystemOfMeasurement().getDistText(value);
    8686        }
    8787    }
    8888
  • new file src/org/openstreetmap/josm/gui/mappaint/mapcss/parsergen/MapCSSParser.java

    diff --git a/src/org/openstreetmap/josm/gui/mappaint/mapcss/parsergen/MapCSSParser.java b/src/org/openstreetmap/josm/gui/mappaint/mapcss/parsergen/MapCSSParser.java
    new file mode 100644
    index 0000000..fb4a00b
    - +  
     1/* MapCSSParser.java */
     2/* Generated By:JavaCC: Do not edit this line. MapCSSParser.java */
     3package org.openstreetmap.josm.gui.mappaint.mapcss.parsergen;
     4
     5import java.io.InputStream;
     6import java.io.Reader;
     7import java.util.ArrayList;
     8import java.util.Arrays;
     9import java.util.Collections;
     10import java.util.List;
     11import java.util.Locale;
     12
     13import org.openstreetmap.josm.Main;
     14import org.openstreetmap.josm.gui.mappaint.Keyword;
     15import org.openstreetmap.josm.gui.mappaint.mapcss.Condition;
     16import org.openstreetmap.josm.gui.mappaint.mapcss.Condition.Context;
     17import org.openstreetmap.josm.gui.mappaint.mapcss.Expression;
     18import org.openstreetmap.josm.gui.mappaint.mapcss.ExpressionFactory;
     19import org.openstreetmap.josm.gui.mappaint.mapcss.ExpressionFactory.NullExpression;
     20import org.openstreetmap.josm.gui.mappaint.mapcss.Instruction;
     21import org.openstreetmap.josm.gui.mappaint.mapcss.LiteralExpression;
     22import org.openstreetmap.josm.gui.mappaint.mapcss.MapCSSException;
     23import org.openstreetmap.josm.gui.mappaint.mapcss.MapCSSRule;
     24import org.openstreetmap.josm.gui.mappaint.mapcss.MapCSSRule.Declaration;
     25import org.openstreetmap.josm.gui.mappaint.mapcss.MapCSSStyleSource;
     26import org.openstreetmap.josm.gui.mappaint.mapcss.Selector;
     27import org.openstreetmap.josm.gui.mappaint.mapcss.Selector.ChildOrParentSelector;
     28import org.openstreetmap.josm.gui.mappaint.mapcss.Selector.GeneralSelector;
     29import org.openstreetmap.josm.gui.mappaint.mapcss.Selector.LinkSelector;
     30import org.openstreetmap.josm.gui.mappaint.mapcss.Subpart;
     31import org.openstreetmap.josm.tools.ColorHelper;
     32import org.openstreetmap.josm.tools.Pair;
     33import org.openstreetmap.josm.tools.Utils;
     34
     35/**
     36 * MapCSS parser.
     37 *
     38 * Contains two independent grammars:
     39 * (a) the preprocessor and (b) the main mapcss parser.
     40 *
     41 * The preprocessor handles @supports and @media syntax (@media is deprecated).
     42 * Basically this allows to write one style for different versions of JOSM (or different editors).
     43 * When the @supports condition is not fulfilled, it should simply skip over
     44 * the whole section and not attempt to parse the possibly unknown
     45 * grammar. It preserves whitespace and comments, in order to keep the
     46 * line and column numbers in the error messages correct for the second pass.
     47 *
     48 */
     49
     50public class MapCSSParser implements MapCSSParserConstants {
     51    MapCSSStyleSource sheet;
     52    StringBuilder sb;
     53    int declarationCounter;
     54
     55    /**
     56     * Nicer way to refer to a lexical state.
     57     */
     58    public static enum LexicalState {
     59        PREPROCESSOR(0), /* the preprocessor */
     60        DEFAULT(2);      /* the main parser */
     61
     62        int idx; // the integer, which javacc assigns to this state
     63
     64        LexicalState(int idx) {
     65            if (!this.name().equals(MapCSSParserTokenManager.lexStateNames[idx])) {
     66                throw new RuntimeException();
     67            }
     68            this.idx = idx;
     69        }
     70    };
     71
     72    /**
     73     * Constructor which initializes the parser with a certain lexical state.
     74     */
     75    public MapCSSParser(InputStream in, String encoding, LexicalState initState) {
     76        this(createTokenManager(in, encoding, initState));
     77        declarationCounter = 0;
     78    }
     79
     80    protected static MapCSSParserTokenManager createTokenManager(InputStream in, String encoding, LexicalState initState) {
     81        SimpleCharStream scs;
     82        try {
     83            scs = new SimpleCharStream(in, encoding, 1, 1);
     84        } catch (java.io.UnsupportedEncodingException e) {
     85            throw new RuntimeException(e);
     86        }
     87        return new MapCSSParserTokenManager(scs, initState.idx);
     88    }
     89
     90    /**
     91     * Constructor which initializes the parser with a certain lexical state.
     92     */
     93    public MapCSSParser(Reader in, LexicalState initState) {
     94        this(createTokenManager(in, initState));
     95        declarationCounter = 0;
     96    }
     97
     98    protected static MapCSSParserTokenManager createTokenManager(Reader in, LexicalState initState) {
     99        final SimpleCharStream scs = new SimpleCharStream(in, 1, 1);
     100        return new MapCSSParserTokenManager(scs, initState.idx);
     101    }
     102
     103/*************
     104 *
     105 * Preprocessor parser definitions:
     106 *
     107 * <pre>
     108 *
     109 * {@literal @media} { ... } queries are supported, following http://www.w3.org/TR/css3-mediaqueries/#syntax
     110 *
     111 *                               media_query
     112 *         ___________________________|_______________________________
     113 *        |                                                           |
     114 * {@literal @media} all and (min-josm-version: 7789) and (max-josm-version: 7790), all and (user-agent: xyz) { ... }
     115 *                |______________________|
     116 *                          |
     117 *                    media_expression
     118 * </pre>
     119 */
     120
     121
     122/**
     123 * root method for the preprocessor.
     124 */
     125  final public String pp_root(MapCSSStyleSource sheet) throws ParseException {
     126sb = new StringBuilder(); this.sheet = sheet;
     127    pp_black_box(true);
     128    jj_consume_token(0);
     129{if ("" != null) return sb.toString();}
     130    throw new Error("Missing return statement in function");
     131  }
     132
     133/**
     134 * Parse any unknown grammar (black box).
     135 *
     136 * Only stop when "@media" is encountered and keep track of correct number of
     137 * opening and closing curly brackets.
     138 *
     139 * @param write false if this content should be skipped (@pp_media condition is not fulfilled), true otherwise
     140 */
     141  final public void pp_black_box(boolean write) throws ParseException {Token t;
     142    label_1:
     143    while (true) {
     144      switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     145      case PP_AND:
     146      case PP_OR:
     147      case PP_NOT:
     148      case PP_SUPPORTS:
     149      case PP_MEDIA:
     150      case PP_NEWLINECHAR:
     151      case PP_WHITESPACE:
     152      case PP_COMMENT_START:
     153      case IDENT:
     154      case UINT:
     155      case STRING:
     156      case REGEX:
     157      case LBRACE:
     158      case LPAR:
     159      case RPAR:
     160      case COMMA:
     161      case COLON:
     162      case PP_SOMETHING_ELSE:{
     163        ;
     164        break;
     165        }
     166      default:
     167        jj_la1[0] = jj_gen;
     168        break label_1;
     169      }
     170      switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     171      case PP_AND:
     172      case PP_OR:
     173      case PP_NOT:
     174      case IDENT:
     175      case UINT:
     176      case STRING:
     177      case REGEX:
     178      case LPAR:
     179      case RPAR:
     180      case COMMA:
     181      case COLON:
     182      case PP_SOMETHING_ELSE:{
     183        switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     184        case PP_AND:{
     185          t = jj_consume_token(PP_AND);
     186          break;
     187          }
     188        case PP_OR:{
     189          t = jj_consume_token(PP_OR);
     190          break;
     191          }
     192        case PP_NOT:{
     193          t = jj_consume_token(PP_NOT);
     194          break;
     195          }
     196        case UINT:{
     197          t = jj_consume_token(UINT);
     198          break;
     199          }
     200        case STRING:{
     201          t = jj_consume_token(STRING);
     202          break;
     203          }
     204        case REGEX:{
     205          t = jj_consume_token(REGEX);
     206          break;
     207          }
     208        case LPAR:{
     209          t = jj_consume_token(LPAR);
     210          break;
     211          }
     212        case RPAR:{
     213          t = jj_consume_token(RPAR);
     214          break;
     215          }
     216        case COMMA:{
     217          t = jj_consume_token(COMMA);
     218          break;
     219          }
     220        case COLON:{
     221          t = jj_consume_token(COLON);
     222          break;
     223          }
     224        case IDENT:{
     225          t = jj_consume_token(IDENT);
     226          break;
     227          }
     228        case PP_SOMETHING_ELSE:{
     229          t = jj_consume_token(PP_SOMETHING_ELSE);
     230          break;
     231          }
     232        default:
     233          jj_la1[1] = jj_gen;
     234          jj_consume_token(-1);
     235          throw new ParseException();
     236        }
     237if (write) sb.append(t.image);
     238        break;
     239        }
     240      case PP_NEWLINECHAR:
     241      case PP_WHITESPACE:
     242      case PP_COMMENT_START:{
     243        pp_w1();
     244        break;
     245        }
     246      case PP_SUPPORTS:{
     247        pp_supports(!write);
     248        break;
     249        }
     250      case PP_MEDIA:{
     251        pp_media(!write);
     252        break;
     253        }
     254      case LBRACE:{
     255        t = jj_consume_token(LBRACE);
     256if (write) sb.append(t.image);
     257        pp_black_box(write);
     258        t = jj_consume_token(RBRACE);
     259if (write) sb.append(t.image);
     260        break;
     261        }
     262      default:
     263        jj_la1[2] = jj_gen;
     264        jj_consume_token(-1);
     265        throw new ParseException();
     266      }
     267    }
     268  }
     269
     270/**
     271 * Parses an @supports rule.
     272 *
     273 * @param ignore if the content of this rule should be ignored
     274 * (because we are already inside a @supports block that didn't pass)
     275 */
     276  final public void pp_supports(boolean ignore) throws ParseException {boolean pass;
     277    jj_consume_token(PP_SUPPORTS);
     278    pp_w();
     279    pass = pp_supports_condition();
     280    jj_consume_token(LBRACE);
     281    pp_black_box(pass && !ignore);
     282    jj_consume_token(RBRACE);
     283  }
     284
     285/**
     286 * Parses the condition of the @supports rule.
     287 *
     288 * Unlike other parsing rules, grabs trailing whitespace.
     289 * @return true, if the condition is fulfilled
     290 */
     291  final public boolean pp_supports_condition() throws ParseException {boolean pass;
     292    boolean q;
     293    switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     294    case PP_NOT:{
     295      jj_consume_token(PP_NOT);
     296      pp_w();
     297      q = pp_supports_condition_in_parens();
     298pass = !q;
     299      pp_w();
     300      break;
     301      }
     302    default:
     303      jj_la1[5] = jj_gen;
     304      if (jj_2_1(2147483647)) {
     305        pass = pp_supports_condition_in_parens();
     306        pp_w();
     307        label_2:
     308        while (true) {
     309          jj_consume_token(PP_AND);
     310          pp_w();
     311          q = pp_supports_condition_in_parens();
     312pass = pass && q;
     313          pp_w();
     314          switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     315          case PP_AND:{
     316            ;
     317            break;
     318            }
     319          default:
     320            jj_la1[3] = jj_gen;
     321            break label_2;
     322          }
     323        }
     324      } else if (jj_2_2(2147483647)) {
     325        pass = pp_supports_condition_in_parens();
     326        pp_w();
     327        label_3:
     328        while (true) {
     329          jj_consume_token(PP_OR);
     330          pp_w();
     331          q = pp_supports_condition_in_parens();
     332pass = pass || q;
     333          pp_w();
     334          switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     335          case PP_OR:{
     336            ;
     337            break;
     338            }
     339          default:
     340            jj_la1[4] = jj_gen;
     341            break label_3;
     342          }
     343        }
     344      } else {
     345        switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     346        case LPAR:{
     347          pass = pp_supports_condition_in_parens();
     348          pp_w();
     349          break;
     350          }
     351        default:
     352          jj_la1[6] = jj_gen;
     353          jj_consume_token(-1);
     354          throw new ParseException();
     355        }
     356      }
     357    }
     358{if ("" != null) return pass;}
     359    throw new Error("Missing return statement in function");
     360  }
     361
     362/**
     363 * Parses something in parenthesis inside the condition of the @supports rule.
     364 *
     365 * @return true, if the condition is fulfilled
     366 */
     367  final public boolean pp_supports_condition_in_parens() throws ParseException {boolean pass;
     368    if (jj_2_3(2147483647)) {
     369      pass = pp_supports_declaration_condition();
     370    } else {
     371      switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     372      case LPAR:{
     373        jj_consume_token(LPAR);
     374        pp_w();
     375        pass = pp_supports_condition();
     376        jj_consume_token(RPAR);
     377        break;
     378        }
     379      default:
     380        jj_la1[7] = jj_gen;
     381        jj_consume_token(-1);
     382        throw new ParseException();
     383      }
     384    }
     385{if ("" != null) return pass;}
     386    throw new Error("Missing return statement in function");
     387  }
     388
     389/**
     390 * Parse an @supports declaration condition, e.&nbsp;g. a single (key:value) or (key) statement.
     391 *
     392 * The parsing rule {@link #literal()} from the main mapcss parser is reused here.
     393 *
     394 * @return true if the condition is fulfilled
     395 */
     396  final public boolean pp_supports_declaration_condition() throws ParseException {Token t;
     397    String feature;
     398    Object val = null;
     399    jj_consume_token(LPAR);
     400    pp_w();
     401    t = jj_consume_token(IDENT);
     402feature = t.image;
     403    pp_w();
     404    switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     405    case COLON:{
     406      jj_consume_token(COLON);
     407      pp_w();
     408      val = literal();
     409      break;
     410      }
     411    default:
     412      jj_la1[8] = jj_gen;
     413      ;
     414    }
     415    jj_consume_token(RPAR);
     416{if ("" != null) return this.sheet.evalSupportsDeclCondition(feature, val);}
     417    throw new Error("Missing return statement in function");
     418  }
     419
     420// deprecated
     421  final public void pp_media(boolean ignore) throws ParseException {boolean pass = false;
     422    boolean q;
     423    boolean empty = true;
     424    jj_consume_token(PP_MEDIA);
     425    pp_w();
     426    switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     427    case PP_NOT:
     428    case IDENT:
     429    case LPAR:{
     430      q = pp_media_query();
     431pass = pass || q; empty = false;
     432      label_4:
     433      while (true) {
     434        switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     435        case COMMA:{
     436          ;
     437          break;
     438          }
     439        default:
     440          jj_la1[9] = jj_gen;
     441          break label_4;
     442        }
     443        jj_consume_token(COMMA);
     444        pp_w();
     445        q = pp_media_query();
     446pass = pass || q;
     447      }
     448      break;
     449      }
     450    default:
     451      jj_la1[10] = jj_gen;
     452      ;
     453    }
     454    jj_consume_token(LBRACE);
     455    pp_black_box((empty || pass) && !ignore);
     456    jj_consume_token(RBRACE);
     457  }
     458
     459// deprecated
     460  final public boolean pp_media_query() throws ParseException {Token t;
     461    String mediatype = "all";
     462    boolean pass = true;
     463    boolean invert = false;
     464    boolean e;
     465    switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     466    case PP_NOT:{
     467      jj_consume_token(PP_NOT);
     468invert = true;
     469      pp_w();
     470      break;
     471      }
     472    default:
     473      jj_la1[11] = jj_gen;
     474      ;
     475    }
     476    switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     477    case IDENT:{
     478      t = jj_consume_token(IDENT);
     479mediatype = t.image.toLowerCase(Locale.ENGLISH);
     480      pp_w();
     481      label_5:
     482      while (true) {
     483        switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     484        case PP_AND:{
     485          ;
     486          break;
     487          }
     488        default:
     489          jj_la1[12] = jj_gen;
     490          break label_5;
     491        }
     492        jj_consume_token(PP_AND);
     493        pp_w();
     494        e = pp_media_expression();
     495pass = pass && e;
     496        pp_w();
     497      }
     498      break;
     499      }
     500    case LPAR:{
     501      e = pp_media_expression();
     502pass = pass && e;
     503      pp_w();
     504      label_6:
     505      while (true) {
     506        switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     507        case PP_AND:{
     508          ;
     509          break;
     510          }
     511        default:
     512          jj_la1[13] = jj_gen;
     513          break label_6;
     514        }
     515        jj_consume_token(PP_AND);
     516        pp_w();
     517        e = pp_media_expression();
     518pass = pass && e;
     519        pp_w();
     520      }
     521      break;
     522      }
     523    default:
     524      jj_la1[14] = jj_gen;
     525      jj_consume_token(-1);
     526      throw new ParseException();
     527    }
     528if (!"all".equals(mediatype)) {
     529            pass = false;
     530        }
     531        {if ("" != null) return invert ? (!pass) : pass;}
     532    throw new Error("Missing return statement in function");
     533  }
     534
     535/**
     536 * Parse an @media expression.
     537 *
     538 * The parsing rule {@link #literal()} from the main mapcss parser is reused here.
     539 *
     540 * @return true if the condition is fulfilled
     541 */
     542// deprecated
     543  final public boolean pp_media_expression() throws ParseException {Token t;
     544    String feature;
     545    Object val = null;
     546    jj_consume_token(LPAR);
     547    pp_w();
     548    t = jj_consume_token(IDENT);
     549feature = t.image;
     550    pp_w();
     551    switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     552    case COLON:{
     553      jj_consume_token(COLON);
     554      pp_w();
     555      val = literal();
     556      break;
     557      }
     558    default:
     559      jj_la1[15] = jj_gen;
     560      ;
     561    }
     562    jj_consume_token(RPAR);
     563{if ("" != null) return this.sheet.evalSupportsDeclCondition(feature, val);}
     564    throw new Error("Missing return statement in function");
     565  }
     566
     567  final public void pp_w1() throws ParseException {Token t;
     568    switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     569    case PP_NEWLINECHAR:{
     570      t = jj_consume_token(PP_NEWLINECHAR);
     571sb.append(t.image);
     572      break;
     573      }
     574    case PP_WHITESPACE:{
     575      t = jj_consume_token(PP_WHITESPACE);
     576sb.append(t.image);
     577      break;
     578      }
     579    case PP_COMMENT_START:{
     580      t = jj_consume_token(PP_COMMENT_START);
     581sb.append(t.image);
     582      t = jj_consume_token(PP_COMMENT_END);
     583sb.append(t.image);
     584      break;
     585      }
     586    default:
     587      jj_la1[16] = jj_gen;
     588      jj_consume_token(-1);
     589      throw new ParseException();
     590    }
     591  }
     592
     593  final public void pp_w() throws ParseException {
     594    label_7:
     595    while (true) {
     596      switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     597      case PP_NEWLINECHAR:
     598      case PP_WHITESPACE:
     599      case PP_COMMENT_START:{
     600        ;
     601        break;
     602        }
     603      default:
     604        jj_la1[17] = jj_gen;
     605        break label_7;
     606      }
     607      pp_w1();
     608    }
     609  }
     610
     611/*************
     612 *
     613 * Parser definition for the main MapCSS parser:
     614 *
     615 * <pre>
     616 *
     617 *                       rule
     618 *  _______________________|______________________________
     619 * |                                                      |
     620 *        selector                      declaration
     621 *  _________|___________________   _________|____________
     622 * |                             | |                      |
     623 *
     624 * way|z11-12[highway=residential] { color: red; width: 3 }
     625 *
     626 *    |_____||___________________|   |_________|
     627 *       |            |                   |
     628 *     zoom       condition          instruction
     629 *
     630 * more general:
     631 *
     632 * way|z13-[a=b][c=d]::subpart, way|z-3[u=v]:closed::subpart2 { p1 : val; p2 : val; }
     633 *
     634 * 'val' can be a literal, or an expression like "prop(width, default) + 0.8".
     635 *
     636 * </pre>
     637 */
     638  final public
     639int uint() throws ParseException {Token i;
     640    i = jj_consume_token(UINT);
     641{if ("" != null) return Integer.parseInt(i.image);}
     642    throw new Error("Missing return statement in function");
     643  }
     644
     645  final public int int_() throws ParseException {int i;
     646    switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     647    case MINUS:{
     648      jj_consume_token(MINUS);
     649      i = uint();
     650{if ("" != null) return -i;}
     651      break;
     652      }
     653    case UINT:{
     654      i = uint();
     655{if ("" != null) return i;}
     656      break;
     657      }
     658    default:
     659      jj_la1[18] = jj_gen;
     660      jj_consume_token(-1);
     661      throw new ParseException();
     662    }
     663    throw new Error("Missing return statement in function");
     664  }
     665
     666  final public float ufloat() throws ParseException {Token f;
     667    switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     668    case UFLOAT:{
     669      f = jj_consume_token(UFLOAT);
     670      break;
     671      }
     672    case UINT:{
     673      f = jj_consume_token(UINT);
     674      break;
     675      }
     676    default:
     677      jj_la1[19] = jj_gen;
     678      jj_consume_token(-1);
     679      throw new ParseException();
     680    }
     681{if ("" != null) return Float.parseFloat(f.image);}
     682    throw new Error("Missing return statement in function");
     683  }
     684
     685  final public float float_() throws ParseException {float f;
     686    switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     687    case MINUS:{
     688      jj_consume_token(MINUS);
     689      f = ufloat();
     690{if ("" != null) return -f;}
     691      break;
     692      }
     693    case UINT:
     694    case UFLOAT:{
     695      f = ufloat();
     696{if ("" != null) return f;}
     697      break;
     698      }
     699    default:
     700      jj_la1[20] = jj_gen;
     701      jj_consume_token(-1);
     702      throw new ParseException();
     703    }
     704    throw new Error("Missing return statement in function");
     705  }
     706
     707  final public String string() throws ParseException {Token t;
     708    t = jj_consume_token(STRING);
     709{if ("" != null) return t.image.substring(1, t.image.length() - 1).replace("\\\"", "\"").replace("\\\\", "\\");}
     710    throw new Error("Missing return statement in function");
     711  }
     712
     713  final public String ident() throws ParseException {Token t;
     714    String s;
     715    switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     716    case IDENT:{
     717      t = jj_consume_token(IDENT);
     718      break;
     719      }
     720    case SET:{
     721      t = jj_consume_token(SET);
     722      break;
     723      }
     724    default:
     725      jj_la1[21] = jj_gen;
     726      jj_consume_token(-1);
     727      throw new ParseException();
     728    }
     729{if ("" != null) return t.image;}
     730    throw new Error("Missing return statement in function");
     731  }
     732
     733  final public String string_or_ident() throws ParseException {Token t;
     734    String s;
     735    switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     736    case SET:
     737    case IDENT:{
     738      s = ident();
     739      break;
     740      }
     741    case STRING:{
     742      s = string();
     743      break;
     744      }
     745    default:
     746      jj_la1[22] = jj_gen;
     747      jj_consume_token(-1);
     748      throw new ParseException();
     749    }
     750{if ("" != null) return s;}
     751    throw new Error("Missing return statement in function");
     752  }
     753
     754  final public String regex() throws ParseException {Token t;
     755    t = jj_consume_token(REGEX);
     756{if ("" != null) return t.image.substring(1, t.image.length() - 1);}
     757    throw new Error("Missing return statement in function");
     758  }
     759
     760/**
     761 * white-space
     762 */
     763  final public void s() throws ParseException {
     764    switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     765    case S:{
     766      jj_consume_token(S);
     767      break;
     768      }
     769    default:
     770      jj_la1[23] = jj_gen;
     771      ;
     772    }
     773  }
     774
     775/**
     776 * mix of white-space and comments
     777 */
     778  final public void w() throws ParseException {
     779    label_8:
     780    while (true) {
     781      switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     782      case S:
     783      case COMMENT_START:{
     784        ;
     785        break;
     786        }
     787      default:
     788        jj_la1[24] = jj_gen;
     789        break label_8;
     790      }
     791      switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     792      case S:{
     793        jj_consume_token(S);
     794        break;
     795        }
     796      case COMMENT_START:{
     797        jj_consume_token(COMMENT_START);
     798        jj_consume_token(COMMENT_END);
     799        break;
     800        }
     801      default:
     802        jj_la1[25] = jj_gen;
     803        jj_consume_token(-1);
     804        throw new ParseException();
     805      }
     806    }
     807  }
     808
     809/**
     810 * comma delimited list of floats (at least 2, all &gt;= 0)
     811 */
     812  final public List<Float> float_array() throws ParseException {float f;
     813    List<Float> fs = new ArrayList<Float>();
     814    f = ufloat();
     815fs.add(f);
     816    label_9:
     817    while (true) {
     818      jj_consume_token(COMMA);
     819      s();
     820      f = ufloat();
     821fs.add(f);
     822      switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     823      case COMMA:{
     824        ;
     825        break;
     826        }
     827      default:
     828        jj_la1[26] = jj_gen;
     829        break label_9;
     830      }
     831    }
     832{if ("" != null) return fs;}
     833    throw new Error("Missing return statement in function");
     834  }
     835
     836/**
     837 * entry point for the main parser
     838 */
     839  final public void sheet(MapCSSStyleSource sheet) throws ParseException {
     840this.sheet = sheet;
     841    w();
     842    label_10:
     843    while (true) {
     844      switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     845      case IDENT:
     846      case STAR:{
     847        ;
     848        break;
     849        }
     850      default:
     851        jj_la1[27] = jj_gen;
     852        break label_10;
     853      }
     854      try {
     855        rule();
     856        w();
     857      } catch (MapCSSException mex) {
     858Main.error(mex);
     859            error_skipto(RBRACE, mex);
     860            w();
     861      } catch (ParseException ex) {
     862error_skipto(RBRACE, null);
     863            w();
     864      }
     865    }
     866    jj_consume_token(0);
     867  }
     868
     869  final public void rule() throws ParseException {List<Selector> selectors = new ArrayList<Selector>();
     870    Selector sel;
     871    Declaration decl;
     872    sel = child_selector();
     873selectors.add(sel);
     874    label_11:
     875    while (true) {
     876      switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     877      case COMMA:{
     878        ;
     879        break;
     880        }
     881      default:
     882        jj_la1[28] = jj_gen;
     883        break label_11;
     884      }
     885      jj_consume_token(COMMA);
     886      w();
     887      sel = child_selector();
     888selectors.add(sel);
     889    }
     890    decl = declaration();
     891for (Selector s : selectors) {
     892            sheet.rules.add(new MapCSSRule(s, decl));
     893        }
     894  }
     895
     896  final public Selector child_selector() throws ParseException {Selector.ChildOrParentSelectorType type = null;
     897    Condition c;
     898    List<Condition> conditions = new ArrayList<Condition>();
     899    Selector selLeft;
     900    LinkSelector selLink = null;
     901    Selector selRight = null;
     902    selLeft = selector();
     903    w();
     904    switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     905    case IDENT:
     906    case STAR:
     907    case GREATER:
     908    case LESS:
     909    case PLUS:
     910    case ELEMENT_OF:
     911    case CROSSING:{
     912      switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     913      case GREATER:
     914      case LESS:
     915      case PLUS:
     916      case ELEMENT_OF:
     917      case CROSSING:{
     918        switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     919        case GREATER:
     920        case LESS:
     921        case PLUS:{
     922          switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     923          case GREATER:{
     924            jj_consume_token(GREATER);
     925type = Selector.ChildOrParentSelectorType.CHILD;
     926            break;
     927            }
     928          case LESS:{
     929            jj_consume_token(LESS);
     930type = Selector.ChildOrParentSelectorType.PARENT;
     931            break;
     932            }
     933          case PLUS:{
     934            jj_consume_token(PLUS);
     935type = Selector.ChildOrParentSelectorType.SIBLING;
     936            break;
     937            }
     938          default:
     939            jj_la1[29] = jj_gen;
     940            jj_consume_token(-1);
     941            throw new ParseException();
     942          }
     943          label_12:
     944          while (true) {
     945            switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     946            case COLON:
     947            case LSQUARE:
     948            case EXCLAMATION:
     949            case FULLSTOP:{
     950              ;
     951              break;
     952              }
     953            default:
     954              jj_la1[30] = jj_gen;
     955              break label_12;
     956            }
     957            switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     958            case LSQUARE:{
     959              c = condition(Context.LINK);
     960              break;
     961              }
     962            case COLON:
     963            case EXCLAMATION:
     964            case FULLSTOP:{
     965              c = class_or_pseudoclass(Context.LINK);
     966              break;
     967              }
     968            default:
     969              jj_la1[31] = jj_gen;
     970              jj_consume_token(-1);
     971              throw new ParseException();
     972            }
     973conditions.add(c);
     974          }
     975          break;
     976          }
     977        case ELEMENT_OF:{
     978          jj_consume_token(ELEMENT_OF);
     979type = Selector.ChildOrParentSelectorType.ELEMENT_OF;
     980          break;
     981          }
     982        case CROSSING:{
     983          jj_consume_token(CROSSING);
     984type = Selector.ChildOrParentSelectorType.CROSSING;
     985          break;
     986          }
     987        default:
     988          jj_la1[32] = jj_gen;
     989          jj_consume_token(-1);
     990          throw new ParseException();
     991        }
     992        w();
     993        break;
     994        }
     995      default:
     996        jj_la1[33] = jj_gen;
     997/* <GREATER> is optional for child selector */ type = Selector.ChildOrParentSelectorType.CHILD;
     998      }
     999selLink = new LinkSelector(conditions);
     1000      selRight = selector();
     1001      w();
     1002      break;
     1003      }
     1004    default:
     1005      jj_la1[34] = jj_gen;
     1006      ;
     1007    }
     1008{if ("" != null) return selRight != null ? new ChildOrParentSelector(selLeft, selLink, selRight, type) : selLeft;}
     1009    throw new Error("Missing return statement in function");
     1010  }
     1011
     1012  final public Selector selector() throws ParseException {Token base;
     1013    Condition c;
     1014    Pair<Integer, Integer> r = null;
     1015    List<Condition> conditions = new ArrayList<Condition>();
     1016    Subpart sub = null;
     1017    switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     1018    case IDENT:{
     1019      base = jj_consume_token(IDENT);
     1020      break;
     1021      }
     1022    case STAR:{
     1023      base = jj_consume_token(STAR);
     1024      break;
     1025      }
     1026    default:
     1027      jj_la1[35] = jj_gen;
     1028      jj_consume_token(-1);
     1029      throw new ParseException();
     1030    }
     1031    switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     1032    case PIPE_Z:{
     1033      r = zoom();
     1034      break;
     1035      }
     1036    default:
     1037      jj_la1[36] = jj_gen;
     1038      ;
     1039    }
     1040    label_13:
     1041    while (true) {
     1042      switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     1043      case COLON:
     1044      case LSQUARE:
     1045      case EXCLAMATION:
     1046      case FULLSTOP:{
     1047        ;
     1048        break;
     1049        }
     1050      default:
     1051        jj_la1[37] = jj_gen;
     1052        break label_13;
     1053      }
     1054      switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     1055      case LSQUARE:{
     1056        c = condition(Context.PRIMITIVE);
     1057        break;
     1058        }
     1059      case COLON:
     1060      case EXCLAMATION:
     1061      case FULLSTOP:{
     1062        c = class_or_pseudoclass(Context.PRIMITIVE);
     1063        break;
     1064        }
     1065      default:
     1066        jj_la1[38] = jj_gen;
     1067        jj_consume_token(-1);
     1068        throw new ParseException();
     1069      }
     1070conditions.add(c);
     1071    }
     1072    switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     1073    case DCOLON:{
     1074      sub = subpart();
     1075      break;
     1076      }
     1077    default:
     1078      jj_la1[39] = jj_gen;
     1079      ;
     1080    }
     1081{if ("" != null) return new GeneralSelector(base.image, r, conditions, sub);}
     1082    throw new Error("Missing return statement in function");
     1083  }
     1084
     1085  final public Pair<Integer, Integer> zoom() throws ParseException {Integer min = 0;
     1086    Integer max = Integer.MAX_VALUE;
     1087    jj_consume_token(PIPE_Z);
     1088    switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     1089    case MINUS:{
     1090      jj_consume_token(MINUS);
     1091      max = uint();
     1092      break;
     1093      }
     1094    default:
     1095      jj_la1[41] = jj_gen;
     1096      if (jj_2_4(2)) {
     1097        min = uint();
     1098        jj_consume_token(MINUS);
     1099        switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     1100        case UINT:{
     1101          max = uint();
     1102          break;
     1103          }
     1104        default:
     1105          jj_la1[40] = jj_gen;
     1106          ;
     1107        }
     1108      } else {
     1109        switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     1110        case UINT:{
     1111          min = uint();
     1112max = min;
     1113          break;
     1114          }
     1115        default:
     1116          jj_la1[42] = jj_gen;
     1117          jj_consume_token(-1);
     1118          throw new ParseException();
     1119        }
     1120      }
     1121    }
     1122{if ("" != null) return new Pair<Integer, Integer>(min, max);}
     1123    throw new Error("Missing return statement in function");
     1124  }
     1125
     1126  final public Condition condition(Context context) throws ParseException {Condition c;
     1127    Expression e;
     1128    jj_consume_token(LSQUARE);
     1129    s();
     1130    if (jj_2_5(2147483647)) {
     1131      c = simple_key_condition(context);
     1132      s();
     1133      jj_consume_token(RSQUARE);
     1134{if ("" != null) return c;}
     1135    } else if (jj_2_6(2147483647)) {
     1136      c = simple_key_value_condition(context);
     1137      s();
     1138      jj_consume_token(RSQUARE);
     1139{if ("" != null) return c;}
     1140    } else {
     1141      switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     1142      case SET:
     1143      case IDENT:
     1144      case UINT:
     1145      case STRING:
     1146      case LPAR:
     1147      case UFLOAT:
     1148      case HEXCOLOR:
     1149      case EXCLAMATION:
     1150      case PLUS:
     1151      case MINUS:{
     1152        e = expression();
     1153        jj_consume_token(RSQUARE);
     1154{if ("" != null) return Condition.createExpressionCondition(e, context);}
     1155        break;
     1156        }
     1157      default:
     1158        jj_la1[43] = jj_gen;
     1159        jj_consume_token(-1);
     1160        throw new ParseException();
     1161      }
     1162    }
     1163    throw new Error("Missing return statement in function");
     1164  }
     1165
     1166  final public String tag_key() throws ParseException {String s, s2;
     1167    Token t;
     1168    switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     1169    case STRING:{
     1170      s = string();
     1171{if ("" != null) return s;}
     1172      break;
     1173      }
     1174    case SET:
     1175    case IDENT:{
     1176      s = ident();
     1177      label_14:
     1178      while (true) {
     1179        switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     1180        case COLON:{
     1181          ;
     1182          break;
     1183          }
     1184        default:
     1185          jj_la1[44] = jj_gen;
     1186          break label_14;
     1187        }
     1188        jj_consume_token(COLON);
     1189        s2 = ident();
     1190s += ':' + s2;
     1191      }
     1192{if ("" != null) return s;}
     1193      break;
     1194      }
     1195    default:
     1196      jj_la1[45] = jj_gen;
     1197      jj_consume_token(-1);
     1198      throw new ParseException();
     1199    }
     1200    throw new Error("Missing return statement in function");
     1201  }
     1202
     1203  final public Condition simple_key_condition(Context context) throws ParseException {boolean not = false;
     1204    Condition.KeyMatchType matchType = null;;
     1205    String key;
     1206    switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     1207    case EXCLAMATION:{
     1208      jj_consume_token(EXCLAMATION);
     1209not = true;
     1210      break;
     1211      }
     1212    default:
     1213      jj_la1[46] = jj_gen;
     1214      ;
     1215    }
     1216    switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     1217    case REGEX:{
     1218matchType = Condition.KeyMatchType.REGEX;
     1219      key = regex();
     1220      break;
     1221      }
     1222    case SET:
     1223    case IDENT:
     1224    case STRING:{
     1225      key = tag_key();
     1226      break;
     1227      }
     1228    default:
     1229      jj_la1[47] = jj_gen;
     1230      jj_consume_token(-1);
     1231      throw new ParseException();
     1232    }
     1233    if (jj_2_7(2)) {
     1234      jj_consume_token(QUESTION);
     1235      jj_consume_token(EXCLAMATION);
     1236matchType = Condition.KeyMatchType.FALSE;
     1237    } else {
     1238      ;
     1239    }
     1240    switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     1241    case QUESTION:{
     1242      jj_consume_token(QUESTION);
     1243matchType = Condition.KeyMatchType.TRUE;
     1244      break;
     1245      }
     1246    default:
     1247      jj_la1[48] = jj_gen;
     1248      ;
     1249    }
     1250{if ("" != null) return Condition.createKeyCondition(key, not, matchType, context);}
     1251    throw new Error("Missing return statement in function");
     1252  }
     1253
     1254  final public Condition simple_key_value_condition(Context context) throws ParseException {String key;
     1255    String val;
     1256    float f;
     1257    int i;
     1258    Condition.Op op;
     1259    boolean considerValAsKey = false;
     1260    key = tag_key();
     1261    s();
     1262    if (jj_2_9(3)) {
     1263      switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     1264      case EQUAL:{
     1265        jj_consume_token(EQUAL);
     1266        jj_consume_token(TILDE);
     1267op=Condition.Op.REGEX;
     1268        break;
     1269        }
     1270      case EXCLAMATION:{
     1271        jj_consume_token(EXCLAMATION);
     1272        jj_consume_token(TILDE);
     1273op=Condition.Op.NREGEX;
     1274        break;
     1275        }
     1276      default:
     1277        jj_la1[49] = jj_gen;
     1278        jj_consume_token(-1);
     1279        throw new ParseException();
     1280      }
     1281      s();
     1282      switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     1283      case STAR:{
     1284        jj_consume_token(STAR);
     1285considerValAsKey=true;
     1286        break;
     1287        }
     1288      default:
     1289        jj_la1[50] = jj_gen;
     1290        ;
     1291      }
     1292      val = regex();
     1293    } else {
     1294      switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     1295      case STAR:
     1296      case EQUAL:
     1297      case EXCLAMATION:
     1298      case TILDE:
     1299      case DOLLAR:
     1300      case CARET:{
     1301        switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     1302        case EXCLAMATION:{
     1303          jj_consume_token(EXCLAMATION);
     1304          jj_consume_token(EQUAL);
     1305op=Condition.Op.NEQ;
     1306          break;
     1307          }
     1308        case EQUAL:{
     1309          jj_consume_token(EQUAL);
     1310op=Condition.Op.EQ;
     1311          break;
     1312          }
     1313        case TILDE:{
     1314          jj_consume_token(TILDE);
     1315          jj_consume_token(EQUAL);
     1316op=Condition.Op.ONE_OF;
     1317          break;
     1318          }
     1319        case CARET:{
     1320          jj_consume_token(CARET);
     1321          jj_consume_token(EQUAL);
     1322op=Condition.Op.BEGINS_WITH;
     1323          break;
     1324          }
     1325        case DOLLAR:{
     1326          jj_consume_token(DOLLAR);
     1327          jj_consume_token(EQUAL);
     1328op=Condition.Op.ENDS_WITH;
     1329          break;
     1330          }
     1331        case STAR:{
     1332          jj_consume_token(STAR);
     1333          jj_consume_token(EQUAL);
     1334op=Condition.Op.CONTAINS;
     1335          break;
     1336          }
     1337        default:
     1338          jj_la1[51] = jj_gen;
     1339          jj_consume_token(-1);
     1340          throw new ParseException();
     1341        }
     1342        s();
     1343        switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     1344        case STAR:{
     1345          jj_consume_token(STAR);
     1346considerValAsKey=true;
     1347          break;
     1348          }
     1349        default:
     1350          jj_la1[52] = jj_gen;
     1351          ;
     1352        }
     1353        if (jj_2_8(2)) {
     1354          i = int_();
     1355val=Integer.toString(i);
     1356        } else {
     1357          switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     1358          case UINT:
     1359          case UFLOAT:
     1360          case MINUS:{
     1361            f = float_();
     1362val=Float.toString(f);
     1363            break;
     1364            }
     1365          case SET:
     1366          case IDENT:
     1367          case STRING:{
     1368            val = string_or_ident();
     1369            break;
     1370            }
     1371          default:
     1372            jj_la1[53] = jj_gen;
     1373            jj_consume_token(-1);
     1374            throw new ParseException();
     1375          }
     1376        }
     1377        break;
     1378        }
     1379      case GREATER_EQUAL:
     1380      case LESS_EQUAL:
     1381      case GREATER:
     1382      case LESS:{
     1383        switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     1384        case GREATER_EQUAL:{
     1385          jj_consume_token(GREATER_EQUAL);
     1386op=Condition.Op.GREATER_OR_EQUAL;
     1387          break;
     1388          }
     1389        case GREATER:{
     1390          jj_consume_token(GREATER);
     1391op=Condition.Op.GREATER;
     1392          break;
     1393          }
     1394        case LESS_EQUAL:{
     1395          jj_consume_token(LESS_EQUAL);
     1396op=Condition.Op.LESS_OR_EQUAL;
     1397          break;
     1398          }
     1399        case LESS:{
     1400          jj_consume_token(LESS);
     1401op=Condition.Op.LESS;
     1402          break;
     1403          }
     1404        default:
     1405          jj_la1[54] = jj_gen;
     1406          jj_consume_token(-1);
     1407          throw new ParseException();
     1408        }
     1409        s();
     1410        f = float_();
     1411val=Float.toString(f);
     1412        break;
     1413        }
     1414      default:
     1415        jj_la1[55] = jj_gen;
     1416        jj_consume_token(-1);
     1417        throw new ParseException();
     1418      }
     1419    }
     1420{if ("" != null) return Condition.createKeyValueCondition(key, val, op, context, considerValAsKey);}
     1421    throw new Error("Missing return statement in function");
     1422  }
     1423
     1424  final public Condition class_or_pseudoclass(Context context) throws ParseException {String s;
     1425    boolean not = false;
     1426    boolean pseudo;
     1427    switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     1428    case EXCLAMATION:{
     1429      jj_consume_token(EXCLAMATION);
     1430not = true;
     1431      break;
     1432      }
     1433    default:
     1434      jj_la1[56] = jj_gen;
     1435      ;
     1436    }
     1437    switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     1438    case FULLSTOP:{
     1439      jj_consume_token(FULLSTOP);
     1440pseudo = false;
     1441      break;
     1442      }
     1443    case COLON:{
     1444      jj_consume_token(COLON);
     1445pseudo = true;
     1446      break;
     1447      }
     1448    default:
     1449      jj_la1[57] = jj_gen;
     1450      jj_consume_token(-1);
     1451      throw new ParseException();
     1452    }
     1453    s = ident();
     1454{if ("" != null) return pseudo
     1455        ? Condition.createPseudoClassCondition(s, not, context)
     1456        : Condition.createClassCondition(s, not, context);}
     1457    throw new Error("Missing return statement in function");
     1458  }
     1459
     1460  final public Subpart subpart() throws ParseException {String s;
     1461    Expression e;
     1462    jj_consume_token(DCOLON);
     1463    switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     1464    case SET:
     1465    case IDENT:{
     1466      s = ident();
     1467{if ("" != null) return new Subpart.StringSubpart(s);}
     1468      break;
     1469      }
     1470    case STAR:{
     1471      jj_consume_token(STAR);
     1472{if ("" != null) return new Subpart.StringSubpart("*");}
     1473      break;
     1474      }
     1475    case LPAR:{
     1476      jj_consume_token(LPAR);
     1477      e = expression();
     1478      jj_consume_token(RPAR);
     1479{if ("" != null) return new Subpart.ExpressionSubpart(e);}
     1480      break;
     1481      }
     1482    default:
     1483      jj_la1[58] = jj_gen;
     1484      jj_consume_token(-1);
     1485      throw new ParseException();
     1486    }
     1487    throw new Error("Missing return statement in function");
     1488  }
     1489
     1490  final public Declaration declaration() throws ParseException {List<Instruction> ins = new ArrayList<Instruction>();
     1491    Instruction i;
     1492    Token key;
     1493    Object val = null;
     1494    jj_consume_token(LBRACE);
     1495    w();
     1496    label_15:
     1497    while (true) {
     1498      switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     1499      case SET:
     1500      case IDENT:{
     1501        ;
     1502        break;
     1503        }
     1504      default:
     1505        jj_la1[59] = jj_gen;
     1506        break label_15;
     1507      }
     1508      switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     1509      case SET:{
     1510        jj_consume_token(SET);
     1511        w();
     1512        switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     1513        case FULLSTOP:{
     1514          jj_consume_token(FULLSTOP);
     1515          break;
     1516          }
     1517        default:
     1518          jj_la1[60] = jj_gen;
     1519          ;
     1520        }
     1521        // specification allows "set .class" to set "class". we also support "set class"
     1522                    key = jj_consume_token(IDENT);
     1523        w();
     1524        switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     1525        case EQUAL:{
     1526          jj_consume_token(EQUAL);
     1527          val = expression();
     1528          break;
     1529          }
     1530        default:
     1531          jj_la1[61] = jj_gen;
     1532          ;
     1533        }
     1534ins.add(new Instruction.AssignmentInstruction(key.image, val == null ? true : val, true));
     1535        switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     1536        case RBRACE:{
     1537          jj_consume_token(RBRACE);
     1538{if ("" != null) return new Declaration(ins, declarationCounter++);}
     1539          break;
     1540          }
     1541        case SEMICOLON:{
     1542          jj_consume_token(SEMICOLON);
     1543          w();
     1544          break;
     1545          }
     1546        default:
     1547          jj_la1[62] = jj_gen;
     1548          jj_consume_token(-1);
     1549          throw new ParseException();
     1550        }
     1551        break;
     1552        }
     1553      case IDENT:{
     1554        key = jj_consume_token(IDENT);
     1555        w();
     1556        jj_consume_token(COLON);
     1557        w();
     1558        if (jj_2_10(2147483647)) {
     1559          val = float_array();
     1560ins.add(new Instruction.AssignmentInstruction(key.image, val, false));
     1561          w();
     1562          switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     1563          case RBRACE:{
     1564            jj_consume_token(RBRACE);
     1565{if ("" != null) return new Declaration(ins, declarationCounter++);}
     1566            break;
     1567            }
     1568          case SEMICOLON:{
     1569            jj_consume_token(SEMICOLON);
     1570            w();
     1571            break;
     1572            }
     1573          default:
     1574            jj_la1[63] = jj_gen;
     1575            jj_consume_token(-1);
     1576            throw new ParseException();
     1577          }
     1578        } else if (jj_2_11(2147483647)) {
     1579          val = expression();
     1580ins.add(new Instruction.AssignmentInstruction(key.image, val, false));
     1581          switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     1582          case RBRACE:{
     1583            jj_consume_token(RBRACE);
     1584{if ("" != null) return new Declaration(ins, declarationCounter++);}
     1585            break;
     1586            }
     1587          case SEMICOLON:{
     1588            jj_consume_token(SEMICOLON);
     1589            w();
     1590            break;
     1591            }
     1592          default:
     1593            jj_la1[64] = jj_gen;
     1594            jj_consume_token(-1);
     1595            throw new ParseException();
     1596          }
     1597        } else {
     1598          val = readRaw();
     1599          w();
     1600ins.add(new Instruction.AssignmentInstruction(key.image, val, false));
     1601        }
     1602        break;
     1603        }
     1604      default:
     1605        jj_la1[65] = jj_gen;
     1606        jj_consume_token(-1);
     1607        throw new ParseException();
     1608      }
     1609    }
     1610    jj_consume_token(RBRACE);
     1611{if ("" != null) return new Declaration(ins, declarationCounter++);}
     1612    throw new Error("Missing return statement in function");
     1613  }
     1614
     1615/**
     1616 * General expression.
     1617 * Separate production rule for each level of operator precedence (recursive descent).
     1618 */
     1619  final public Expression expression() throws ParseException {Expression e;
     1620    e = conditional_expression();
     1621{if ("" != null) return e;}
     1622    throw new Error("Missing return statement in function");
     1623  }
     1624
     1625  final public Expression conditional_expression() throws ParseException {Expression e, e1, e2;
     1626    String op = null;
     1627    e = or_expression();
     1628    switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     1629    case QUESTION:{
     1630      jj_consume_token(QUESTION);
     1631      w();
     1632      e1 = conditional_expression();
     1633      jj_consume_token(COLON);
     1634      w();
     1635      e2 = conditional_expression();
     1636e = ExpressionFactory.createFunctionExpression("cond", Arrays.asList(e, e1, e2));
     1637      break;
     1638      }
     1639    default:
     1640      jj_la1[66] = jj_gen;
     1641      ;
     1642    }
     1643{if ("" != null) return e;}
     1644    throw new Error("Missing return statement in function");
     1645  }
     1646
     1647  final public Expression or_expression() throws ParseException {Expression e, e2;
     1648    String op = null;
     1649    e = and_expression();
     1650    label_16:
     1651    while (true) {
     1652      switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     1653      case PIPE:{
     1654        ;
     1655        break;
     1656        }
     1657      default:
     1658        jj_la1[67] = jj_gen;
     1659        break label_16;
     1660      }
     1661      jj_consume_token(PIPE);
     1662      jj_consume_token(PIPE);
     1663      w();
     1664      e2 = and_expression();
     1665e = ExpressionFactory.createFunctionExpression("or", Arrays.asList(e, e2));
     1666    }
     1667{if ("" != null) return e;}
     1668    throw new Error("Missing return statement in function");
     1669  }
     1670
     1671  final public Expression and_expression() throws ParseException {Expression e, e2;
     1672    String op = null;
     1673    e = relational_expression();
     1674    label_17:
     1675    while (true) {
     1676      switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     1677      case AMPERSAND:{
     1678        ;
     1679        break;
     1680        }
     1681      default:
     1682        jj_la1[68] = jj_gen;
     1683        break label_17;
     1684      }
     1685      jj_consume_token(AMPERSAND);
     1686      jj_consume_token(AMPERSAND);
     1687      w();
     1688      e2 = relational_expression();
     1689e = ExpressionFactory.createFunctionExpression("and", Arrays.asList(e, e2));
     1690    }
     1691{if ("" != null) return e;}
     1692    throw new Error("Missing return statement in function");
     1693  }
     1694
     1695  final public Expression relational_expression() throws ParseException {Expression e, e2;
     1696    String op = null;
     1697    e = additive_expression();
     1698    switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     1699    case GREATER_EQUAL:
     1700    case LESS_EQUAL:
     1701    case GREATER:
     1702    case LESS:
     1703    case EQUAL:
     1704    case EXCLAMATION:{
     1705      switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     1706      case GREATER_EQUAL:{
     1707        jj_consume_token(GREATER_EQUAL);
     1708op = "greater_equal";
     1709        break;
     1710        }
     1711      case LESS_EQUAL:{
     1712        jj_consume_token(LESS_EQUAL);
     1713op = "less_equal";
     1714        break;
     1715        }
     1716      case GREATER:{
     1717        jj_consume_token(GREATER);
     1718op = "greater";
     1719        break;
     1720        }
     1721      case LESS:{
     1722        jj_consume_token(LESS);
     1723op = "less";
     1724        break;
     1725        }
     1726      case EQUAL:{
     1727        jj_consume_token(EQUAL);
     1728        switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     1729        case EQUAL:{
     1730          jj_consume_token(EQUAL);
     1731          break;
     1732          }
     1733        default:
     1734          jj_la1[69] = jj_gen;
     1735          ;
     1736        }
     1737op = "equal";
     1738        break;
     1739        }
     1740      case EXCLAMATION:{
     1741        jj_consume_token(EXCLAMATION);
     1742        jj_consume_token(EQUAL);
     1743op = "not_equal";
     1744        break;
     1745        }
     1746      default:
     1747        jj_la1[70] = jj_gen;
     1748        jj_consume_token(-1);
     1749        throw new ParseException();
     1750      }
     1751      w();
     1752      e2 = additive_expression();
     1753e = ExpressionFactory.createFunctionExpression(op, Arrays.asList(e, e2));
     1754      break;
     1755      }
     1756    default:
     1757      jj_la1[71] = jj_gen;
     1758      ;
     1759    }
     1760{if ("" != null) return e;}
     1761    throw new Error("Missing return statement in function");
     1762  }
     1763
     1764  final public Expression additive_expression() throws ParseException {Expression e, e2;
     1765    String op = null;
     1766    e = multiplicative_expression();
     1767    label_18:
     1768    while (true) {
     1769      switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     1770      case PLUS:
     1771      case MINUS:{
     1772        ;
     1773        break;
     1774        }
     1775      default:
     1776        jj_la1[72] = jj_gen;
     1777        break label_18;
     1778      }
     1779      switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     1780      case PLUS:{
     1781        jj_consume_token(PLUS);
     1782op = "plus";
     1783        break;
     1784        }
     1785      case MINUS:{
     1786        jj_consume_token(MINUS);
     1787op = "minus";
     1788        break;
     1789        }
     1790      default:
     1791        jj_la1[73] = jj_gen;
     1792        jj_consume_token(-1);
     1793        throw new ParseException();
     1794      }
     1795      w();
     1796      e2 = multiplicative_expression();
     1797e = ExpressionFactory.createFunctionExpression(op, Arrays.asList(e, e2));
     1798    }
     1799{if ("" != null) return e;}
     1800    throw new Error("Missing return statement in function");
     1801  }
     1802
     1803  final public Expression multiplicative_expression() throws ParseException {Expression e, e2;
     1804    String op = null;
     1805    e = unary_expression();
     1806    label_19:
     1807    while (true) {
     1808      switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     1809      case STAR:
     1810      case SLASH:{
     1811        ;
     1812        break;
     1813        }
     1814      default:
     1815        jj_la1[74] = jj_gen;
     1816        break label_19;
     1817      }
     1818      switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     1819      case STAR:{
     1820        jj_consume_token(STAR);
     1821op = "times";
     1822        break;
     1823        }
     1824      case SLASH:{
     1825        jj_consume_token(SLASH);
     1826op = "divided_by";
     1827        break;
     1828        }
     1829      default:
     1830        jj_la1[75] = jj_gen;
     1831        jj_consume_token(-1);
     1832        throw new ParseException();
     1833      }
     1834      w();
     1835      e2 = unary_expression();
     1836e = ExpressionFactory.createFunctionExpression(op, Arrays.asList(e, e2));
     1837    }
     1838{if ("" != null) return e;}
     1839    throw new Error("Missing return statement in function");
     1840  }
     1841
     1842  final public Expression unary_expression() throws ParseException {Expression e;
     1843    String op = null;
     1844    switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     1845    case EXCLAMATION:
     1846    case MINUS:{
     1847      switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     1848      case MINUS:{
     1849        jj_consume_token(MINUS);
     1850op = "minus";
     1851        w();
     1852        break;
     1853        }
     1854      case EXCLAMATION:{
     1855        jj_consume_token(EXCLAMATION);
     1856op = "not";
     1857        w();
     1858        break;
     1859        }
     1860      default:
     1861        jj_la1[76] = jj_gen;
     1862        jj_consume_token(-1);
     1863        throw new ParseException();
     1864      }
     1865      break;
     1866      }
     1867    default:
     1868      jj_la1[77] = jj_gen;
     1869      ;
     1870    }
     1871    e = primary();
     1872    w();
     1873if (op == null)
     1874            {if ("" != null) return e;}
     1875        {if ("" != null) return ExpressionFactory.createFunctionExpression(op, Collections.singletonList(e));}
     1876    throw new Error("Missing return statement in function");
     1877  }
     1878
     1879  final public Expression primary() throws ParseException {Expression nested;
     1880    Expression fn;
     1881    Object lit;
     1882    if (jj_2_12(3)) {
     1883      // both function and identifier start with an identifier (+ optional whitespace)
     1884              fn = function();
     1885{if ("" != null) return fn;}
     1886    } else {
     1887      switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     1888      case SET:
     1889      case IDENT:
     1890      case UINT:
     1891      case STRING:
     1892      case UFLOAT:
     1893      case HEXCOLOR:
     1894      case PLUS:{
     1895        lit = literal();
     1896if (lit == null)
     1897                {if ("" != null) return NullExpression.INSTANCE;}
     1898            {if ("" != null) return new LiteralExpression(lit);}
     1899        break;
     1900        }
     1901      case LPAR:{
     1902        jj_consume_token(LPAR);
     1903        w();
     1904        nested = expression();
     1905        jj_consume_token(RPAR);
     1906{if ("" != null) return nested;}
     1907        break;
     1908        }
     1909      default:
     1910        jj_la1[78] = jj_gen;
     1911        jj_consume_token(-1);
     1912        throw new ParseException();
     1913      }
     1914    }
     1915    throw new Error("Missing return statement in function");
     1916  }
     1917
     1918  final public Expression function() throws ParseException {Expression arg;
     1919    String name;
     1920    List<Expression> args = new ArrayList<Expression>();
     1921    name = ident();
     1922    w();
     1923    jj_consume_token(LPAR);
     1924    w();
     1925    switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     1926    case SET:
     1927    case IDENT:
     1928    case UINT:
     1929    case STRING:
     1930    case LPAR:
     1931    case UFLOAT:
     1932    case HEXCOLOR:
     1933    case EXCLAMATION:
     1934    case PLUS:
     1935    case MINUS:{
     1936      arg = expression();
     1937args.add(arg);
     1938      label_20:
     1939      while (true) {
     1940        switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     1941        case COMMA:{
     1942          ;
     1943          break;
     1944          }
     1945        default:
     1946          jj_la1[79] = jj_gen;
     1947          break label_20;
     1948        }
     1949        jj_consume_token(COMMA);
     1950        w();
     1951        arg = expression();
     1952args.add(arg);
     1953      }
     1954      break;
     1955      }
     1956    default:
     1957      jj_la1[80] = jj_gen;
     1958      ;
     1959    }
     1960    jj_consume_token(RPAR);
     1961{if ("" != null) return ExpressionFactory.createFunctionExpression(name, args);}
     1962    throw new Error("Missing return statement in function");
     1963  }
     1964
     1965  final public Object literal() throws ParseException {String val, pref;
     1966    Token t;
     1967    Float f;
     1968    if (jj_2_13(2)) {
     1969      pref = ident();
     1970      t = jj_consume_token(HEXCOLOR);
     1971{if ("" != null) return Main.pref.getColor("mappaint." + (sheet == null ? "MapCSS" : sheet.title) + "." + pref, ColorHelper.html2color(t.image));}
     1972    } else {
     1973      switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     1974      case IDENT:{
     1975        t = jj_consume_token(IDENT);
     1976{if ("" != null) return new Keyword(t.image);}
     1977        break;
     1978        }
     1979      case STRING:{
     1980        val = string();
     1981{if ("" != null) return val;}
     1982        break;
     1983        }
     1984      case PLUS:{
     1985        jj_consume_token(PLUS);
     1986        f = ufloat();
     1987{if ("" != null) return new Instruction.RelativeFloat(f);}
     1988        break;
     1989        }
     1990      default:
     1991        jj_la1[81] = jj_gen;
     1992        if (jj_2_14(2)) {
     1993          f = ufloat_unit();
     1994{if ("" != null) return f;}
     1995        } else {
     1996          switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     1997          case UINT:
     1998          case UFLOAT:{
     1999            f = ufloat();
     2000{if ("" != null) return f;}
     2001            break;
     2002            }
     2003          case HEXCOLOR:{
     2004            t = jj_consume_token(HEXCOLOR);
     2005{if ("" != null) return ColorHelper.html2color(t.image);}
     2006            break;
     2007            }
     2008          default:
     2009            jj_la1[82] = jj_gen;
     2010            jj_consume_token(-1);
     2011            throw new ParseException();
     2012          }
     2013        }
     2014      }
     2015    }
     2016    throw new Error("Missing return statement in function");
     2017  }
     2018
     2019/**
     2020 * Number followed by a unit.
     2021 *
     2022 * Returns angles in radians and lengths in pixels.
     2023 */
     2024  final public Float ufloat_unit() throws ParseException {float f;
     2025    String u;
     2026    f = ufloat();
     2027    switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
     2028    case SET:
     2029    case IDENT:{
     2030      u = ident();
     2031      break;
     2032      }
     2033    case DEG:{
     2034      jj_consume_token(DEG);
     2035u = "\u00b0";
     2036      break;
     2037      }
     2038    default:
     2039      jj_la1[83] = jj_gen;
     2040      jj_consume_token(-1);
     2041      throw new ParseException();
     2042    }
     2043Double m = unit_factor(u);
     2044        if (m == null)
     2045            {if ("" != null) return null;}
     2046        {if ("" != null) return (float) (f * m);}
     2047    throw new Error("Missing return statement in function");
     2048  }
     2049
     2050  private Double unit_factor(String unit) throws ParseException {switch (unit) {
     2051        case "deg":
     2052        case "\u00b0": return Math.PI / 180;
     2053        case "rad": return 1.;
     2054        case "grad": return Math.PI / 200;
     2055        case "turn": return 2 * Math.PI;
     2056        case "px": return 1.;
     2057        case "cm": return 96/2.54;
     2058        case "mm": return 9.6/2.54;
     2059        case "in": return 96.;
     2060        case "q": return 2.4/2.54;
     2061        case "pc": return 16.;
     2062        case "pt": return 96./72;
     2063        default: return null;
     2064    }
     2065  }
     2066
     2067  void error_skipto(int kind, MapCSSException me) throws ParseException {if (token.kind == EOF)
     2068        throw new ParseException("Reached end of file while parsing");
     2069
     2070    Exception e = null;
     2071    ParseException pe = generateParseException();
     2072
     2073    if (me != null) {
     2074        final Token token = Utils.firstNonNull(pe.currentToken.next, pe.currentToken);
     2075        me.setLine(token.beginLine);
     2076        me.setColumn(token.beginColumn);
     2077        e = me;
     2078    } else {
     2079        e = new ParseException(pe.getMessage()); // prevent memory leak
     2080    }
     2081
     2082    Main.error("Skipping to the next rule, because of an error:");
     2083    Main.error(e);
     2084    if (sheet != null) {
     2085        sheet.logError(e);
     2086    }
     2087    Token t;
     2088    do {
     2089        t = getNextToken();
     2090    } while (t.kind != kind && t.kind != EOF);
     2091    if (t.kind == EOF)
     2092        throw new ParseException("Reached end of file while parsing");
     2093  }
     2094
     2095/**
     2096 * read everything to the next semicolon
     2097 */
     2098  String readRaw() throws ParseException {Token t;
     2099    StringBuilder s = new StringBuilder();
     2100    while (true) {
     2101        t = getNextToken();
     2102        if ((t.kind == S || t.kind == STRING || t.kind == UNEXPECTED_CHAR) &&
     2103                t.image.contains("\n")) {
     2104            ParseException e = new ParseException(String.format("Warning: end of line while reading an unquoted string at line %s column %s.", t.beginLine, t.beginColumn));
     2105            Main.error(e);
     2106            if (sheet != null) {
     2107                sheet.logError(e);
     2108            }
     2109        }
     2110        if (t.kind == SEMICOLON || t.kind == EOF)
     2111            break;
     2112        s.append(t.image);
     2113    }
     2114    if (t.kind == EOF)
     2115        throw new ParseException("Reached end of file while parsing");
     2116    return s.toString();
     2117  }
     2118
     2119  private boolean jj_2_1(int xla)
     2120 {
     2121    jj_la = xla; jj_lastpos = jj_scanpos = token;
     2122    try { return !jj_3_1(); }
     2123    catch(LookaheadSuccess ls) { return true; }
     2124    finally { jj_save(0, xla); }
     2125  }
     2126
     2127  private boolean jj_2_2(int xla)
     2128 {
     2129    jj_la = xla; jj_lastpos = jj_scanpos = token;
     2130    try { return !jj_3_2(); }
     2131    catch(LookaheadSuccess ls) { return true; }
     2132    finally { jj_save(1, xla); }
     2133  }
     2134
     2135  private boolean jj_2_3(int xla)
     2136 {
     2137    jj_la = xla; jj_lastpos = jj_scanpos = token;
     2138    try { return !jj_3_3(); }
     2139    catch(LookaheadSuccess ls) { return true; }
     2140    finally { jj_save(2, xla); }
     2141  }
     2142
     2143  private boolean jj_2_4(int xla)
     2144 {
     2145    jj_la = xla; jj_lastpos = jj_scanpos = token;
     2146    try { return !jj_3_4(); }
     2147    catch(LookaheadSuccess ls) { return true; }
     2148    finally { jj_save(3, xla); }
     2149  }
     2150
     2151  private boolean jj_2_5(int xla)
     2152 {
     2153    jj_la = xla; jj_lastpos = jj_scanpos = token;
     2154    try { return !jj_3_5(); }
     2155    catch(LookaheadSuccess ls) { return true; }
     2156    finally { jj_save(4, xla); }
     2157  }
     2158
     2159  private boolean jj_2_6(int xla)
     2160 {
     2161    jj_la = xla; jj_lastpos = jj_scanpos = token;
     2162    try { return !jj_3_6(); }
     2163    catch(LookaheadSuccess ls) { return true; }
     2164    finally { jj_save(5, xla); }
     2165  }
     2166
     2167  private boolean jj_2_7(int xla)
     2168 {
     2169    jj_la = xla; jj_lastpos = jj_scanpos = token;
     2170    try { return !jj_3_7(); }
     2171    catch(LookaheadSuccess ls) { return true; }
     2172    finally { jj_save(6, xla); }
     2173  }
     2174
     2175  private boolean jj_2_8(int xla)
     2176 {
     2177    jj_la = xla; jj_lastpos = jj_scanpos = token;
     2178    try { return !jj_3_8(); }
     2179    catch(LookaheadSuccess ls) { return true; }
     2180    finally { jj_save(7, xla); }
     2181  }
     2182
     2183  private boolean jj_2_9(int xla)
     2184 {
     2185    jj_la = xla; jj_lastpos = jj_scanpos = token;
     2186    try { return !jj_3_9(); }
     2187    catch(LookaheadSuccess ls) { return true; }
     2188    finally { jj_save(8, xla); }
     2189  }
     2190
     2191  private boolean jj_2_10(int xla)
     2192 {
     2193    jj_la = xla; jj_lastpos = jj_scanpos = token;
     2194    try { return !jj_3_10(); }
     2195    catch(LookaheadSuccess ls) { return true; }
     2196    finally { jj_save(9, xla); }
     2197  }
     2198
     2199  private boolean jj_2_11(int xla)
     2200 {
     2201    jj_la = xla; jj_lastpos = jj_scanpos = token;
     2202    try { return !jj_3_11(); }
     2203    catch(LookaheadSuccess ls) { return true; }
     2204    finally { jj_save(10, xla); }
     2205  }
     2206
     2207  private boolean jj_2_12(int xla)
     2208 {
     2209    jj_la = xla; jj_lastpos = jj_scanpos = token;
     2210    try { return !jj_3_12(); }
     2211    catch(LookaheadSuccess ls) { return true; }
     2212    finally { jj_save(11, xla); }
     2213  }
     2214
     2215  private boolean jj_2_13(int xla)
     2216 {
     2217    jj_la = xla; jj_lastpos = jj_scanpos = token;
     2218    try { return !jj_3_13(); }
     2219    catch(LookaheadSuccess ls) { return true; }
     2220    finally { jj_save(12, xla); }
     2221  }
     2222
     2223  private boolean jj_2_14(int xla)
     2224 {
     2225    jj_la = xla; jj_lastpos = jj_scanpos = token;
     2226    try { return !jj_3_14(); }
     2227    catch(LookaheadSuccess ls) { return true; }
     2228    finally { jj_save(13, xla); }
     2229  }
     2230
     2231  private boolean jj_3_9()
     2232 {
     2233    Token xsp;
     2234    xsp = jj_scanpos;
     2235    if (jj_3R_29()) {
     2236    jj_scanpos = xsp;
     2237    if (jj_3R_30()) return true;
     2238    }
     2239    if (jj_3R_26()) return true;
     2240    xsp = jj_scanpos;
     2241    if (jj_3R_31()) jj_scanpos = xsp;
     2242    if (jj_3R_32()) return true;
     2243    return false;
     2244  }
     2245
     2246  private boolean jj_3R_78()
     2247 {
     2248    if (jj_scan_token(COMMENT_START)) return true;
     2249    if (jj_scan_token(COMMENT_END)) return true;
     2250    return false;
     2251  }
     2252
     2253  private boolean jj_3R_58()
     2254 {
     2255    if (jj_scan_token(DEG)) return true;
     2256    return false;
     2257  }
     2258
     2259  private boolean jj_3R_105()
     2260 {
     2261    if (jj_scan_token(AMPERSAND)) return true;
     2262    if (jj_scan_token(AMPERSAND)) return true;
     2263    if (jj_3R_34()) return true;
     2264    if (jj_3R_104()) return true;
     2265    return false;
     2266  }
     2267
     2268  private boolean jj_3R_46()
     2269 {
     2270    if (jj_scan_token(QUESTION)) return true;
     2271    return false;
     2272  }
     2273
     2274  private boolean jj_3R_27()
     2275 {
     2276    if (jj_3R_47()) return true;
     2277    if (jj_3R_26()) return true;
     2278    Token xsp;
     2279    xsp = jj_scanpos;
     2280    if (jj_3_9()) {
     2281    jj_scanpos = xsp;
     2282    if (jj_3R_48()) {
     2283    jj_scanpos = xsp;
     2284    if (jj_3R_49()) return true;
     2285    }
     2286    }
     2287    return false;
     2288  }
     2289
     2290  private boolean jj_3R_54()
     2291 {
     2292    Token xsp;
     2293    xsp = jj_scanpos;
     2294    if (jj_scan_token(28)) {
     2295    jj_scanpos = xsp;
     2296    if (jj_3R_78()) return true;
     2297    }
     2298    return false;
     2299  }
     2300
     2301  private boolean jj_3R_34()
     2302 {
     2303    Token xsp;
     2304    while (true) {
     2305      xsp = jj_scanpos;
     2306      if (jj_3R_54()) { jj_scanpos = xsp; break; }
     2307    }
     2308    return false;
     2309  }
     2310
     2311  private boolean jj_3R_98()
     2312 {
     2313    if (jj_3R_104()) return true;
     2314    Token xsp;
     2315    while (true) {
     2316      xsp = jj_scanpos;
     2317      if (jj_3R_105()) { jj_scanpos = xsp; break; }
     2318    }
     2319    return false;
     2320  }
     2321
     2322  private boolean jj_3R_57()
     2323 {
     2324    if (jj_3R_37()) return true;
     2325    return false;
     2326  }
     2327
     2328  private boolean jj_3R_23()
     2329 {
     2330    if (jj_scan_token(LPAR)) return true;
     2331    if (jj_3R_22()) return true;
     2332    if (jj_scan_token(IDENT)) return true;
     2333    if (jj_3R_22()) return true;
     2334    Token xsp;
     2335    xsp = jj_scanpos;
     2336    if (jj_3R_42()) jj_scanpos = xsp;
     2337    if (jj_scan_token(RPAR)) return true;
     2338    return false;
     2339  }
     2340
     2341  private boolean jj_3R_26()
     2342 {
     2343    Token xsp;
     2344    xsp = jj_scanpos;
     2345    if (jj_scan_token(28)) jj_scanpos = xsp;
     2346    return false;
     2347  }
     2348
     2349  private boolean jj_3_7()
     2350 {
     2351    if (jj_scan_token(QUESTION)) return true;
     2352    if (jj_scan_token(EXCLAMATION)) return true;
     2353    return false;
     2354  }
     2355
     2356  private boolean jj_3R_45()
     2357 {
     2358    if (jj_3R_47()) return true;
     2359    return false;
     2360  }
     2361
     2362  private boolean jj_3R_94()
     2363 {
     2364    if (jj_scan_token(COLON)) return true;
     2365    if (jj_3R_37()) return true;
     2366    return false;
     2367  }
     2368
     2369  private boolean jj_3R_44()
     2370 {
     2371    if (jj_3R_32()) return true;
     2372    return false;
     2373  }
     2374
     2375  private boolean jj_3R_103()
     2376 {
     2377    if (jj_3R_93()) return true;
     2378    return false;
     2379  }
     2380
     2381  private boolean jj_3R_99()
     2382 {
     2383    if (jj_scan_token(PIPE)) return true;
     2384    if (jj_scan_token(PIPE)) return true;
     2385    if (jj_3R_34()) return true;
     2386    if (jj_3R_98()) return true;
     2387    return false;
     2388  }
     2389
     2390  private boolean jj_3_3()
     2391 {
     2392    if (jj_3R_23()) return true;
     2393    return false;
     2394  }
     2395
     2396  private boolean jj_3R_43()
     2397 {
     2398    if (jj_scan_token(EXCLAMATION)) return true;
     2399    return false;
     2400  }
     2401
     2402  private boolean jj_3R_25()
     2403 {
     2404    Token xsp;
     2405    xsp = jj_scanpos;
     2406    if (jj_3R_43()) jj_scanpos = xsp;
     2407    xsp = jj_scanpos;
     2408    if (jj_3R_44()) {
     2409    jj_scanpos = xsp;
     2410    if (jj_3R_45()) return true;
     2411    }
     2412    xsp = jj_scanpos;
     2413    if (jj_3_7()) jj_scanpos = xsp;
     2414    xsp = jj_scanpos;
     2415    if (jj_3R_46()) jj_scanpos = xsp;
     2416    return false;
     2417  }
     2418
     2419  private boolean jj_3R_38()
     2420 {
     2421    if (jj_3R_52()) return true;
     2422    Token xsp;
     2423    xsp = jj_scanpos;
     2424    if (jj_3R_57()) {
     2425    jj_scanpos = xsp;
     2426    if (jj_3R_58()) return true;
     2427    }
     2428    return false;
     2429  }
     2430
     2431  private boolean jj_3R_97()
     2432 {
     2433    if (jj_3R_52()) return true;
     2434    return false;
     2435  }
     2436
     2437  private boolean jj_3R_79()
     2438 {
     2439    if (jj_3R_98()) return true;
     2440    Token xsp;
     2441    while (true) {
     2442      xsp = jj_scanpos;
     2443      if (jj_3R_99()) { jj_scanpos = xsp; break; }
     2444    }
     2445    return false;
     2446  }
     2447
     2448  private boolean jj_3R_32()
     2449 {
     2450    if (jj_scan_token(REGEX)) return true;
     2451    return false;
     2452  }
     2453
     2454  private boolean jj_3R_40()
     2455 {
     2456    if (jj_scan_token(LPAR)) return true;
     2457    if (jj_3R_22()) return true;
     2458    if (jj_3R_59()) return true;
     2459    if (jj_scan_token(RPAR)) return true;
     2460    return false;
     2461  }
     2462
     2463  private boolean jj_3R_63()
     2464 {
     2465    if (jj_3R_37()) return true;
     2466    Token xsp;
     2467    while (true) {
     2468      xsp = jj_scanpos;
     2469      if (jj_3R_94()) { jj_scanpos = xsp; break; }
     2470    }
     2471    return false;
     2472  }
     2473
     2474  private boolean jj_3R_39()
     2475 {
     2476    if (jj_3R_23()) return true;
     2477    return false;
     2478  }
     2479
     2480  private boolean jj_3R_47()
     2481 {
     2482    Token xsp;
     2483    xsp = jj_scanpos;
     2484    if (jj_3R_62()) {
     2485    jj_scanpos = xsp;
     2486    if (jj_3R_63()) return true;
     2487    }
     2488    return false;
     2489  }
     2490
     2491  private boolean jj_3R_62()
     2492 {
     2493    if (jj_3R_93()) return true;
     2494    return false;
     2495  }
     2496
     2497  private boolean jj_3R_102()
     2498 {
     2499    if (jj_3R_37()) return true;
     2500    return false;
     2501  }
     2502
     2503  private boolean jj_3_6()
     2504 {
     2505    if (jj_3R_27()) return true;
     2506    if (jj_3R_26()) return true;
     2507    if (jj_scan_token(RSQUARE)) return true;
     2508    return false;
     2509  }
     2510
     2511  private boolean jj_3R_95()
     2512 {
     2513    Token xsp;
     2514    xsp = jj_scanpos;
     2515    if (jj_3R_102()) {
     2516    jj_scanpos = xsp;
     2517    if (jj_3R_103()) return true;
     2518    }
     2519    return false;
     2520  }
     2521
     2522  private boolean jj_3R_92()
     2523 {
     2524    if (jj_scan_token(HEXCOLOR)) return true;
     2525    return false;
     2526  }
     2527
     2528  private boolean jj_3R_91()
     2529 {
     2530    if (jj_3R_52()) return true;
     2531    return false;
     2532  }
     2533
     2534  private boolean jj_3R_21()
     2535 {
     2536    Token xsp;
     2537    xsp = jj_scanpos;
     2538    if (jj_3R_39()) {
     2539    jj_scanpos = xsp;
     2540    if (jj_3R_40()) return true;
     2541    }
     2542    return false;
     2543  }
     2544
     2545  private boolean jj_3_5()
     2546 {
     2547    if (jj_3R_25()) return true;
     2548    if (jj_3R_26()) return true;
     2549    if (jj_scan_token(RSQUARE)) return true;
     2550    return false;
     2551  }
     2552
     2553  private boolean jj_3_14()
     2554 {
     2555    if (jj_3R_38()) return true;
     2556    return false;
     2557  }
     2558
     2559  private boolean jj_3R_90()
     2560 {
     2561    if (jj_scan_token(PLUS)) return true;
     2562    if (jj_3R_52()) return true;
     2563    return false;
     2564  }
     2565
     2566  private boolean jj_3R_80()
     2567 {
     2568    if (jj_scan_token(QUESTION)) return true;
     2569    if (jj_3R_34()) return true;
     2570    if (jj_3R_55()) return true;
     2571    if (jj_scan_token(COLON)) return true;
     2572    if (jj_3R_34()) return true;
     2573    if (jj_3R_55()) return true;
     2574    return false;
     2575  }
     2576
     2577  private boolean jj_3_2()
     2578 {
     2579    if (jj_3R_21()) return true;
     2580    if (jj_3R_22()) return true;
     2581    if (jj_scan_token(PP_OR)) return true;
     2582    return false;
     2583  }
     2584
     2585  private boolean jj_3R_89()
     2586 {
     2587    if (jj_3R_93()) return true;
     2588    return false;
     2589  }
     2590
     2591  private boolean jj_3R_37()
     2592 {
     2593    Token xsp;
     2594    xsp = jj_scanpos;
     2595    if (jj_scan_token(12)) {
     2596    jj_scanpos = xsp;
     2597    if (jj_scan_token(11)) return true;
     2598    }
     2599    return false;
     2600  }
     2601
     2602  private boolean jj_3R_51()
     2603 {
     2604    if (jj_3R_24()) return true;
     2605    return false;
     2606  }
     2607
     2608  private boolean jj_3R_88()
     2609 {
     2610    if (jj_scan_token(IDENT)) return true;
     2611    return false;
     2612  }
     2613
     2614  private boolean jj_3_1()
     2615 {
     2616    if (jj_3R_21()) return true;
     2617    if (jj_3R_22()) return true;
     2618    if (jj_scan_token(PP_AND)) return true;
     2619    return false;
     2620  }
     2621
     2622  private boolean jj_3R_101()
     2623 {
     2624    if (jj_scan_token(PP_OR)) return true;
     2625    if (jj_3R_22()) return true;
     2626    if (jj_3R_21()) return true;
     2627    if (jj_3R_22()) return true;
     2628    return false;
     2629  }
     2630
     2631  private boolean jj_3R_84()
     2632 {
     2633    if (jj_3R_21()) return true;
     2634    if (jj_3R_22()) return true;
     2635    return false;
     2636  }
     2637
     2638  private boolean jj_3R_55()
     2639 {
     2640    if (jj_3R_79()) return true;
     2641    Token xsp;
     2642    xsp = jj_scanpos;
     2643    if (jj_3R_80()) jj_scanpos = xsp;
     2644    return false;
     2645  }
     2646
     2647  private boolean jj_3_13()
     2648 {
     2649    if (jj_3R_37()) return true;
     2650    if (jj_scan_token(HEXCOLOR)) return true;
     2651    return false;
     2652  }
     2653
     2654  private boolean jj_3R_61()
     2655 {
     2656    Token xsp;
     2657    xsp = jj_scanpos;
     2658    if (jj_3_13()) {
     2659    jj_scanpos = xsp;
     2660    if (jj_3R_88()) {
     2661    jj_scanpos = xsp;
     2662    if (jj_3R_89()) {
     2663    jj_scanpos = xsp;
     2664    if (jj_3R_90()) {
     2665    jj_scanpos = xsp;
     2666    if (jj_3_14()) {
     2667    jj_scanpos = xsp;
     2668    if (jj_3R_91()) {
     2669    jj_scanpos = xsp;
     2670    if (jj_3R_92()) return true;
     2671    }
     2672    }
     2673    }
     2674    }
     2675    }
     2676    }
     2677    return false;
     2678  }
     2679
     2680  private boolean jj_3R_100()
     2681 {
     2682    if (jj_scan_token(PP_AND)) return true;
     2683    if (jj_3R_22()) return true;
     2684    if (jj_3R_21()) return true;
     2685    if (jj_3R_22()) return true;
     2686    return false;
     2687  }
     2688
     2689  private boolean jj_3R_83()
     2690 {
     2691    if (jj_3R_21()) return true;
     2692    if (jj_3R_22()) return true;
     2693    Token xsp;
     2694    if (jj_3R_101()) return true;
     2695    while (true) {
     2696      xsp = jj_scanpos;
     2697      if (jj_3R_101()) { jj_scanpos = xsp; break; }
     2698    }
     2699    return false;
     2700  }
     2701
     2702  private boolean jj_3R_93()
     2703 {
     2704    if (jj_scan_token(STRING)) return true;
     2705    return false;
     2706  }
     2707
     2708  private boolean jj_3R_82()
     2709 {
     2710    if (jj_3R_21()) return true;
     2711    if (jj_3R_22()) return true;
     2712    Token xsp;
     2713    if (jj_3R_100()) return true;
     2714    while (true) {
     2715      xsp = jj_scanpos;
     2716      if (jj_3R_100()) { jj_scanpos = xsp; break; }
     2717    }
     2718    return false;
     2719  }
     2720
     2721  private boolean jj_3R_81()
     2722 {
     2723    if (jj_scan_token(PP_NOT)) return true;
     2724    if (jj_3R_22()) return true;
     2725    if (jj_3R_21()) return true;
     2726    if (jj_3R_22()) return true;
     2727    return false;
     2728  }
     2729
     2730  private boolean jj_3R_35()
     2731 {
     2732    if (jj_3R_55()) return true;
     2733    return false;
     2734  }
     2735
     2736  private boolean jj_3R_128()
     2737 {
     2738    if (jj_scan_token(COMMA)) return true;
     2739    if (jj_3R_34()) return true;
     2740    if (jj_3R_35()) return true;
     2741    return false;
     2742  }
     2743
     2744  private boolean jj_3R_96()
     2745 {
     2746    if (jj_scan_token(MINUS)) return true;
     2747    if (jj_3R_52()) return true;
     2748    return false;
     2749  }
     2750
     2751  private boolean jj_3R_77()
     2752 {
     2753    Token xsp;
     2754    xsp = jj_scanpos;
     2755    if (jj_3R_96()) {
     2756    jj_scanpos = xsp;
     2757    if (jj_3R_97()) return true;
     2758    }
     2759    return false;
     2760  }
     2761
     2762  private boolean jj_3_11()
     2763 {
     2764    if (jj_3R_35()) return true;
     2765    Token xsp;
     2766    xsp = jj_scanpos;
     2767    if (jj_scan_token(41)) {
     2768    jj_scanpos = xsp;
     2769    if (jj_scan_token(19)) return true;
     2770    }
     2771    return false;
     2772  }
     2773
     2774  private boolean jj_3R_59()
     2775 {
     2776    Token xsp;
     2777    xsp = jj_scanpos;
     2778    if (jj_3R_81()) {
     2779    jj_scanpos = xsp;
     2780    if (jj_3R_82()) {
     2781    jj_scanpos = xsp;
     2782    if (jj_3R_83()) {
     2783    jj_scanpos = xsp;
     2784    if (jj_3R_84()) return true;
     2785    }
     2786    }
     2787    }
     2788    return false;
     2789  }
     2790
     2791  private boolean jj_3_4()
     2792 {
     2793    if (jj_3R_24()) return true;
     2794    if (jj_scan_token(MINUS)) return true;
     2795    return false;
     2796  }
     2797
     2798  private boolean jj_3R_56()
     2799 {
     2800    if (jj_3R_35()) return true;
     2801    Token xsp;
     2802    while (true) {
     2803      xsp = jj_scanpos;
     2804      if (jj_3R_128()) { jj_scanpos = xsp; break; }
     2805    }
     2806    return false;
     2807  }
     2808
     2809  private boolean jj_3_10()
     2810 {
     2811    if (jj_3R_33()) return true;
     2812    if (jj_3R_34()) return true;
     2813    Token xsp;
     2814    xsp = jj_scanpos;
     2815    if (jj_scan_token(41)) {
     2816    jj_scanpos = xsp;
     2817    if (jj_scan_token(19)) return true;
     2818    }
     2819    return false;
     2820  }
     2821
     2822  private boolean jj_3R_52()
     2823 {
     2824    Token xsp;
     2825    xsp = jj_scanpos;
     2826    if (jj_scan_token(25)) {
     2827    jj_scanpos = xsp;
     2828    if (jj_scan_token(13)) return true;
     2829    }
     2830    return false;
     2831  }
     2832
     2833  private boolean jj_3R_36()
     2834 {
     2835    if (jj_3R_37()) return true;
     2836    if (jj_3R_34()) return true;
     2837    if (jj_scan_token(LPAR)) return true;
     2838    if (jj_3R_34()) return true;
     2839    Token xsp;
     2840    xsp = jj_scanpos;
     2841    if (jj_3R_56()) jj_scanpos = xsp;
     2842    if (jj_scan_token(RPAR)) return true;
     2843    return false;
     2844  }
     2845
     2846  private boolean jj_3R_127()
     2847 {
     2848    if (jj_scan_token(LPAR)) return true;
     2849    if (jj_3R_34()) return true;
     2850    if (jj_3R_35()) return true;
     2851    if (jj_scan_token(RPAR)) return true;
     2852    return false;
     2853  }
     2854
     2855  private boolean jj_3R_28()
     2856 {
     2857    Token xsp;
     2858    xsp = jj_scanpos;
     2859    if (jj_3R_50()) {
     2860    jj_scanpos = xsp;
     2861    if (jj_3R_51()) return true;
     2862    }
     2863    return false;
     2864  }
     2865
     2866  private boolean jj_3R_50()
     2867 {
     2868    if (jj_scan_token(MINUS)) return true;
     2869    if (jj_3R_24()) return true;
     2870    return false;
     2871  }
     2872
     2873  private boolean jj_3R_126()
     2874 {
     2875    if (jj_3R_61()) return true;
     2876    return false;
     2877  }
     2878
     2879  private boolean jj_3R_24()
     2880 {
     2881    if (jj_scan_token(UINT)) return true;
     2882    return false;
     2883  }
     2884
     2885  private boolean jj_3R_121()
     2886 {
     2887    Token xsp;
     2888    xsp = jj_scanpos;
     2889    if (jj_3_12()) {
     2890    jj_scanpos = xsp;
     2891    if (jj_3R_126()) {
     2892    jj_scanpos = xsp;
     2893    if (jj_3R_127()) return true;
     2894    }
     2895    }
     2896    return false;
     2897  }
     2898
     2899  private boolean jj_3_12()
     2900 {
     2901    if (jj_3R_36()) return true;
     2902    return false;
     2903  }
     2904
     2905  private boolean jj_3R_123()
     2906 {
     2907    if (jj_scan_token(SLASH)) return true;
     2908    return false;
     2909  }
     2910
     2911  private boolean jj_3R_125()
     2912 {
     2913    if (jj_scan_token(EXCLAMATION)) return true;
     2914    if (jj_3R_34()) return true;
     2915    return false;
     2916  }
     2917
     2918  private boolean jj_3R_124()
     2919 {
     2920    if (jj_scan_token(MINUS)) return true;
     2921    if (jj_3R_34()) return true;
     2922    return false;
     2923  }
     2924
     2925  private boolean jj_3R_120()
     2926 {
     2927    Token xsp;
     2928    xsp = jj_scanpos;
     2929    if (jj_3R_124()) {
     2930    jj_scanpos = xsp;
     2931    if (jj_3R_125()) return true;
     2932    }
     2933    return false;
     2934  }
     2935
     2936  private boolean jj_3R_116()
     2937 {
     2938    Token xsp;
     2939    xsp = jj_scanpos;
     2940    if (jj_3R_120()) jj_scanpos = xsp;
     2941    if (jj_3R_121()) return true;
     2942    if (jj_3R_34()) return true;
     2943    return false;
     2944  }
     2945
     2946  private boolean jj_3R_119()
     2947 {
     2948    if (jj_scan_token(MINUS)) return true;
     2949    return false;
     2950  }
     2951
     2952  private boolean jj_3R_122()
     2953 {
     2954    if (jj_scan_token(STAR)) return true;
     2955    return false;
     2956  }
     2957
     2958  private boolean jj_3R_117()
     2959 {
     2960    Token xsp;
     2961    xsp = jj_scanpos;
     2962    if (jj_3R_122()) {
     2963    jj_scanpos = xsp;
     2964    if (jj_3R_123()) return true;
     2965    }
     2966    if (jj_3R_34()) return true;
     2967    if (jj_3R_116()) return true;
     2968    return false;
     2969  }
     2970
     2971  private boolean jj_3R_41()
     2972 {
     2973    if (jj_3R_60()) return true;
     2974    return false;
     2975  }
     2976
     2977  private boolean jj_3R_22()
     2978 {
     2979    Token xsp;
     2980    while (true) {
     2981      xsp = jj_scanpos;
     2982      if (jj_3R_41()) { jj_scanpos = xsp; break; }
     2983    }
     2984    return false;
     2985  }
     2986
     2987  private boolean jj_3R_108()
     2988 {
     2989    if (jj_3R_116()) return true;
     2990    Token xsp;
     2991    while (true) {
     2992      xsp = jj_scanpos;
     2993      if (jj_3R_117()) { jj_scanpos = xsp; break; }
     2994    }
     2995    return false;
     2996  }
     2997
     2998  private boolean jj_3R_87()
     2999 {
     3000    if (jj_scan_token(PP_COMMENT_START)) return true;
     3001    if (jj_scan_token(PP_COMMENT_END)) return true;
     3002    return false;
     3003  }
     3004
     3005  private boolean jj_3R_86()
     3006 {
     3007    if (jj_scan_token(PP_WHITESPACE)) return true;
     3008    return false;
     3009  }
     3010
     3011  private boolean jj_3R_85()
     3012 {
     3013    if (jj_scan_token(PP_NEWLINECHAR)) return true;
     3014    return false;
     3015  }
     3016
     3017  private boolean jj_3R_60()
     3018 {
     3019    Token xsp;
     3020    xsp = jj_scanpos;
     3021    if (jj_3R_85()) {
     3022    jj_scanpos = xsp;
     3023    if (jj_3R_86()) {
     3024    jj_scanpos = xsp;
     3025    if (jj_3R_87()) return true;
     3026    }
     3027    }
     3028    return false;
     3029  }
     3030
     3031  private boolean jj_3R_76()
     3032 {
     3033    if (jj_scan_token(LESS)) return true;
     3034    return false;
     3035  }
     3036
     3037  private boolean jj_3R_75()
     3038 {
     3039    if (jj_scan_token(LESS_EQUAL)) return true;
     3040    return false;
     3041  }
     3042
     3043  private boolean jj_3R_74()
     3044 {
     3045    if (jj_scan_token(GREATER)) return true;
     3046    return false;
     3047  }
     3048
     3049  private boolean jj_3R_118()
     3050 {
     3051    if (jj_scan_token(PLUS)) return true;
     3052    return false;
     3053  }
     3054
     3055  private boolean jj_3R_72()
     3056 {
     3057    if (jj_3R_95()) return true;
     3058    return false;
     3059  }
     3060
     3061  private boolean jj_3R_73()
     3062 {
     3063    if (jj_scan_token(GREATER_EQUAL)) return true;
     3064    return false;
     3065  }
     3066
     3067  private boolean jj_3R_109()
     3068 {
     3069    Token xsp;
     3070    xsp = jj_scanpos;
     3071    if (jj_3R_118()) {
     3072    jj_scanpos = xsp;
     3073    if (jj_3R_119()) return true;
     3074    }
     3075    if (jj_3R_34()) return true;
     3076    if (jj_3R_108()) return true;
     3077    return false;
     3078  }
     3079
     3080  private boolean jj_3R_71()
     3081 {
     3082    if (jj_3R_77()) return true;
     3083    return false;
     3084  }
     3085
     3086  private boolean jj_3R_106()
     3087 {
     3088    if (jj_3R_108()) return true;
     3089    Token xsp;
     3090    while (true) {
     3091      xsp = jj_scanpos;
     3092      if (jj_3R_109()) { jj_scanpos = xsp; break; }
     3093    }
     3094    return false;
     3095  }
     3096
     3097  private boolean jj_3R_42()
     3098 {
     3099    if (jj_scan_token(COLON)) return true;
     3100    if (jj_3R_22()) return true;
     3101    if (jj_3R_61()) return true;
     3102    return false;
     3103  }
     3104
     3105  private boolean jj_3R_49()
     3106 {
     3107    Token xsp;
     3108    xsp = jj_scanpos;
     3109    if (jj_3R_73()) {
     3110    jj_scanpos = xsp;
     3111    if (jj_3R_74()) {
     3112    jj_scanpos = xsp;
     3113    if (jj_3R_75()) {
     3114    jj_scanpos = xsp;
     3115    if (jj_3R_76()) return true;
     3116    }
     3117    }
     3118    }
     3119    if (jj_3R_26()) return true;
     3120    if (jj_3R_77()) return true;
     3121    return false;
     3122  }
     3123
     3124  private boolean jj_3_8()
     3125 {
     3126    if (jj_3R_28()) return true;
     3127    return false;
     3128  }
     3129
     3130  private boolean jj_3R_69()
     3131 {
     3132    if (jj_scan_token(STAR)) return true;
     3133    if (jj_scan_token(EQUAL)) return true;
     3134    return false;
     3135  }
     3136
     3137  private boolean jj_3R_68()
     3138 {
     3139    if (jj_scan_token(DOLLAR)) return true;
     3140    if (jj_scan_token(EQUAL)) return true;
     3141    return false;
     3142  }
     3143
     3144  private boolean jj_3R_70()
     3145 {
     3146    if (jj_scan_token(STAR)) return true;
     3147    return false;
     3148  }
     3149
     3150  private boolean jj_3R_115()
     3151 {
     3152    if (jj_scan_token(EXCLAMATION)) return true;
     3153    if (jj_scan_token(EQUAL)) return true;
     3154    return false;
     3155  }
     3156
     3157  private boolean jj_3R_67()
     3158 {
     3159    if (jj_scan_token(CARET)) return true;
     3160    if (jj_scan_token(EQUAL)) return true;
     3161    return false;
     3162  }
     3163
     3164  private boolean jj_3R_114()
     3165 {
     3166    if (jj_scan_token(EQUAL)) return true;
     3167    Token xsp;
     3168    xsp = jj_scanpos;
     3169    if (jj_scan_token(37)) jj_scanpos = xsp;
     3170    return false;
     3171  }
     3172
     3173  private boolean jj_3R_66()
     3174 {
     3175    if (jj_scan_token(TILDE)) return true;
     3176    if (jj_scan_token(EQUAL)) return true;
     3177    return false;
     3178  }
     3179
     3180  private boolean jj_3R_113()
     3181 {
     3182    if (jj_scan_token(LESS)) return true;
     3183    return false;
     3184  }
     3185
     3186  private boolean jj_3R_65()
     3187 {
     3188    if (jj_scan_token(EQUAL)) return true;
     3189    return false;
     3190  }
     3191
     3192  private boolean jj_3R_112()
     3193 {
     3194    if (jj_scan_token(GREATER)) return true;
     3195    return false;
     3196  }
     3197
     3198  private boolean jj_3R_64()
     3199 {
     3200    if (jj_scan_token(EXCLAMATION)) return true;
     3201    if (jj_scan_token(EQUAL)) return true;
     3202    return false;
     3203  }
     3204
     3205  private boolean jj_3R_111()
     3206 {
     3207    if (jj_scan_token(LESS_EQUAL)) return true;
     3208    return false;
     3209  }
     3210
     3211  private boolean jj_3R_110()
     3212 {
     3213    if (jj_scan_token(GREATER_EQUAL)) return true;
     3214    return false;
     3215  }
     3216
     3217  private boolean jj_3R_30()
     3218 {
     3219    if (jj_scan_token(EXCLAMATION)) return true;
     3220    if (jj_scan_token(TILDE)) return true;
     3221    return false;
     3222  }
     3223
     3224  private boolean jj_3R_107()
     3225 {
     3226    Token xsp;
     3227    xsp = jj_scanpos;
     3228    if (jj_3R_110()) {
     3229    jj_scanpos = xsp;
     3230    if (jj_3R_111()) {
     3231    jj_scanpos = xsp;
     3232    if (jj_3R_112()) {
     3233    jj_scanpos = xsp;
     3234    if (jj_3R_113()) {
     3235    jj_scanpos = xsp;
     3236    if (jj_3R_114()) {
     3237    jj_scanpos = xsp;
     3238    if (jj_3R_115()) return true;
     3239    }
     3240    }
     3241    }
     3242    }
     3243    }
     3244    if (jj_3R_34()) return true;
     3245    if (jj_3R_106()) return true;
     3246    return false;
     3247  }
     3248
     3249  private boolean jj_3R_29()
     3250 {
     3251    if (jj_scan_token(EQUAL)) return true;
     3252    if (jj_scan_token(TILDE)) return true;
     3253    return false;
     3254  }
     3255
     3256  private boolean jj_3R_48()
     3257 {
     3258    Token xsp;
     3259    xsp = jj_scanpos;
     3260    if (jj_3R_64()) {
     3261    jj_scanpos = xsp;
     3262    if (jj_3R_65()) {
     3263    jj_scanpos = xsp;
     3264    if (jj_3R_66()) {
     3265    jj_scanpos = xsp;
     3266    if (jj_3R_67()) {
     3267    jj_scanpos = xsp;
     3268    if (jj_3R_68()) {
     3269    jj_scanpos = xsp;
     3270    if (jj_3R_69()) return true;
     3271    }
     3272    }
     3273    }
     3274    }
     3275    }
     3276    if (jj_3R_26()) return true;
     3277    xsp = jj_scanpos;
     3278    if (jj_3R_70()) jj_scanpos = xsp;
     3279    xsp = jj_scanpos;
     3280    if (jj_3_8()) {
     3281    jj_scanpos = xsp;
     3282    if (jj_3R_71()) {
     3283    jj_scanpos = xsp;
     3284    if (jj_3R_72()) return true;
     3285    }
     3286    }
     3287    return false;
     3288  }
     3289
     3290  private boolean jj_3R_31()
     3291 {
     3292    if (jj_scan_token(STAR)) return true;
     3293    return false;
     3294  }
     3295
     3296  private boolean jj_3R_53()
     3297 {
     3298    if (jj_scan_token(COMMA)) return true;
     3299    if (jj_3R_26()) return true;
     3300    if (jj_3R_52()) return true;
     3301    return false;
     3302  }
     3303
     3304  private boolean jj_3R_104()
     3305 {
     3306    if (jj_3R_106()) return true;
     3307    Token xsp;
     3308    xsp = jj_scanpos;
     3309    if (jj_3R_107()) jj_scanpos = xsp;
     3310    return false;
     3311  }
     3312
     3313  private boolean jj_3R_33()
     3314 {
     3315    if (jj_3R_52()) return true;
     3316    Token xsp;
     3317    if (jj_3R_53()) return true;
     3318    while (true) {
     3319      xsp = jj_scanpos;
     3320      if (jj_3R_53()) { jj_scanpos = xsp; break; }
     3321    }
     3322    return false;
     3323  }
     3324
     3325  /** Generated Token Manager. */
     3326  public MapCSSParserTokenManager token_source;
     3327  SimpleCharStream jj_input_stream;
     3328  /** Current token. */
     3329  public Token token;
     3330  /** Next token. */
     3331  public Token jj_nt;
     3332  private int jj_ntk;
     3333  private Token jj_scanpos, jj_lastpos;
     3334  private int jj_la;
     3335  private int jj_gen;
     3336  final private int[] jj_la1 = new int[84];
     3337  static private int[] jj_la1_0;
     3338  static private int[] jj_la1_1;
     3339  static {
     3340      jj_la1_init_0();
     3341      jj_la1_init_1();
     3342   }
     3343   private static void jj_la1_init_0() {
     3344      jj_la1_0 = new int[] {0x1f671fe,0x1f2700e,0x1f671fe,0x2,0x4,0x8,0x100000,0x100000,0x800000,0x400000,0x101008,0x8,0x2,0x2,0x101000,0x800000,0x1c0,0x1c0,0x2000,0x2002000,0x2002000,0x1800,0x5800,0x10000000,0x10000000,0x10000000,0x400000,0x20001000,0x400000,0x0,0x80800000,0x80800000,0x0,0x0,0x20001000,0x20001000,0x0,0x80800000,0x80800000,0x0,0x2000,0x0,0x2000,0xa107800,0x800000,0x5800,0x0,0x25800,0x0,0x0,0x20000000,0x20000000,0x20000000,0x2007800,0x0,0x20000000,0x0,0x800000,0x20101800,0x1800,0x0,0x0,0x80000,0x80000,0x80000,0x1800,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x60000000,0x60000000,0x0,0x0,0xa107800,0x400000,0xa107800,0x5000,0xa002000,0x1800,};
     3345   }
     3346   private static void jj_la1_init_1() {
     3347      jj_la1_1 = new int[] {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x2000,0x0,0x2000,0x0,0x0,0x0,0x400000,0x400000,0x0,0x0,0x0,0x1018,0x40040,0x40040,0x301018,0x301018,0x301018,0x0,0x800,0x40040,0x40040,0x100,0x0,0x2000,0x0,0x3040,0x0,0x0,0x40,0x0,0x8000,0x60,0x0,0x300e0,0x0,0x2000,0x1e,0x300fe,0x40,0x40000,0x0,0x0,0x40000,0x20,0x200,0x200,0x200,0x0,0x8000,0x400,0x4000,0x20,0x7e,0x7e,0x3000,0x3000,0x0,0x0,0x2040,0x2040,0x1000,0x0,0x3040,0x1000,0x0,0x80000,};
     3348   }
     3349  final private JJCalls[] jj_2_rtns = new JJCalls[14];
     3350  private boolean jj_rescan = false;
     3351  private int jj_gc = 0;
     3352
     3353  /** Constructor with InputStream. */
     3354  public MapCSSParser(java.io.InputStream stream) {
     3355     this(stream, null);
     3356  }
     3357  /** Constructor with InputStream and supplied encoding */
     3358  public MapCSSParser(java.io.InputStream stream, String encoding) {
     3359    try { jj_input_stream = new SimpleCharStream(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); }
     3360    token_source = new MapCSSParserTokenManager(jj_input_stream);
     3361    token = new Token();
     3362    jj_ntk = -1;
     3363    jj_gen = 0;
     3364    for (int i = 0; i < 84; i++) jj_la1[i] = -1;
     3365    for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
     3366  }
     3367
     3368  /** Reinitialise. */
     3369  public void ReInit(java.io.InputStream stream) {
     3370     ReInit(stream, null);
     3371  }
     3372  /** Reinitialise. */
     3373  public void ReInit(java.io.InputStream stream, String encoding) {
     3374    try { jj_input_stream.ReInit(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); }
     3375    token_source.ReInit(jj_input_stream);
     3376    token = new Token();
     3377    jj_ntk = -1;
     3378    jj_gen = 0;
     3379    for (int i = 0; i < 84; i++) jj_la1[i] = -1;
     3380    for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
     3381  }
     3382
     3383  /** Constructor. */
     3384  public MapCSSParser(java.io.Reader stream) {
     3385    jj_input_stream = new SimpleCharStream(stream, 1, 1);
     3386    token_source = new MapCSSParserTokenManager(jj_input_stream);
     3387    token = new Token();
     3388    jj_ntk = -1;
     3389    jj_gen = 0;
     3390    for (int i = 0; i < 84; i++) jj_la1[i] = -1;
     3391    for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
     3392  }
     3393
     3394  /** Reinitialise. */
     3395  public void ReInit(java.io.Reader stream) {
     3396        if (jj_input_stream == null) {
     3397      jj_input_stream = new SimpleCharStream(stream, 1, 1);
     3398   } else {
     3399      jj_input_stream.ReInit(stream, 1, 1);
     3400   }
     3401   if (token_source == null) {
     3402      token_source = new MapCSSParserTokenManager(jj_input_stream);
     3403   }
     3404
     3405    token_source.ReInit(jj_input_stream);
     3406    token = new Token();
     3407    jj_ntk = -1;
     3408    jj_gen = 0;
     3409    for (int i = 0; i < 84; i++) jj_la1[i] = -1;
     3410    for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
     3411  }
     3412
     3413  /** Constructor with generated Token Manager. */
     3414  public MapCSSParser(MapCSSParserTokenManager tm) {
     3415    token_source = tm;
     3416    token = new Token();
     3417    jj_ntk = -1;
     3418    jj_gen = 0;
     3419    for (int i = 0; i < 84; i++) jj_la1[i] = -1;
     3420    for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
     3421  }
     3422
     3423  /** Reinitialise. */
     3424  public void ReInit(MapCSSParserTokenManager tm) {
     3425    token_source = tm;
     3426    token = new Token();
     3427    jj_ntk = -1;
     3428    jj_gen = 0;
     3429    for (int i = 0; i < 84; i++) jj_la1[i] = -1;
     3430    for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
     3431  }
     3432
     3433  private Token jj_consume_token(int kind) throws ParseException {
     3434    Token oldToken;
     3435    if ((oldToken = token).next != null) token = token.next;
     3436    else token = token.next = token_source.getNextToken();
     3437    jj_ntk = -1;
     3438    if (token.kind == kind) {
     3439      jj_gen++;
     3440      if (++jj_gc > 100) {
     3441        jj_gc = 0;
     3442        for (int i = 0; i < jj_2_rtns.length; i++) {
     3443          JJCalls c = jj_2_rtns[i];
     3444          while (c != null) {
     3445            if (c.gen < jj_gen) c.first = null;
     3446            c = c.next;
     3447          }
     3448        }
     3449      }
     3450      return token;
     3451    }
     3452    token = oldToken;
     3453    jj_kind = kind;
     3454    throw generateParseException();
     3455  }
     3456
     3457  @SuppressWarnings("serial")
     3458  static private final class LookaheadSuccess extends java.lang.Error { }
     3459  final private LookaheadSuccess jj_ls = new LookaheadSuccess();
     3460  private boolean jj_scan_token(int kind) {
     3461    if (jj_scanpos == jj_lastpos) {
     3462      jj_la--;
     3463      if (jj_scanpos.next == null) {
     3464        jj_lastpos = jj_scanpos = jj_scanpos.next = token_source.getNextToken();
     3465      } else {
     3466        jj_lastpos = jj_scanpos = jj_scanpos.next;
     3467      }
     3468    } else {
     3469      jj_scanpos = jj_scanpos.next;
     3470    }
     3471    if (jj_rescan) {
     3472      int i = 0; Token tok = token;
     3473      while (tok != null && tok != jj_scanpos) { i++; tok = tok.next; }
     3474      if (tok != null) jj_add_error_token(kind, i);
     3475    }
     3476    if (jj_scanpos.kind != kind) return true;
     3477    if (jj_la == 0 && jj_scanpos == jj_lastpos) throw jj_ls;
     3478    return false;
     3479  }
     3480
     3481
     3482/** Get the next Token. */
     3483  final public Token getNextToken() {
     3484    if (token.next != null) token = token.next;
     3485    else token = token.next = token_source.getNextToken();
     3486    jj_ntk = -1;
     3487    jj_gen++;
     3488    return token;
     3489  }
     3490
     3491/** Get the specific Token. */
     3492  final public Token getToken(int index) {
     3493    Token t = token;
     3494    for (int i = 0; i < index; i++) {
     3495      if (t.next != null) t = t.next;
     3496      else t = t.next = token_source.getNextToken();
     3497    }
     3498    return t;
     3499  }
     3500
     3501  private int jj_ntk_f() {
     3502    if ((jj_nt=token.next) == null)
     3503      return (jj_ntk = (token.next=token_source.getNextToken()).kind);
     3504    else
     3505      return (jj_ntk = jj_nt.kind);
     3506  }
     3507
     3508  private java.util.List<int[]> jj_expentries = new java.util.ArrayList<int[]>();
     3509  private int[] jj_expentry;
     3510  private int jj_kind = -1;
     3511  private int[] jj_lasttokens = new int[100];
     3512  private int jj_endpos;
     3513
     3514  private void jj_add_error_token(int kind, int pos) {
     3515    if (pos >= 100) {
     3516       return;
     3517    }
     3518
     3519    if (pos == jj_endpos + 1) {
     3520      jj_lasttokens[jj_endpos++] = kind;
     3521    } else if (jj_endpos != 0) {
     3522      jj_expentry = new int[jj_endpos];
     3523
     3524      for (int i = 0; i < jj_endpos; i++) {
     3525        jj_expentry[i] = jj_lasttokens[i];
     3526      }
     3527
     3528      for (int[] oldentry : jj_expentries) {
     3529        if (oldentry.length == jj_expentry.length) {
     3530          boolean isMatched = true;
     3531
     3532          for (int i = 0; i < jj_expentry.length; i++) {
     3533            if (oldentry[i] != jj_expentry[i]) {
     3534              isMatched = false;
     3535              break;
     3536            }
     3537
     3538          }
     3539          if (isMatched) {
     3540            jj_expentries.add(jj_expentry);
     3541            break;
     3542          }
     3543        }
     3544      }
     3545
     3546      if (pos != 0) {
     3547        jj_lasttokens[(jj_endpos = pos) - 1] = kind;
     3548      }
     3549    }
     3550  }
     3551
     3552  /** Generate ParseException. */
     3553  public ParseException generateParseException() {
     3554    jj_expentries.clear();
     3555    boolean[] la1tokens = new boolean[58];
     3556    if (jj_kind >= 0) {
     3557      la1tokens[jj_kind] = true;
     3558      jj_kind = -1;
     3559    }
     3560    for (int i = 0; i < 84; i++) {
     3561      if (jj_la1[i] == jj_gen) {
     3562        for (int j = 0; j < 32; j++) {
     3563          if ((jj_la1_0[i] & (1<<j)) != 0) {
     3564            la1tokens[j] = true;
     3565          }
     3566          if ((jj_la1_1[i] & (1<<j)) != 0) {
     3567            la1tokens[32+j] = true;
     3568          }
     3569        }
     3570      }
     3571    }
     3572    for (int i = 0; i < 58; i++) {
     3573      if (la1tokens[i]) {
     3574        jj_expentry = new int[1];
     3575        jj_expentry[0] = i;
     3576        jj_expentries.add(jj_expentry);
     3577      }
     3578    }
     3579    jj_endpos = 0;
     3580    jj_rescan_token();
     3581    jj_add_error_token(0, 0);
     3582    int[][] exptokseq = new int[jj_expentries.size()][];
     3583    for (int i = 0; i < jj_expentries.size(); i++) {
     3584      exptokseq[i] = jj_expentries.get(i);
     3585    }
     3586    return new ParseException(token, exptokseq, tokenImage);
     3587  }
     3588
     3589  /** Enable tracing. */
     3590  final public void enable_tracing() {
     3591  }
     3592
     3593  /** Disable tracing. */
     3594  final public void disable_tracing() {
     3595  }
     3596
     3597  private void jj_rescan_token() {
     3598    jj_rescan = true;
     3599    for (int i = 0; i < 14; i++) {
     3600      try {
     3601        JJCalls p = jj_2_rtns[i];
     3602
     3603        do {
     3604          if (p.gen > jj_gen) {
     3605            jj_la = p.arg; jj_lastpos = jj_scanpos = p.first;
     3606            switch (i) {
     3607              case 0: jj_3_1(); break;
     3608              case 1: jj_3_2(); break;
     3609              case 2: jj_3_3(); break;
     3610              case 3: jj_3_4(); break;
     3611              case 4: jj_3_5(); break;
     3612              case 5: jj_3_6(); break;
     3613              case 6: jj_3_7(); break;
     3614              case 7: jj_3_8(); break;
     3615              case 8: jj_3_9(); break;
     3616              case 9: jj_3_10(); break;
     3617              case 10: jj_3_11(); break;
     3618              case 11: jj_3_12(); break;
     3619              case 12: jj_3_13(); break;
     3620              case 13: jj_3_14(); break;
     3621            }
     3622          }
     3623          p = p.next;
     3624        } while (p != null);
     3625
     3626        } catch(LookaheadSuccess ls) { }
     3627    }
     3628    jj_rescan = false;
     3629  }
     3630
     3631  private void jj_save(int index, int xla) {
     3632    JJCalls p = jj_2_rtns[index];
     3633    while (p.gen > jj_gen) {
     3634      if (p.next == null) { p = p.next = new JJCalls(); break; }
     3635      p = p.next;
     3636    }
     3637
     3638    p.gen = jj_gen + xla - jj_la;
     3639    p.first = token;
     3640    p.arg = xla;
     3641  }
     3642
     3643  static final class JJCalls {
     3644    int gen;
     3645    Token first;
     3646    int arg;
     3647    JJCalls next;
     3648  }
     3649
     3650}
  • new file src/org/openstreetmap/josm/gui/mappaint/mapcss/parsergen/MapCSSParserConstants.java

    diff --git a/src/org/openstreetmap/josm/gui/mappaint/mapcss/parsergen/MapCSSParserConstants.java b/src/org/openstreetmap/josm/gui/mappaint/mapcss/parsergen/MapCSSParserConstants.java
    new file mode 100644
    index 0000000..34b1b33
    - +  
     1/* Generated By:JavaCC: Do not edit this line. MapCSSParserConstants.java */
     2package org.openstreetmap.josm.gui.mappaint.mapcss.parsergen;
     3
     4
     5/**
     6 * Token literal values and constants.
     7 * Generated by org.javacc.parser.OtherFilesGen#start()
     8 */
     9public interface MapCSSParserConstants {
     10
     11  /** End of File. */
     12  int EOF = 0;
     13  /** RegularExpression Id. */
     14  int PP_AND = 1;
     15  /** RegularExpression Id. */
     16  int PP_OR = 2;
     17  /** RegularExpression Id. */
     18  int PP_NOT = 3;
     19  /** RegularExpression Id. */
     20  int PP_SUPPORTS = 4;
     21  /** RegularExpression Id. */
     22  int PP_MEDIA = 5;
     23  /** RegularExpression Id. */
     24  int PP_NEWLINECHAR = 6;
     25  /** RegularExpression Id. */
     26  int PP_WHITESPACE = 7;
     27  /** RegularExpression Id. */
     28  int PP_COMMENT_START = 8;
     29  /** RegularExpression Id. */
     30  int PP_COMMENT_END = 9;
     31  /** RegularExpression Id. */
     32  int SET = 11;
     33  /** RegularExpression Id. */
     34  int IDENT = 12;
     35  /** RegularExpression Id. */
     36  int UINT = 13;
     37  /** RegularExpression Id. */
     38  int STRING = 14;
     39  /** RegularExpression Id. */
     40  int PREDEFINED = 15;
     41  /** RegularExpression Id. */
     42  int REGEX_CHAR_WITHOUT_STAR = 16;
     43  /** RegularExpression Id. */
     44  int REGEX = 17;
     45  /** RegularExpression Id. */
     46  int LBRACE = 18;
     47  /** RegularExpression Id. */
     48  int RBRACE = 19;
     49  /** RegularExpression Id. */
     50  int LPAR = 20;
     51  /** RegularExpression Id. */
     52  int RPAR = 21;
     53  /** RegularExpression Id. */
     54  int COMMA = 22;
     55  /** RegularExpression Id. */
     56  int COLON = 23;
     57  /** RegularExpression Id. */
     58  int PP_SOMETHING_ELSE = 24;
     59  /** RegularExpression Id. */
     60  int UFLOAT = 25;
     61  /** RegularExpression Id. */
     62  int H = 26;
     63  /** RegularExpression Id. */
     64  int HEXCOLOR = 27;
     65  /** RegularExpression Id. */
     66  int S = 28;
     67  /** RegularExpression Id. */
     68  int STAR = 29;
     69  /** RegularExpression Id. */
     70  int SLASH = 30;
     71  /** RegularExpression Id. */
     72  int LSQUARE = 31;
     73  /** RegularExpression Id. */
     74  int RSQUARE = 32;
     75  /** RegularExpression Id. */
     76  int GREATER_EQUAL = 33;
     77  /** RegularExpression Id. */
     78  int LESS_EQUAL = 34;
     79  /** RegularExpression Id. */
     80  int GREATER = 35;
     81  /** RegularExpression Id. */
     82  int LESS = 36;
     83  /** RegularExpression Id. */
     84  int EQUAL = 37;
     85  /** RegularExpression Id. */
     86  int EXCLAMATION = 38;
     87  /** RegularExpression Id. */
     88  int TILDE = 39;
     89  /** RegularExpression Id. */
     90  int DCOLON = 40;
     91  /** RegularExpression Id. */
     92  int SEMICOLON = 41;
     93  /** RegularExpression Id. */
     94  int PIPE = 42;
     95  /** RegularExpression Id. */
     96  int PIPE_Z = 43;
     97  /** RegularExpression Id. */
     98  int PLUS = 44;
     99  /** RegularExpression Id. */
     100  int MINUS = 45;
     101  /** RegularExpression Id. */
     102  int AMPERSAND = 46;
     103  /** RegularExpression Id. */
     104  int QUESTION = 47;
     105  /** RegularExpression Id. */
     106  int DOLLAR = 48;
     107  /** RegularExpression Id. */
     108  int CARET = 49;
     109  /** RegularExpression Id. */
     110  int FULLSTOP = 50;
     111  /** RegularExpression Id. */
     112  int DEG = 51;
     113  /** RegularExpression Id. */
     114  int ELEMENT_OF = 52;
     115  /** RegularExpression Id. */
     116  int CROSSING = 53;
     117  /** RegularExpression Id. */
     118  int COMMENT_START = 54;
     119  /** RegularExpression Id. */
     120  int UNEXPECTED_CHAR = 55;
     121  /** RegularExpression Id. */
     122  int COMMENT_END = 56;
     123
     124  /** Lexical state. */
     125  int PREPROCESSOR = 0;
     126  /** Lexical state. */
     127  int PP_COMMENT = 1;
     128  /** Lexical state. */
     129  int DEFAULT = 2;
     130  /** Lexical state. */
     131  int COMMENT = 3;
     132
     133  /** Literal token values. */
     134  String[] tokenImage = {
     135    "<EOF>",
     136    "\"and\"",
     137    "\"or\"",
     138    "\"not\"",
     139    "\"@supports\"",
     140    "\"@media\"",
     141    "<PP_NEWLINECHAR>",
     142    "<PP_WHITESPACE>",
     143    "\"/*\"",
     144    "\"*/\"",
     145    "<token of kind 10>",
     146    "\"set\"",
     147    "<IDENT>",
     148    "<UINT>",
     149    "<STRING>",
     150    "<PREDEFINED>",
     151    "<REGEX_CHAR_WITHOUT_STAR>",
     152    "<REGEX>",
     153    "\"{\"",
     154    "\"}\"",
     155    "\"(\"",
     156    "\")\"",
     157    "\",\"",
     158    "\":\"",
     159    "<PP_SOMETHING_ELSE>",
     160    "<UFLOAT>",
     161    "<H>",
     162    "<HEXCOLOR>",
     163    "<S>",
     164    "\"*\"",
     165    "\"/\"",
     166    "\"[\"",
     167    "\"]\"",
     168    "\">=\"",
     169    "\"<=\"",
     170    "\">\"",
     171    "\"<\"",
     172    "\"=\"",
     173    "\"!\"",
     174    "\"~\"",
     175    "\"::\"",
     176    "\";\"",
     177    "\"|\"",
     178    "\"|z\"",
     179    "\"+\"",
     180    "\"-\"",
     181    "\"&\"",
     182    "\"?\"",
     183    "\"$\"",
     184    "\"^\"",
     185    "\".\"",
     186    "\"\\u00b0\"",
     187    "\"\\u2208\"",
     188    "\"\\u29c9\"",
     189    "\"/*\"",
     190    "<UNEXPECTED_CHAR>",
     191    "\"*/\"",
     192    "<token of kind 57>",
     193  };
     194
     195}
  • new file src/org/openstreetmap/josm/gui/mappaint/mapcss/parsergen/MapCSSParserTokenManager.java

    diff --git a/src/org/openstreetmap/josm/gui/mappaint/mapcss/parsergen/MapCSSParserTokenManager.java b/src/org/openstreetmap/josm/gui/mappaint/mapcss/parsergen/MapCSSParserTokenManager.java
    new file mode 100644
    index 0000000..8ff2c29
    - +  
     1/* MapCSSParserTokenManager.java */
     2/* Generated By:JavaCC: Do not edit this line. MapCSSParserTokenManager.java */
     3package org.openstreetmap.josm.gui.mappaint.mapcss.parsergen;
     4import java.io.InputStream;
     5import java.io.Reader;
     6import java.util.ArrayList;
     7import java.util.Arrays;
     8import java.util.Collections;
     9import java.util.List;
     10import java.util.Locale;
     11import org.openstreetmap.josm.Main;
     12import org.openstreetmap.josm.gui.mappaint.Keyword;
     13import org.openstreetmap.josm.gui.mappaint.mapcss.Condition;
     14import org.openstreetmap.josm.gui.mappaint.mapcss.Condition.Context;
     15import org.openstreetmap.josm.gui.mappaint.mapcss.Expression;
     16import org.openstreetmap.josm.gui.mappaint.mapcss.ExpressionFactory;
     17import org.openstreetmap.josm.gui.mappaint.mapcss.ExpressionFactory.NullExpression;
     18import org.openstreetmap.josm.gui.mappaint.mapcss.Instruction;
     19import org.openstreetmap.josm.gui.mappaint.mapcss.LiteralExpression;
     20import org.openstreetmap.josm.gui.mappaint.mapcss.MapCSSException;
     21import org.openstreetmap.josm.gui.mappaint.mapcss.MapCSSRule;
     22import org.openstreetmap.josm.gui.mappaint.mapcss.MapCSSRule.Declaration;
     23import org.openstreetmap.josm.gui.mappaint.mapcss.MapCSSStyleSource;
     24import org.openstreetmap.josm.gui.mappaint.mapcss.Selector;
     25import org.openstreetmap.josm.gui.mappaint.mapcss.Selector.ChildOrParentSelector;
     26import org.openstreetmap.josm.gui.mappaint.mapcss.Selector.GeneralSelector;
     27import org.openstreetmap.josm.gui.mappaint.mapcss.Selector.LinkSelector;
     28import org.openstreetmap.josm.gui.mappaint.mapcss.Subpart;
     29import org.openstreetmap.josm.tools.ColorHelper;
     30import org.openstreetmap.josm.tools.Pair;
     31import org.openstreetmap.josm.tools.Utils;
     32
     33/** Token Manager. */
     34@SuppressWarnings("unused")public class MapCSSParserTokenManager implements MapCSSParserConstants {
     35
     36  /** Debug output. */
     37  public  java.io.PrintStream debugStream = System.out;
     38  /** Set debug output. */
     39  public  void setDebugStream(java.io.PrintStream ds) { debugStream = ds; }
     40private int jjStopAtPos(int pos, int kind)
     41{
     42   jjmatchedKind = kind;
     43   jjmatchedPos = pos;
     44   return pos + 1;
     45}
     46private int jjMoveStringLiteralDfa0_2(){
     47   switch(curChar)
     48   {
     49      case 33:
     50         jjmatchedKind = 38;
     51         return jjMoveNfa_2(0, 0);
     52      case 36:
     53         jjmatchedKind = 48;
     54         return jjMoveNfa_2(0, 0);
     55      case 38:
     56         jjmatchedKind = 46;
     57         return jjMoveNfa_2(0, 0);
     58      case 40:
     59         jjmatchedKind = 20;
     60         return jjMoveNfa_2(0, 0);
     61      case 41:
     62         jjmatchedKind = 21;
     63         return jjMoveNfa_2(0, 0);
     64      case 42:
     65         jjmatchedKind = 29;
     66         return jjMoveNfa_2(0, 0);
     67      case 43:
     68         jjmatchedKind = 44;
     69         return jjMoveNfa_2(0, 0);
     70      case 44:
     71         jjmatchedKind = 22;
     72         return jjMoveNfa_2(0, 0);
     73      case 45:
     74         jjmatchedKind = 45;
     75         return jjMoveNfa_2(0, 0);
     76      case 46:
     77         jjmatchedKind = 50;
     78         return jjMoveNfa_2(0, 0);
     79      case 47:
     80         jjmatchedKind = 30;
     81         return jjMoveStringLiteralDfa1_2(0x40000000000000L);
     82      case 58:
     83         jjmatchedKind = 23;
     84         return jjMoveStringLiteralDfa1_2(0x10000000000L);
     85      case 59:
     86         jjmatchedKind = 41;
     87         return jjMoveNfa_2(0, 0);
     88      case 60:
     89         jjmatchedKind = 36;
     90         return jjMoveStringLiteralDfa1_2(0x400000000L);
     91      case 61:
     92         jjmatchedKind = 37;
     93         return jjMoveNfa_2(0, 0);
     94      case 62:
     95         jjmatchedKind = 35;
     96         return jjMoveStringLiteralDfa1_2(0x200000000L);
     97      case 63:
     98         jjmatchedKind = 47;
     99         return jjMoveNfa_2(0, 0);
     100      case 83:
     101         return jjMoveStringLiteralDfa1_2(0x800L);
     102      case 91:
     103         jjmatchedKind = 31;
     104         return jjMoveNfa_2(0, 0);
     105      case 93:
     106         jjmatchedKind = 32;
     107         return jjMoveNfa_2(0, 0);
     108      case 94:
     109         jjmatchedKind = 49;
     110         return jjMoveNfa_2(0, 0);
     111      case 115:
     112         return jjMoveStringLiteralDfa1_2(0x800L);
     113      case 123:
     114         jjmatchedKind = 18;
     115         return jjMoveNfa_2(0, 0);
     116      case 124:
     117         jjmatchedKind = 42;
     118         return jjMoveStringLiteralDfa1_2(0x80000000000L);
     119      case 125:
     120         jjmatchedKind = 19;
     121         return jjMoveNfa_2(0, 0);
     122      case 126:
     123         jjmatchedKind = 39;
     124         return jjMoveNfa_2(0, 0);
     125      case 176:
     126         jjmatchedKind = 51;
     127         return jjMoveNfa_2(0, 0);
     128      case 8712:
     129         jjmatchedKind = 52;
     130         return jjMoveNfa_2(0, 0);
     131      case 10697:
     132         jjmatchedKind = 53;
     133         return jjMoveNfa_2(0, 0);
     134      default :
     135         return jjMoveNfa_2(0, 0);
     136   }
     137}
     138private int jjMoveStringLiteralDfa1_2(long active0){
     139   try { curChar = input_stream.readChar(); }
     140   catch(java.io.IOException e) {
     141   return jjMoveNfa_2(0, 0);
     142   }
     143   switch(curChar)
     144   {
     145      case 42:
     146         if ((active0 & 0x40000000000000L) != 0L)
     147         {
     148            jjmatchedKind = 54;
     149            jjmatchedPos = 1;
     150         }
     151         break;
     152      case 58:
     153         if ((active0 & 0x10000000000L) != 0L)
     154         {
     155            jjmatchedKind = 40;
     156            jjmatchedPos = 1;
     157         }
     158         break;
     159      case 61:
     160         if ((active0 & 0x200000000L) != 0L)
     161         {
     162            jjmatchedKind = 33;
     163            jjmatchedPos = 1;
     164         }
     165         else if ((active0 & 0x400000000L) != 0L)
     166         {
     167            jjmatchedKind = 34;
     168            jjmatchedPos = 1;
     169         }
     170         break;
     171      case 69:
     172         return jjMoveStringLiteralDfa2_2(active0, 0x800L);
     173      case 101:
     174         return jjMoveStringLiteralDfa2_2(active0, 0x800L);
     175      case 122:
     176         if ((active0 & 0x80000000000L) != 0L)
     177         {
     178            jjmatchedKind = 43;
     179            jjmatchedPos = 1;
     180         }
     181         break;
     182      default :
     183         break;
     184   }
     185   return jjMoveNfa_2(0, 1);
     186}
     187private int jjMoveStringLiteralDfa2_2(long old0, long active0){
     188   if (((active0 &= old0)) == 0L)
     189      return jjMoveNfa_2(0, 1);
     190   try { curChar = input_stream.readChar(); }
     191   catch(java.io.IOException e) {
     192   return jjMoveNfa_2(0, 1);
     193   }
     194   switch(curChar)
     195   {
     196      case 84:
     197         if ((active0 & 0x800L) != 0L)
     198         {
     199            jjmatchedKind = 11;
     200            jjmatchedPos = 2;
     201         }
     202         break;
     203      case 116:
     204         if ((active0 & 0x800L) != 0L)
     205         {
     206            jjmatchedKind = 11;
     207            jjmatchedPos = 2;
     208         }
     209         break;
     210      default :
     211         break;
     212   }
     213   return jjMoveNfa_2(0, 2);
     214}
     215static final long[] jjbitVec0 = {
     216   0xfffffffffffffffeL, 0xffffffffffffffffL, 0xffffffffffffffffL, 0xffffffffffffffffL
     217};
     218static final long[] jjbitVec2 = {
     219   0x0L, 0x0L, 0xffffffffffffffffL, 0xffffffffffffffffL
     220};
     221private int jjMoveNfa_2(int startState, int curPos)
     222{
     223   int strKind = jjmatchedKind;
     224   int strPos = jjmatchedPos;
     225   int seenUpto;
     226   input_stream.backup(seenUpto = curPos + 1);
     227   try { curChar = input_stream.readChar(); }
     228   catch(java.io.IOException e) { throw new Error("Internal Error"); }
     229   curPos = 0;
     230   int startsAt = 0;
     231   jjnewStateCnt = 53;
     232   int i = 1;
     233   jjstateSet[0] = startState;
     234   int kind = 0x7fffffff;
     235   for (;;)
     236   {
     237      if (++jjround == 0x7fffffff)
     238         ReInitRounds();
     239      if (curChar < 64)
     240      {
     241         long l = 1L << curChar;
     242         do
     243         {
     244            switch(jjstateSet[--i])
     245            {
     246               case 0:
     247                  if ((0x3ff000000000000L & l) != 0L)
     248                  {
     249                     if (kind > 25)
     250                        kind = 25;
     251                     { jjCheckNAddTwoStates(35, 36); }
     252                  }
     253                  else if ((0x100003600L & l) != 0L)
     254                  {
     255                     if (kind > 28)
     256                        kind = 28;
     257                     { jjCheckNAdd(52); }
     258                  }
     259                  else if (curChar == 35)
     260                     jjstateSet[jjnewStateCnt++] = 39;
     261                  else if (curChar == 47)
     262                     { jjAddStates(0, 2); }
     263                  else if (curChar == 34)
     264                     { jjCheckNAddStates(3, 5); }
     265                  if ((0x3fe000000000000L & l) != 0L)
     266                  {
     267                     if (kind > 13)
     268                        kind = 13;
     269                     { jjCheckNAdd(3); }
     270                  }
     271                  break;
     272               case 1:
     273                  if ((0x3ff200000000000L & l) == 0L)
     274                     break;
     275                  if (kind > 12)
     276                     kind = 12;
     277                  jjstateSet[jjnewStateCnt++] = 1;
     278                  break;
     279               case 2:
     280                  if ((0x3fe000000000000L & l) == 0L)
     281                     break;
     282                  if (kind > 13)
     283                     kind = 13;
     284                  { jjCheckNAdd(3); }
     285                  break;
     286               case 3:
     287                  if ((0x3ff000000000000L & l) == 0L)
     288                     break;
     289                  if (kind > 13)
     290                     kind = 13;
     291                  { jjCheckNAdd(3); }
     292                  break;
     293               case 4:
     294               case 8:
     295                  if (curChar == 34)
     296                     { jjCheckNAddStates(3, 5); }
     297                  break;
     298               case 5:
     299                  if ((0xfffffffb00000000L & l) != 0L)
     300                     { jjCheckNAddStates(3, 5); }
     301                  break;
     302               case 6:
     303                  if (curChar == 34 && kind > 14)
     304                     kind = 14;
     305                  break;
     306               case 10:
     307                  if (curChar == 47)
     308                     { jjAddStates(0, 2); }
     309                  break;
     310               case 11:
     311                  if ((0xffff7bff00000000L & l) != 0L)
     312                     { jjCheckNAddStates(6, 9); }
     313                  break;
     314               case 12:
     315                  if ((0xffff7fff00000000L & l) != 0L)
     316                     { jjCheckNAddStates(6, 9); }
     317                  break;
     318               case 15:
     319                  if (curChar == 47 && kind > 17)
     320                     kind = 17;
     321                  break;
     322               case 17:
     323                  if (curChar == 36)
     324                     { jjCheckNAddStates(6, 9); }
     325                  break;
     326               case 19:
     327                  if (curChar == 42)
     328                     { jjCheckNAddStates(6, 9); }
     329                  break;
     330               case 20:
     331                  if (curChar == 63)
     332                     { jjCheckNAddStates(6, 9); }
     333                  break;
     334               case 23:
     335                  if (curChar == 41)
     336                     { jjCheckNAddStates(6, 9); }
     337                  break;
     338               case 24:
     339                  if (curChar == 40)
     340                     { jjCheckNAddStates(6, 9); }
     341                  break;
     342               case 25:
     343                  if (curChar == 34)
     344                     { jjCheckNAddStates(6, 9); }
     345                  break;
     346               case 26:
     347                  if (curChar == 39)
     348                     { jjCheckNAddStates(6, 9); }
     349                  break;
     350               case 27:
     351                  if (curChar == 46)
     352                     { jjCheckNAddStates(6, 9); }
     353                  break;
     354               case 28:
     355                  if (curChar == 43)
     356                     { jjCheckNAddStates(6, 9); }
     357                  break;
     358               case 32:
     359                  if (curChar == 47)
     360                     { jjCheckNAddStates(6, 9); }
     361                  break;
     362               case 35:
     363                  if ((0x3ff000000000000L & l) == 0L)
     364                     break;
     365                  if (kind > 25)
     366                     kind = 25;
     367                  { jjCheckNAddTwoStates(35, 36); }
     368                  break;
     369               case 36:
     370                  if (curChar == 46)
     371                     { jjCheckNAdd(37); }
     372                  break;
     373               case 37:
     374                  if ((0x3ff000000000000L & l) == 0L)
     375                     break;
     376                  if (kind > 25)
     377                     kind = 25;
     378                  { jjCheckNAdd(37); }
     379                  break;
     380               case 38:
     381                  if (curChar == 35)
     382                     jjstateSet[jjnewStateCnt++] = 39;
     383                  break;
     384               case 39:
     385                  if ((0x3ff000000000000L & l) != 0L)
     386                     { jjAddStates(10, 12); }
     387                  break;
     388               case 40:
     389                  if ((0x3ff000000000000L & l) != 0L)
     390                     jjstateSet[jjnewStateCnt++] = 41;
     391                  break;
     392               case 41:
     393                  if ((0x3ff000000000000L & l) != 0L)
     394                     jjstateSet[jjnewStateCnt++] = 42;
     395                  break;
     396               case 42:
     397                  if ((0x3ff000000000000L & l) != 0L)
     398                     jjstateSet[jjnewStateCnt++] = 43;
     399                  break;
     400               case 43:
     401                  if ((0x3ff000000000000L & l) != 0L)
     402                     jjstateSet[jjnewStateCnt++] = 44;
     403                  break;
     404               case 44:
     405                  if ((0x3ff000000000000L & l) != 0L)
     406                     jjstateSet[jjnewStateCnt++] = 45;
     407                  break;
     408               case 45:
     409               case 50:
     410               case 51:
     411                  if ((0x3ff000000000000L & l) != 0L)
     412                     { jjCheckNAdd(46); }
     413                  break;
     414               case 46:
     415                  if ((0x3ff000000000000L & l) != 0L && kind > 27)
     416                     kind = 27;
     417                  break;
     418               case 47:
     419                  if ((0x3ff000000000000L & l) != 0L)
     420                     jjstateSet[jjnewStateCnt++] = 48;
     421                  break;
     422               case 48:
     423                  if ((0x3ff000000000000L & l) != 0L)
     424                     jjstateSet[jjnewStateCnt++] = 49;
     425                  break;
     426               case 49:
     427                  if ((0x3ff000000000000L & l) != 0L)
     428                     jjstateSet[jjnewStateCnt++] = 50;
     429                  break;
     430               case 52:
     431                  if ((0x100003600L & l) == 0L)
     432                     break;
     433                  if (kind > 28)
     434                     kind = 28;
     435                  { jjCheckNAdd(52); }
     436                  break;
     437               default : break;
     438            }
     439         } while(i != startsAt);
     440      }
     441      else if (curChar < 128)
     442      {
     443         long l = 1L << (curChar & 077);
     444         do
     445         {
     446            switch(jjstateSet[--i])
     447            {
     448               case 0:
     449               case 1:
     450                  if ((0x7fffffe87fffffeL & l) == 0L)
     451                     break;
     452                  if (kind > 12)
     453                     kind = 12;
     454                  { jjCheckNAdd(1); }
     455                  break;
     456               case 5:
     457                  if ((0x7fffffffefffffffL & l) != 0L)
     458                     { jjCheckNAddStates(3, 5); }
     459                  break;
     460               case 7:
     461                  if (curChar == 92)
     462                     { jjAddStates(13, 14); }
     463                  break;
     464               case 9:
     465                  if (curChar == 92)
     466                     { jjCheckNAddStates(3, 5); }
     467                  break;
     468               case 11:
     469               case 12:
     470                  if ((0x7fffffffefffffffL & l) != 0L)
     471                     { jjCheckNAddStates(6, 9); }
     472                  break;
     473               case 13:
     474               case 33:
     475                  if (curChar == 92)
     476                     { jjCheckNAdd(14); }
     477                  break;
     478               case 14:
     479                  if ((0x488001404880096L & l) != 0L)
     480                     { jjCheckNAddStates(6, 9); }
     481                  break;
     482               case 16:
     483                  if (curChar == 92)
     484                     { jjCheckNAddStates(15, 30); }
     485                  break;
     486               case 18:
     487                  if (curChar == 94)
     488                     { jjCheckNAddStates(6, 9); }
     489                  break;
     490               case 21:
     491                  if (curChar == 125)
     492                     { jjCheckNAddStates(6, 9); }
     493                  break;
     494               case 22:
     495                  if (curChar == 123)
     496                     { jjCheckNAddStates(6, 9); }
     497                  break;
     498               case 29:
     499                  if (curChar == 93)
     500                     { jjCheckNAddStates(6, 9); }
     501                  break;
     502               case 30:
     503                  if (curChar == 91)
     504                     { jjCheckNAddStates(6, 9); }
     505                  break;
     506               case 31:
     507                  if (curChar == 92)
     508                     { jjCheckNAddStates(6, 9); }
     509                  break;
     510               case 34:
     511                  if (curChar == 92)
     512                     { jjCheckNAddStates(31, 46); }
     513                  break;
     514               case 39:
     515                  if ((0x7e0000007eL & l) != 0L)
     516                     { jjAddStates(10, 12); }
     517                  break;
     518               case 40:
     519                  if ((0x7e0000007eL & l) != 0L)
     520                     jjstateSet[jjnewStateCnt++] = 41;
     521                  break;
     522               case 41:
     523                  if ((0x7e0000007eL & l) != 0L)
     524                     jjstateSet[jjnewStateCnt++] = 42;
     525                  break;
     526               case 42:
     527                  if ((0x7e0000007eL & l) != 0L)
     528                     jjstateSet[jjnewStateCnt++] = 43;
     529                  break;
     530               case 43:
     531                  if ((0x7e0000007eL & l) != 0L)
     532                     jjstateSet[jjnewStateCnt++] = 44;
     533                  break;
     534               case 44:
     535                  if ((0x7e0000007eL & l) != 0L)
     536                     jjstateSet[jjnewStateCnt++] = 45;
     537                  break;
     538               case 45:
     539               case 50:
     540               case 51:
     541                  if ((0x7e0000007eL & l) != 0L)
     542                     { jjCheckNAdd(46); }
     543                  break;
     544               case 46:
     545                  if ((0x7e0000007eL & l) != 0L && kind > 27)
     546                     kind = 27;
     547                  break;
     548               case 47:
     549                  if ((0x7e0000007eL & l) != 0L)
     550                     jjstateSet[jjnewStateCnt++] = 48;
     551                  break;
     552               case 48:
     553                  if ((0x7e0000007eL & l) != 0L)
     554                     jjstateSet[jjnewStateCnt++] = 49;
     555                  break;
     556               case 49:
     557                  if ((0x7e0000007eL & l) != 0L)
     558                     jjstateSet[jjnewStateCnt++] = 50;
     559                  break;
     560               default : break;
     561            }
     562         } while(i != startsAt);
     563      }
     564      else
     565      {
     566         int hiByte = (curChar >> 8);
     567         int i1 = hiByte >> 6;
     568         long l1 = 1L << (hiByte & 077);
     569         int i2 = (curChar & 0xff) >> 6;
     570         long l2 = 1L << (curChar & 077);
     571         do
     572         {
     573            switch(jjstateSet[--i])
     574            {
     575               case 5:
     576                  if (jjCanMove_0(hiByte, i1, i2, l1, l2))
     577                     { jjAddStates(3, 5); }
     578                  break;
     579               case 11:
     580               case 12:
     581                  if (jjCanMove_0(hiByte, i1, i2, l1, l2))
     582                     { jjCheckNAddStates(6, 9); }
     583                  break;
     584               default : if (i1 == 0 || l1 == 0 || i2 == 0 ||  l2 == 0) break; else break;
     585            }
     586         } while(i != startsAt);
     587      }
     588      if (kind != 0x7fffffff)
     589      {
     590         jjmatchedKind = kind;
     591         jjmatchedPos = curPos;
     592         kind = 0x7fffffff;
     593      }
     594      ++curPos;
     595      if ((i = jjnewStateCnt) == (startsAt = 53 - (jjnewStateCnt = startsAt)))
     596         break;
     597      try { curChar = input_stream.readChar(); }
     598      catch(java.io.IOException e) { break; }
     599   }
     600   if (jjmatchedPos > strPos)
     601      return curPos;
     602
     603   int toRet = Math.max(curPos, seenUpto);
     604
     605   if (curPos < toRet)
     606      for (i = toRet - Math.min(curPos, seenUpto); i-- > 0; )
     607         try { curChar = input_stream.readChar(); }
     608         catch(java.io.IOException e) { throw new Error("Internal Error : Please send a bug report."); }
     609
     610   if (jjmatchedPos < strPos)
     611   {
     612      jjmatchedKind = strKind;
     613      jjmatchedPos = strPos;
     614   }
     615   else if (jjmatchedPos == strPos && jjmatchedKind > strKind)
     616      jjmatchedKind = strKind;
     617
     618   return toRet;
     619}
     620private final int jjStopStringLiteralDfa_0(int pos, long active0){
     621   switch (pos)
     622   {
     623      case 0:
     624         if ((active0 & 0xeL) != 0L)
     625         {
     626            jjmatchedKind = 12;
     627            return 3;
     628         }
     629         if ((active0 & 0x100L) != 0L)
     630            return 13;
     631         return -1;
     632      case 1:
     633         if ((active0 & 0x4L) != 0L)
     634            return 3;
     635         if ((active0 & 0xaL) != 0L)
     636         {
     637            jjmatchedKind = 12;
     638            jjmatchedPos = 1;
     639            return 3;
     640         }
     641         return -1;
     642      case 2:
     643         if ((active0 & 0xaL) != 0L)
     644            return 3;
     645         return -1;
     646      default :
     647         return -1;
     648   }
     649}
     650private final int jjStartNfa_0(int pos, long active0){
     651   return jjMoveNfa_0(jjStopStringLiteralDfa_0(pos, active0), pos + 1);
     652}
     653private int jjMoveStringLiteralDfa0_0(){
     654   switch(curChar)
     655   {
     656      case 40:
     657         return jjStopAtPos(0, 20);
     658      case 41:
     659         return jjStopAtPos(0, 21);
     660      case 44:
     661         return jjStopAtPos(0, 22);
     662      case 47:
     663         return jjMoveStringLiteralDfa1_0(0x100L);
     664      case 58:
     665         return jjStopAtPos(0, 23);
     666      case 64:
     667         return jjMoveStringLiteralDfa1_0(0x30L);
     668      case 97:
     669         return jjMoveStringLiteralDfa1_0(0x2L);
     670      case 110:
     671         return jjMoveStringLiteralDfa1_0(0x8L);
     672      case 111:
     673         return jjMoveStringLiteralDfa1_0(0x4L);
     674      case 123:
     675         return jjStopAtPos(0, 18);
     676      case 125:
     677         return jjStopAtPos(0, 19);
     678      default :
     679         return jjMoveNfa_0(0, 0);
     680   }
     681}
     682private int jjMoveStringLiteralDfa1_0(long active0){
     683   try { curChar = input_stream.readChar(); }
     684   catch(java.io.IOException e) {
     685      jjStopStringLiteralDfa_0(0, active0);
     686      return 1;
     687   }
     688   switch(curChar)
     689   {
     690      case 42:
     691         if ((active0 & 0x100L) != 0L)
     692            return jjStopAtPos(1, 8);
     693         break;
     694      case 109:
     695         return jjMoveStringLiteralDfa2_0(active0, 0x20L);
     696      case 110:
     697         return jjMoveStringLiteralDfa2_0(active0, 0x2L);
     698      case 111:
     699         return jjMoveStringLiteralDfa2_0(active0, 0x8L);
     700      case 114:
     701         if ((active0 & 0x4L) != 0L)
     702            return jjStartNfaWithStates_0(1, 2, 3);
     703         break;
     704      case 115:
     705         return jjMoveStringLiteralDfa2_0(active0, 0x10L);
     706      default :
     707         break;
     708   }
     709   return jjStartNfa_0(0, active0);
     710}
     711private int jjMoveStringLiteralDfa2_0(long old0, long active0){
     712   if (((active0 &= old0)) == 0L)
     713      return jjStartNfa_0(0, old0);
     714   try { curChar = input_stream.readChar(); }
     715   catch(java.io.IOException e) {
     716      jjStopStringLiteralDfa_0(1, active0);
     717      return 2;
     718   }
     719   switch(curChar)
     720   {
     721      case 100:
     722         if ((active0 & 0x2L) != 0L)
     723            return jjStartNfaWithStates_0(2, 1, 3);
     724         break;
     725      case 101:
     726         return jjMoveStringLiteralDfa3_0(active0, 0x20L);
     727      case 116:
     728         if ((active0 & 0x8L) != 0L)
     729            return jjStartNfaWithStates_0(2, 3, 3);
     730         break;
     731      case 117:
     732         return jjMoveStringLiteralDfa3_0(active0, 0x10L);
     733      default :
     734         break;
     735   }
     736   return jjStartNfa_0(1, active0);
     737}
     738private int jjMoveStringLiteralDfa3_0(long old0, long active0){
     739   if (((active0 &= old0)) == 0L)
     740      return jjStartNfa_0(1, old0);
     741   try { curChar = input_stream.readChar(); }
     742   catch(java.io.IOException e) {
     743      jjStopStringLiteralDfa_0(2, active0);
     744      return 3;
     745   }
     746   switch(curChar)
     747   {
     748      case 100:
     749         return jjMoveStringLiteralDfa4_0(active0, 0x20L);
     750      case 112:
     751         return jjMoveStringLiteralDfa4_0(active0, 0x10L);
     752      default :
     753         break;
     754   }
     755   return jjStartNfa_0(2, active0);
     756}
     757private int jjMoveStringLiteralDfa4_0(long old0, long active0){
     758   if (((active0 &= old0)) == 0L)
     759      return jjStartNfa_0(2, old0);
     760   try { curChar = input_stream.readChar(); }
     761   catch(java.io.IOException e) {
     762      jjStopStringLiteralDfa_0(3, active0);
     763      return 4;
     764   }
     765   switch(curChar)
     766   {
     767      case 105:
     768         return jjMoveStringLiteralDfa5_0(active0, 0x20L);
     769      case 112:
     770         return jjMoveStringLiteralDfa5_0(active0, 0x10L);
     771      default :
     772         break;
     773   }
     774   return jjStartNfa_0(3, active0);
     775}
     776private int jjMoveStringLiteralDfa5_0(long old0, long active0){
     777   if (((active0 &= old0)) == 0L)
     778      return jjStartNfa_0(3, old0);
     779   try { curChar = input_stream.readChar(); }
     780   catch(java.io.IOException e) {
     781      jjStopStringLiteralDfa_0(4, active0);
     782      return 5;
     783   }
     784   switch(curChar)
     785   {
     786      case 97:
     787         if ((active0 & 0x20L) != 0L)
     788            return jjStopAtPos(5, 5);
     789         break;
     790      case 111:
     791         return jjMoveStringLiteralDfa6_0(active0, 0x10L);
     792      default :
     793         break;
     794   }
     795   return jjStartNfa_0(4, active0);
     796}
     797private int jjMoveStringLiteralDfa6_0(long old0, long active0){
     798   if (((active0 &= old0)) == 0L)
     799      return jjStartNfa_0(4, old0);
     800   try { curChar = input_stream.readChar(); }
     801   catch(java.io.IOException e) {
     802      jjStopStringLiteralDfa_0(5, active0);
     803      return 6;
     804   }
     805   switch(curChar)
     806   {
     807      case 114:
     808         return jjMoveStringLiteralDfa7_0(active0, 0x10L);
     809      default :
     810         break;
     811   }
     812   return jjStartNfa_0(5, active0);
     813}
     814private int jjMoveStringLiteralDfa7_0(long old0, long active0){
     815   if (((active0 &= old0)) == 0L)
     816      return jjStartNfa_0(5, old0);
     817   try { curChar = input_stream.readChar(); }
     818   catch(java.io.IOException e) {
     819      jjStopStringLiteralDfa_0(6, active0);
     820      return 7;
     821   }
     822   switch(curChar)
     823   {
     824      case 116:
     825         return jjMoveStringLiteralDfa8_0(active0, 0x10L);
     826      default :
     827         break;
     828   }
     829   return jjStartNfa_0(6, active0);
     830}
     831private int jjMoveStringLiteralDfa8_0(long old0, long active0){
     832   if (((active0 &= old0)) == 0L)
     833      return jjStartNfa_0(6, old0);
     834   try { curChar = input_stream.readChar(); }
     835   catch(java.io.IOException e) {
     836      jjStopStringLiteralDfa_0(7, active0);
     837      return 8;
     838   }
     839   switch(curChar)
     840   {
     841      case 115:
     842         if ((active0 & 0x10L) != 0L)
     843            return jjStopAtPos(8, 4);
     844         break;
     845      default :
     846         break;
     847   }
     848   return jjStartNfa_0(7, active0);
     849}
     850private int jjStartNfaWithStates_0(int pos, int kind, int state)
     851{
     852   jjmatchedKind = kind;
     853   jjmatchedPos = pos;
     854   try { curChar = input_stream.readChar(); }
     855   catch(java.io.IOException e) { return pos + 1; }
     856   return jjMoveNfa_0(state, pos + 1);
     857}
     858private int jjMoveNfa_0(int startState, int curPos)
     859{
     860   int startsAt = 0;
     861   jjnewStateCnt = 37;
     862   int i = 1;
     863   jjstateSet[0] = startState;
     864   int kind = 0x7fffffff;
     865   for (;;)
     866   {
     867      if (++jjround == 0x7fffffff)
     868         ReInitRounds();
     869      if (curChar < 64)
     870      {
     871         long l = 1L << curChar;
     872         do
     873         {
     874            switch(jjstateSet[--i])
     875            {
     876               case 0:
     877                  if ((0x3fe000000000000L & l) != 0L)
     878                  {
     879                     if (kind > 13)
     880                        kind = 13;
     881                     { jjCheckNAdd(5); }
     882                  }
     883                  else if ((0x3400L & l) != 0L)
     884                  {
     885                     if (kind > 6)
     886                        kind = 6;
     887                  }
     888                  else if ((0x100000200L & l) != 0L)
     889                  {
     890                     if (kind > 7)
     891                        kind = 7;
     892                  }
     893                  else if (curChar == 47)
     894                     { jjAddStates(47, 49); }
     895                  else if (curChar == 34)
     896                     { jjCheckNAddStates(50, 52); }
     897                  break;
     898               case 13:
     899                  if ((0xffff7bff00000000L & l) != 0L)
     900                     { jjCheckNAddStates(53, 56); }
     901                  break;
     902               case 1:
     903                  if ((0x100000200L & l) != 0L && kind > 7)
     904                     kind = 7;
     905                  break;
     906               case 3:
     907                  if ((0x3ff200000000000L & l) == 0L)
     908                     break;
     909                  if (kind > 12)
     910                     kind = 12;
     911                  jjstateSet[jjnewStateCnt++] = 3;
     912                  break;
     913               case 4:
     914                  if ((0x3fe000000000000L & l) == 0L)
     915                     break;
     916                  if (kind > 13)
     917                     kind = 13;
     918                  { jjCheckNAdd(5); }
     919                  break;
     920               case 5:
     921                  if ((0x3ff000000000000L & l) == 0L)
     922                     break;
     923                  if (kind > 13)
     924                     kind = 13;
     925                  { jjCheckNAdd(5); }
     926                  break;
     927               case 6:
     928               case 10:
     929                  if (curChar == 34)
     930                     { jjCheckNAddStates(50, 52); }
     931                  break;
     932               case 7:
     933                  if ((0xfffffffb00000000L & l) != 0L)
     934                     { jjCheckNAddStates(50, 52); }
     935                  break;
     936               case 8:
     937                  if (curChar == 34 && kind > 14)
     938                     kind = 14;
     939                  break;
     940               case 12:
     941                  if (curChar == 47)
     942                     { jjAddStates(47, 49); }
     943                  break;
     944               case 14:
     945                  if ((0xffff7fff00000000L & l) != 0L)
     946                     { jjCheckNAddStates(53, 56); }
     947                  break;
     948               case 17:
     949                  if (curChar == 47 && kind > 17)
     950                     kind = 17;
     951                  break;
     952               case 19:
     953                  if (curChar == 36)
     954                     { jjCheckNAddStates(53, 56); }
     955                  break;
     956               case 21:
     957                  if (curChar == 42)
     958                     { jjCheckNAddStates(53, 56); }
     959                  break;
     960               case 22:
     961                  if (curChar == 63)
     962                     { jjCheckNAddStates(53, 56); }
     963                  break;
     964               case 25:
     965                  if (curChar == 41)
     966                     { jjCheckNAddStates(53, 56); }
     967                  break;
     968               case 26:
     969                  if (curChar == 40)
     970                     { jjCheckNAddStates(53, 56); }
     971                  break;
     972               case 27:
     973                  if (curChar == 34)
     974                     { jjCheckNAddStates(53, 56); }
     975                  break;
     976               case 28:
     977                  if (curChar == 39)
     978                     { jjCheckNAddStates(53, 56); }
     979                  break;
     980               case 29:
     981                  if (curChar == 46)
     982                     { jjCheckNAddStates(53, 56); }
     983                  break;
     984               case 30:
     985                  if (curChar == 43)
     986                     { jjCheckNAddStates(53, 56); }
     987                  break;
     988               case 34:
     989                  if (curChar == 47)
     990                     { jjCheckNAddStates(53, 56); }
     991                  break;
     992               default : break;
     993            }
     994         } while(i != startsAt);
     995      }
     996      else if (curChar < 128)
     997      {
     998         long l = 1L << (curChar & 077);
     999         do
     1000         {
     1001            switch(jjstateSet[--i])
     1002            {
     1003               case 0:
     1004               case 3:
     1005                  if ((0x7fffffe87fffffeL & l) == 0L)
     1006                     break;
     1007                  if (kind > 12)
     1008                     kind = 12;
     1009                  { jjCheckNAdd(3); }
     1010                  break;
     1011               case 13:
     1012                  if ((0x7fffffffefffffffL & l) != 0L)
     1013                     { jjCheckNAddStates(53, 56); }
     1014                  else if (curChar == 92)
     1015                     { jjCheckNAddStates(57, 72); }
     1016                  if (curChar == 92)
     1017                     { jjCheckNAdd(16); }
     1018                  break;
     1019               case 7:
     1020                  if ((0x7fffffffefffffffL & l) != 0L)
     1021                     { jjCheckNAddStates(50, 52); }
     1022                  break;
     1023               case 9:
     1024                  if (curChar == 92)
     1025                     { jjAddStates(73, 74); }
     1026                  break;
     1027               case 11:
     1028                  if (curChar == 92)
     1029                     { jjCheckNAddStates(50, 52); }
     1030                  break;
     1031               case 14:
     1032                  if ((0x7fffffffefffffffL & l) != 0L)
     1033                     { jjCheckNAddStates(53, 56); }
     1034                  break;
     1035               case 15:
     1036                  if (curChar == 92)
     1037                     { jjCheckNAdd(16); }
     1038                  break;
     1039               case 16:
     1040                  if ((0x488001404880096L & l) != 0L)
     1041                     { jjCheckNAddStates(53, 56); }
     1042                  break;
     1043               case 18:
     1044                  if (curChar == 92)
     1045                     { jjCheckNAddStates(75, 90); }
     1046                  break;
     1047               case 20:
     1048                  if (curChar == 94)
     1049                     { jjCheckNAddStates(53, 56); }
     1050                  break;
     1051               case 23:
     1052                  if (curChar == 125)
     1053                     { jjCheckNAddStates(53, 56); }
     1054                  break;
     1055               case 24:
     1056                  if (curChar == 123)
     1057                     { jjCheckNAddStates(53, 56); }
     1058                  break;
     1059               case 31:
     1060                  if (curChar == 93)
     1061                     { jjCheckNAddStates(53, 56); }
     1062                  break;
     1063               case 32:
     1064                  if (curChar == 91)
     1065                     { jjCheckNAddStates(53, 56); }
     1066                  break;
     1067               case 33:
     1068                  if (curChar == 92)
     1069                     { jjCheckNAddStates(53, 56); }
     1070                  break;
     1071               case 35:
     1072                  if (curChar == 92)
     1073                     { jjCheckNAdd(16); }
     1074                  break;
     1075               case 36:
     1076                  if (curChar == 92)
     1077                     { jjCheckNAddStates(57, 72); }
     1078                  break;
     1079               default : break;
     1080            }
     1081         } while(i != startsAt);
     1082      }
     1083      else
     1084      {
     1085         int hiByte = (curChar >> 8);
     1086         int i1 = hiByte >> 6;
     1087         long l1 = 1L << (hiByte & 077);
     1088         int i2 = (curChar & 0xff) >> 6;
     1089         long l2 = 1L << (curChar & 077);
     1090         do
     1091         {
     1092            switch(jjstateSet[--i])
     1093            {
     1094               case 13:
     1095               case 14:
     1096                  if (jjCanMove_0(hiByte, i1, i2, l1, l2))
     1097                     { jjCheckNAddStates(53, 56); }
     1098                  break;
     1099               case 7:
     1100                  if (jjCanMove_0(hiByte, i1, i2, l1, l2))
     1101                     { jjAddStates(50, 52); }
     1102                  break;
     1103               default : if (i1 == 0 || l1 == 0 || i2 == 0 ||  l2 == 0) break; else break;
     1104            }
     1105         } while(i != startsAt);
     1106      }
     1107      if (kind != 0x7fffffff)
     1108      {
     1109         jjmatchedKind = kind;
     1110         jjmatchedPos = curPos;
     1111         kind = 0x7fffffff;
     1112      }
     1113      ++curPos;
     1114      if ((i = jjnewStateCnt) == (startsAt = 37 - (jjnewStateCnt = startsAt)))
     1115         return curPos;
     1116      try { curChar = input_stream.readChar(); }
     1117      catch(java.io.IOException e) { return curPos; }
     1118   }
     1119}
     1120private int jjMoveStringLiteralDfa0_1(){
     1121   switch(curChar)
     1122   {
     1123      case 42:
     1124         return jjMoveStringLiteralDfa1_1(0x200L);
     1125      default :
     1126         return 1;
     1127   }
     1128}
     1129private int jjMoveStringLiteralDfa1_1(long active0){
     1130   try { curChar = input_stream.readChar(); }
     1131   catch(java.io.IOException e) {
     1132      return 1;
     1133   }
     1134   switch(curChar)
     1135   {
     1136      case 47:
     1137         if ((active0 & 0x200L) != 0L)
     1138            return jjStopAtPos(1, 9);
     1139         break;
     1140      default :
     1141         return 2;
     1142   }
     1143   return 2;
     1144}
     1145private int jjMoveStringLiteralDfa0_3(){
     1146   switch(curChar)
     1147   {
     1148      case 42:
     1149         return jjMoveStringLiteralDfa1_3(0x100000000000000L);
     1150      default :
     1151         return 1;
     1152   }
     1153}
     1154private int jjMoveStringLiteralDfa1_3(long active0){
     1155   try { curChar = input_stream.readChar(); }
     1156   catch(java.io.IOException e) {
     1157      return 1;
     1158   }
     1159   switch(curChar)
     1160   {
     1161      case 47:
     1162         if ((active0 & 0x100000000000000L) != 0L)
     1163            return jjStopAtPos(1, 56);
     1164         break;
     1165      default :
     1166         return 2;
     1167   }
     1168   return 2;
     1169}
     1170static final int[] jjnextStates = {
     1171   11, 33, 34, 5, 6, 7, 12, 13, 15, 16, 40, 47, 51, 8, 9, 17,
     1172   18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 32,
     1173   31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 13,
     1174   35, 36, 7, 8, 9, 14, 15, 17, 18, 34, 33, 32, 31, 30, 29, 28,
     1175   27, 26, 25, 24, 23, 22, 21, 20, 19, 10, 11, 19, 20, 21, 22, 23,
     1176   24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
     1177};
     1178private static final boolean jjCanMove_0(int hiByte, int i1, int i2, long l1, long l2)
     1179{
     1180   switch(hiByte)
     1181   {
     1182      case 0:
     1183         return ((jjbitVec2[i2] & l2) != 0L);
     1184      default :
     1185         if ((jjbitVec0[i1] & l1) != 0L)
     1186            return true;
     1187         return false;
     1188   }
     1189}
     1190
     1191/** Token literal values. */
     1192public static final String[] jjstrLiteralImages = {
     1193"", "\141\156\144", "\157\162", "\156\157\164",
     1194"\100\163\165\160\160\157\162\164\163", "\100\155\145\144\151\141", null, null, "\57\52", null, null, null, null, null,
     1195null, null, null, null, "\173", "\175", "\50", "\51", "\54", "\72", null, null, null,
     1196null, null, "\52", "\57", "\133", "\135", "\76\75", "\74\75", "\76", "\74", "\75",
     1197"\41", "\176", "\72\72", "\73", "\174", "\174\172", "\53", "\55", "\46", "\77",
     1198"\44", "\136", "\56", "\260", "\u2208", "\u29c9", "\57\52", null, "\52\57", null, };
     1199protected Token jjFillToken()
     1200{
     1201   final Token t;
     1202   final String curTokenImage;
     1203   final int beginLine;
     1204   final int endLine;
     1205   final int beginColumn;
     1206   final int endColumn;
     1207   String im = jjstrLiteralImages[jjmatchedKind];
     1208   curTokenImage = (im == null) ? input_stream.GetImage() : im;
     1209   beginLine = input_stream.getBeginLine();
     1210   beginColumn = input_stream.getBeginColumn();
     1211   endLine = input_stream.getEndLine();
     1212   endColumn = input_stream.getEndColumn();
     1213   t = Token.newToken(jjmatchedKind, curTokenImage);
     1214
     1215   t.beginLine = beginLine;
     1216   t.endLine = endLine;
     1217   t.beginColumn = beginColumn;
     1218   t.endColumn = endColumn;
     1219
     1220   return t;
     1221}
     1222
     1223int curLexState = 2;
     1224int defaultLexState = 2;
     1225int jjnewStateCnt;
     1226int jjround;
     1227int jjmatchedPos;
     1228int jjmatchedKind;
     1229
     1230/** Get the next Token. */
     1231public Token getNextToken()
     1232{
     1233  Token matchedToken;
     1234  int curPos = 0;
     1235
     1236  EOFLoop :
     1237  for (;;)
     1238  {
     1239   try
     1240   {
     1241      curChar = input_stream.BeginToken();
     1242   }
     1243   catch(Exception e)
     1244   {
     1245      jjmatchedKind = 0;
     1246      jjmatchedPos = -1;
     1247      matchedToken = jjFillToken();
     1248      return matchedToken;
     1249   }
     1250
     1251   for (;;)
     1252   {
     1253     switch(curLexState)
     1254     {
     1255       case 0:
     1256         jjmatchedKind = 0x7fffffff;
     1257         jjmatchedPos = 0;
     1258         curPos = jjMoveStringLiteralDfa0_0();
     1259         if (jjmatchedPos == 0 && jjmatchedKind > 24)
     1260         {
     1261            jjmatchedKind = 24;
     1262         }
     1263         break;
     1264       case 1:
     1265         jjmatchedKind = 0x7fffffff;
     1266         jjmatchedPos = 0;
     1267         curPos = jjMoveStringLiteralDfa0_1();
     1268         if (jjmatchedPos == 0 && jjmatchedKind > 10)
     1269         {
     1270            jjmatchedKind = 10;
     1271         }
     1272         break;
     1273       case 2:
     1274         jjmatchedKind = 0x7fffffff;
     1275         jjmatchedPos = 0;
     1276         curPos = jjMoveStringLiteralDfa0_2();
     1277         if (jjmatchedPos == 0 && jjmatchedKind > 55)
     1278         {
     1279            jjmatchedKind = 55;
     1280         }
     1281         break;
     1282       case 3:
     1283         jjmatchedKind = 0x7fffffff;
     1284         jjmatchedPos = 0;
     1285         curPos = jjMoveStringLiteralDfa0_3();
     1286         if (jjmatchedPos == 0 && jjmatchedKind > 57)
     1287         {
     1288            jjmatchedKind = 57;
     1289         }
     1290         break;
     1291     }
     1292     if (jjmatchedKind != 0x7fffffff)
     1293     {
     1294        if (jjmatchedPos + 1 < curPos)
     1295           input_stream.backup(curPos - jjmatchedPos - 1);
     1296        if ((jjtoToken[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L)
     1297        {
     1298           matchedToken = jjFillToken();
     1299       if (jjnewLexState[jjmatchedKind] != -1)
     1300         curLexState = jjnewLexState[jjmatchedKind];
     1301           return matchedToken;
     1302        }
     1303        else if ((jjtoSkip[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L)
     1304        {
     1305         if (jjnewLexState[jjmatchedKind] != -1)
     1306           curLexState = jjnewLexState[jjmatchedKind];
     1307           continue EOFLoop;
     1308        }
     1309      if (jjnewLexState[jjmatchedKind] != -1)
     1310        curLexState = jjnewLexState[jjmatchedKind];
     1311        curPos = 0;
     1312        jjmatchedKind = 0x7fffffff;
     1313        try {
     1314           curChar = input_stream.readChar();
     1315           continue;
     1316        }
     1317        catch (java.io.IOException e1) { }
     1318     }
     1319     int error_line = input_stream.getEndLine();
     1320     int error_column = input_stream.getEndColumn();
     1321     String error_after = null;
     1322     boolean EOFSeen = false;
     1323     try { input_stream.readChar(); input_stream.backup(1); }
     1324     catch (java.io.IOException e1) {
     1325        EOFSeen = true;
     1326        error_after = curPos <= 1 ? "" : input_stream.GetImage();
     1327        if (curChar == '\n' || curChar == '\r') {
     1328           error_line++;
     1329           error_column = 0;
     1330        }
     1331        else
     1332           error_column++;
     1333     }
     1334     if (!EOFSeen) {
     1335        input_stream.backup(1);
     1336        error_after = curPos <= 1 ? "" : input_stream.GetImage();
     1337     }
     1338     throw new TokenMgrError(EOFSeen, curLexState, error_line, error_column, error_after, curChar, TokenMgrError.LEXICAL_ERROR);
     1339   }
     1340  }
     1341}
     1342
     1343private void jjCheckNAdd(int state)
     1344{
     1345   if (jjrounds[state] != jjround)
     1346   {
     1347      jjstateSet[jjnewStateCnt++] = state;
     1348      jjrounds[state] = jjround;
     1349   }
     1350}
     1351private void jjAddStates(int start, int end)
     1352{
     1353   do {
     1354      jjstateSet[jjnewStateCnt++] = jjnextStates[start];
     1355   } while (start++ != end);
     1356}
     1357private void jjCheckNAddTwoStates(int state1, int state2)
     1358{
     1359   jjCheckNAdd(state1);
     1360   jjCheckNAdd(state2);
     1361}
     1362
     1363private void jjCheckNAddStates(int start, int end)
     1364{
     1365   do {
     1366      jjCheckNAdd(jjnextStates[start]);
     1367   } while (start++ != end);
     1368}
     1369
     1370    /** Constructor. */
     1371    public MapCSSParserTokenManager(SimpleCharStream stream){
     1372
     1373      if (SimpleCharStream.staticFlag)
     1374            throw new Error("ERROR: Cannot use a static CharStream class with a non-static lexical analyzer.");
     1375
     1376    input_stream = stream;
     1377  }
     1378
     1379  /** Constructor. */
     1380  public MapCSSParserTokenManager (SimpleCharStream stream, int lexState){
     1381    ReInit(stream);
     1382    SwitchTo(lexState);
     1383  }
     1384
     1385  /** Reinitialise parser. */
     1386  public void ReInit(SimpleCharStream stream)
     1387  {
     1388       
     1389    jjmatchedPos = jjnewStateCnt = 0;
     1390    curLexState = defaultLexState;
     1391    input_stream = stream;
     1392    ReInitRounds();
     1393  }
     1394
     1395  private void ReInitRounds()
     1396  {
     1397    int i;
     1398    jjround = 0x80000001;
     1399    for (i = 53; i-- > 0;)
     1400      jjrounds[i] = 0x80000000;
     1401  }
     1402
     1403  /** Reinitialise parser. */
     1404  public void ReInit( SimpleCharStream stream, int lexState)
     1405  {
     1406 
     1407    ReInit( stream);
     1408    SwitchTo(lexState);
     1409  }
     1410
     1411  /** Switch to specified lex state. */
     1412  public void SwitchTo(int lexState)
     1413  {
     1414    if (lexState >= 4 || lexState < 0)
     1415      throw new TokenMgrError("Error: Ignoring invalid lexical state : " + lexState + ". State unchanged.", TokenMgrError.INVALID_LEXICAL_STATE);
     1416    else
     1417      curLexState = lexState;
     1418  }
     1419
     1420/** Lexer state names. */
     1421public static final String[] lexStateNames = {
     1422   "PREPROCESSOR",
     1423   "PP_COMMENT",
     1424   "DEFAULT",
     1425   "COMMENT",
     1426};
     1427
     1428/** Lex State array. */
     1429public static final int[] jjnewLexState = {
     1430   -1, -1, -1, -1, -1, -1, -1, -1, 1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
     1431   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
     1432   -1, -1, -1, -1, 3, -1, 2, -1,
     1433};
     1434static final long[] jjtoToken = {
     1435   0x1fffffffbfe7bffL,
     1436};
     1437static final long[] jjtoSkip = {
     1438   0x200000000000000L,
     1439};
     1440static final long[] jjtoMore = {
     1441   0x400L,
     1442};
     1443    protected SimpleCharStream  input_stream;
     1444
     1445    private final int[] jjrounds = new int[53];
     1446    private final int[] jjstateSet = new int[2 * 53];
     1447
     1448   
     1449    protected int curChar;
     1450}
  • new file src/org/openstreetmap/josm/gui/mappaint/mapcss/parsergen/ParseException.java

    diff --git a/src/org/openstreetmap/josm/gui/mappaint/mapcss/parsergen/ParseException.java b/src/org/openstreetmap/josm/gui/mappaint/mapcss/parsergen/ParseException.java
    new file mode 100644
    index 0000000..c86ad69
    - +  
     1/* Generated By:JavaCC: Do not edit this line. ParseException.java Version 6.1 */
     2/* JavaCCOptions:KEEP_LINE_COLUMN=true */
     3package org.openstreetmap.josm.gui.mappaint.mapcss.parsergen;
     4
     5/**
     6 * This exception is thrown when parse errors are encountered.
     7 * You can explicitly create objects of this exception type by
     8 * calling the method generateParseException in the generated
     9 * parser.
     10 *
     11 * You can modify this class to customize your error reporting
     12 * mechanisms so long as you retain the public fields.
     13 */
     14public class ParseException extends Exception {
     15
     16  /**
     17   * The version identifier for this Serializable class.
     18   * Increment only if the <i>serialized</i> form of the
     19   * class changes.
     20   */
     21  private static final long serialVersionUID = 1L;
     22
     23  /**
     24   * The end of line string for this machine.
     25   */
     26  protected static String EOL = System.getProperty("line.separator", "\n");
     27
     28  /**
     29   * This constructor is used by the method "generateParseException"
     30   * in the generated parser.  Calling this constructor generates
     31   * a new object of this type with the fields "currentToken",
     32   * "expectedTokenSequences", and "tokenImage" set.
     33   */
     34  public ParseException(Token currentTokenVal,
     35                        int[][] expectedTokenSequencesVal,
     36                        String[] tokenImageVal
     37                       )
     38  {
     39    super(initialise(currentTokenVal, expectedTokenSequencesVal, tokenImageVal));
     40    currentToken = currentTokenVal;
     41    expectedTokenSequences = expectedTokenSequencesVal;
     42    tokenImage = tokenImageVal;
     43  }
     44
     45  /**
     46   * The following constructors are for use by you for whatever
     47   * purpose you can think of.  Constructing the exception in this
     48   * manner makes the exception behave in the normal way - i.e., as
     49   * documented in the class "Throwable".  The fields "errorToken",
     50   * "expectedTokenSequences", and "tokenImage" do not contain
     51   * relevant information.  The JavaCC generated code does not use
     52   * these constructors.
     53   */
     54
     55  public ParseException() {
     56    super();
     57  }
     58
     59  /** Constructor with message. */
     60  public ParseException(String message) {
     61    super(message);
     62  }
     63
     64
     65  /**
     66   * This is the last token that has been consumed successfully.  If
     67   * this object has been created due to a parse error, the token
     68   * followng this token will (therefore) be the first error token.
     69   */
     70  public Token currentToken;
     71
     72  /**
     73   * Each entry in this array is an array of integers.  Each array
     74   * of integers represents a sequence of tokens (by their ordinal
     75   * values) that is expected at this point of the parse.
     76   */
     77  public int[][] expectedTokenSequences;
     78
     79  /**
     80   * This is a reference to the "tokenImage" array of the generated
     81   * parser within which the parse error occurred.  This array is
     82   * defined in the generated ...Constants interface.
     83   */
     84  public String[] tokenImage;
     85
     86  /**
     87   * It uses "currentToken" and "expectedTokenSequences" to generate a parse
     88   * error message and returns it.  If this object has been created
     89   * due to a parse error, and you do not catch it (it gets thrown
     90   * from the parser) the correct error message
     91   * gets displayed.
     92   */
     93  private static String initialise(Token currentToken,
     94                           int[][] expectedTokenSequences,
     95                           String[] tokenImage) {
     96
     97    StringBuffer expected = new StringBuffer();
     98    int maxSize = 0;
     99    for (int i = 0; i < expectedTokenSequences.length; i++) {
     100      if (maxSize < expectedTokenSequences[i].length) {
     101        maxSize = expectedTokenSequences[i].length;
     102      }
     103      for (int j = 0; j < expectedTokenSequences[i].length; j++) {
     104        expected.append(tokenImage[expectedTokenSequences[i][j]]).append(' ');
     105      }
     106      if (expectedTokenSequences[i][expectedTokenSequences[i].length - 1] != 0) {
     107        expected.append("...");
     108      }
     109      expected.append(EOL).append("    ");
     110    }
     111    String retval = "Encountered \"";
     112    Token tok = currentToken.next;
     113    for (int i = 0; i < maxSize; i++) {
     114      if (i != 0) retval += " ";
     115      if (tok.kind == 0) {
     116        retval += tokenImage[0];
     117        break;
     118      }
     119      retval += " " + tokenImage[tok.kind];
     120      retval += " \"";
     121      retval += add_escapes(tok.image);
     122      retval += " \"";
     123      tok = tok.next;
     124    }
     125    if (currentToken.next != null) {
     126        retval += "\" at line " + currentToken.next.beginLine + ", column " + currentToken.next.beginColumn;
     127    }
     128    retval += "." + EOL;
     129   
     130   
     131    if (expectedTokenSequences.length == 0) {
     132        // Nothing to add here
     133    } else {
     134            if (expectedTokenSequences.length == 1) {
     135              retval += "Was expecting:" + EOL + "    ";
     136            } else {
     137              retval += "Was expecting one of:" + EOL + "    ";
     138            }
     139            retval += expected.toString();
     140    }
     141   
     142    return retval;
     143  }
     144
     145
     146  /**
     147   * Used to convert raw characters to their escaped version
     148   * when these raw version cannot be used as part of an ASCII
     149   * string literal.
     150   */
     151  static String add_escapes(String str) {
     152      StringBuffer retval = new StringBuffer();
     153      char ch;
     154      for (int i = 0; i < str.length(); i++) {
     155        switch (str.charAt(i))
     156        {
     157           case '\b':
     158              retval.append("\\b");
     159              continue;
     160           case '\t':
     161              retval.append("\\t");
     162              continue;
     163           case '\n':
     164              retval.append("\\n");
     165              continue;
     166           case '\f':
     167              retval.append("\\f");
     168              continue;
     169           case '\r':
     170              retval.append("\\r");
     171              continue;
     172           case '\"':
     173              retval.append("\\\"");
     174              continue;
     175           case '\'':
     176              retval.append("\\\'");
     177              continue;
     178           case '\\':
     179              retval.append("\\\\");
     180              continue;
     181           default:
     182              if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
     183                 String s = "0000" + Integer.toString(ch, 16);
     184                 retval.append("\\u" + s.substring(s.length() - 4, s.length()));
     185              } else {
     186                 retval.append(ch);
     187              }
     188              continue;
     189        }
     190      }
     191      return retval.toString();
     192   }
     193
     194}
     195/* JavaCC - OriginalChecksum=548bceecbf58182b12388d687653c3d7 (do not edit this line) */
  • new file src/org/openstreetmap/josm/gui/mappaint/mapcss/parsergen/SimpleCharStream.java

    diff --git a/src/org/openstreetmap/josm/gui/mappaint/mapcss/parsergen/SimpleCharStream.java b/src/org/openstreetmap/josm/gui/mappaint/mapcss/parsergen/SimpleCharStream.java
    new file mode 100644
    index 0000000..2057b40
    - +  
     1/* Generated By:JavaCC: Do not edit this line. SimpleCharStream.java Version 6.1 */
     2/* JavaCCOptions:STATIC=false,SUPPORT_CLASS_VISIBILITY_PUBLIC=true */
     3package org.openstreetmap.josm.gui.mappaint.mapcss.parsergen;
     4
     5/**
     6 * An implementation of interface CharStream, where the stream is assumed to
     7 * contain only ASCII characters (without unicode processing).
     8 */
     9
     10public class SimpleCharStream
     11{
     12/** Whether parser is static. */
     13  public static final boolean staticFlag = false;
     14  int bufsize;
     15  int available;
     16  int tokenBegin;
     17/** Position in buffer. */
     18  public int bufpos = -1;
     19  protected int bufline[];
     20  protected int bufcolumn[];
     21
     22  protected int column = 0;
     23  protected int line = 1;
     24
     25  protected boolean prevCharIsCR = false;
     26  protected boolean prevCharIsLF = false;
     27
     28  protected java.io.Reader inputStream;
     29
     30  protected char[] buffer;
     31  protected int maxNextCharInd = 0;
     32  protected int inBuf = 0;
     33  protected int tabSize = 1;
     34  protected boolean trackLineColumn = true;
     35
     36  public void setTabSize(int i) { tabSize = i; }
     37  public int getTabSize() { return tabSize; }
     38
     39
     40
     41  protected void ExpandBuff(boolean wrapAround)
     42  {
     43    char[] newbuffer = new char[bufsize + 2048];
     44    int newbufline[] = new int[bufsize + 2048];
     45    int newbufcolumn[] = new int[bufsize + 2048];
     46
     47    try
     48    {
     49      if (wrapAround)
     50      {
     51        System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
     52        System.arraycopy(buffer, 0, newbuffer, bufsize - tokenBegin, bufpos);
     53        buffer = newbuffer;
     54
     55        System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
     56        System.arraycopy(bufline, 0, newbufline, bufsize - tokenBegin, bufpos);
     57        bufline = newbufline;
     58
     59        System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
     60        System.arraycopy(bufcolumn, 0, newbufcolumn, bufsize - tokenBegin, bufpos);
     61        bufcolumn = newbufcolumn;
     62
     63        maxNextCharInd = (bufpos += (bufsize - tokenBegin));
     64      }
     65      else
     66      {
     67        System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
     68        buffer = newbuffer;
     69
     70        System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
     71        bufline = newbufline;
     72
     73        System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
     74        bufcolumn = newbufcolumn;
     75
     76        maxNextCharInd = (bufpos -= tokenBegin);
     77      }
     78    }
     79    catch (Throwable t)
     80    {
     81      throw new Error(t.getMessage());
     82    }
     83
     84
     85    bufsize += 2048;
     86    available = bufsize;
     87    tokenBegin = 0;
     88  }
     89
     90  protected void FillBuff() throws java.io.IOException
     91  {
     92    if (maxNextCharInd == available)
     93    {
     94      if (available == bufsize)
     95      {
     96        if (tokenBegin > 2048)
     97        {
     98          bufpos = maxNextCharInd = 0;
     99          available = tokenBegin;
     100        }
     101        else if (tokenBegin < 0)
     102          bufpos = maxNextCharInd = 0;
     103        else
     104          ExpandBuff(false);
     105      }
     106      else if (available > tokenBegin)
     107        available = bufsize;
     108      else if ((tokenBegin - available) < 2048)
     109        ExpandBuff(true);
     110      else
     111        available = tokenBegin;
     112    }
     113
     114    int i;
     115    try {
     116      if ((i = inputStream.read(buffer, maxNextCharInd, available - maxNextCharInd)) == -1)
     117      {
     118        inputStream.close();
     119        throw new java.io.IOException();
     120      }
     121      else
     122        maxNextCharInd += i;
     123      return;
     124    }
     125    catch(java.io.IOException e) {
     126      --bufpos;
     127      backup(0);
     128      if (tokenBegin == -1)
     129        tokenBegin = bufpos;
     130      throw e;
     131    }
     132  }
     133
     134/** Start. */
     135  public char BeginToken() throws java.io.IOException
     136  {
     137    tokenBegin = -1;
     138    char c = readChar();
     139    tokenBegin = bufpos;
     140
     141    return c;
     142  }
     143
     144  protected void UpdateLineColumn(char c)
     145  {
     146    column++;
     147
     148    if (prevCharIsLF)
     149    {
     150      prevCharIsLF = false;
     151      line += (column = 1);
     152    }
     153    else if (prevCharIsCR)
     154    {
     155      prevCharIsCR = false;
     156      if (c == '\n')
     157      {
     158        prevCharIsLF = true;
     159      }
     160      else
     161        line += (column = 1);
     162    }
     163
     164    switch (c)
     165    {
     166      case '\r' :
     167        prevCharIsCR = true;
     168        break;
     169      case '\n' :
     170        prevCharIsLF = true;
     171        break;
     172      case '\t' :
     173        column--;
     174        column += (tabSize - (column % tabSize));
     175        break;
     176      default :
     177        break;
     178    }
     179
     180    bufline[bufpos] = line;
     181    bufcolumn[bufpos] = column;
     182  }
     183
     184/** Read a character. */
     185  public char readChar() throws java.io.IOException
     186  {
     187    if (inBuf > 0)
     188    {
     189      --inBuf;
     190
     191      if (++bufpos == bufsize)
     192        bufpos = 0;
     193
     194      return buffer[bufpos];
     195    }
     196
     197    if (++bufpos >= maxNextCharInd)
     198      FillBuff();
     199
     200    char c = buffer[bufpos];
     201
     202    UpdateLineColumn(c);
     203    return c;
     204  }
     205
     206  @Deprecated
     207  /**
     208   * @deprecated
     209   * @see #getEndColumn
     210   */
     211
     212  public int getColumn() {
     213    return bufcolumn[bufpos];
     214  }
     215
     216  @Deprecated
     217  /**
     218   * @deprecated
     219   * @see #getEndLine
     220   */
     221
     222  public int getLine() {
     223    return bufline[bufpos];
     224  }
     225
     226  /** Get token end column number. */
     227  public int getEndColumn() {
     228    return bufcolumn[bufpos];
     229  }
     230
     231  /** Get token end line number. */
     232  public int getEndLine() {
     233     return bufline[bufpos];
     234  }
     235
     236  /** Get token beginning column number. */
     237  public int getBeginColumn() {
     238    return bufcolumn[tokenBegin];
     239  }
     240
     241  /** Get token beginning line number. */
     242  public int getBeginLine() {
     243    return bufline[tokenBegin];
     244  }
     245
     246/** Backup a number of characters. */
     247  public void backup(int amount) {
     248
     249    inBuf += amount;
     250    if ((bufpos -= amount) < 0)
     251      bufpos += bufsize;
     252  }
     253
     254  /** Constructor. */
     255  public SimpleCharStream(java.io.Reader dstream, int startline,
     256  int startcolumn, int buffersize)
     257  {
     258    inputStream = dstream;
     259    line = startline;
     260    column = startcolumn - 1;
     261
     262    available = bufsize = buffersize;
     263    buffer = new char[buffersize];
     264    bufline = new int[buffersize];
     265    bufcolumn = new int[buffersize];
     266  }
     267
     268  /** Constructor. */
     269  public SimpleCharStream(java.io.Reader dstream, int startline,
     270                          int startcolumn)
     271  {
     272    this(dstream, startline, startcolumn, 4096);
     273  }
     274
     275  /** Constructor. */
     276  public SimpleCharStream(java.io.Reader dstream)
     277  {
     278    this(dstream, 1, 1, 4096);
     279  }
     280
     281  /** Reinitialise. */
     282  public void ReInit(java.io.Reader dstream, int startline,
     283  int startcolumn, int buffersize)
     284  {
     285    inputStream = dstream;
     286    line = startline;
     287    column = startcolumn - 1;
     288
     289    if (buffer == null || buffersize != buffer.length)
     290    {
     291      available = bufsize = buffersize;
     292      buffer = new char[buffersize];
     293      bufline = new int[buffersize];
     294      bufcolumn = new int[buffersize];
     295    }
     296    prevCharIsLF = prevCharIsCR = false;
     297    tokenBegin = inBuf = maxNextCharInd = 0;
     298    bufpos = -1;
     299  }
     300
     301  /** Reinitialise. */
     302  public void ReInit(java.io.Reader dstream, int startline,
     303                     int startcolumn)
     304  {
     305    ReInit(dstream, startline, startcolumn, 4096);
     306  }
     307
     308  /** Reinitialise. */
     309  public void ReInit(java.io.Reader dstream)
     310  {
     311    ReInit(dstream, 1, 1, 4096);
     312  }
     313  /** Constructor. */
     314  public SimpleCharStream(java.io.InputStream dstream, String encoding, int startline,
     315  int startcolumn, int buffersize) throws java.io.UnsupportedEncodingException
     316  {
     317    this(encoding == null ? new java.io.InputStreamReader(dstream) : new java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize);
     318  }
     319
     320  /** Constructor. */
     321  public SimpleCharStream(java.io.InputStream dstream, int startline,
     322  int startcolumn, int buffersize)
     323  {
     324    this(new java.io.InputStreamReader(dstream), startline, startcolumn, buffersize);
     325  }
     326
     327  /** Constructor. */
     328  public SimpleCharStream(java.io.InputStream dstream, String encoding, int startline,
     329                          int startcolumn) throws java.io.UnsupportedEncodingException
     330  {
     331    this(dstream, encoding, startline, startcolumn, 4096);
     332  }
     333
     334  /** Constructor. */
     335  public SimpleCharStream(java.io.InputStream dstream, int startline,
     336                          int startcolumn)
     337  {
     338    this(dstream, startline, startcolumn, 4096);
     339  }
     340
     341  /** Constructor. */
     342  public SimpleCharStream(java.io.InputStream dstream, String encoding) throws java.io.UnsupportedEncodingException
     343  {
     344    this(dstream, encoding, 1, 1, 4096);
     345  }
     346
     347  /** Constructor. */
     348  public SimpleCharStream(java.io.InputStream dstream)
     349  {
     350    this(dstream, 1, 1, 4096);
     351  }
     352
     353  /** Reinitialise. */
     354  public void ReInit(java.io.InputStream dstream, String encoding, int startline,
     355                          int startcolumn, int buffersize) throws java.io.UnsupportedEncodingException
     356  {
     357    ReInit(encoding == null ? new java.io.InputStreamReader(dstream) : new java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize);
     358  }
     359
     360  /** Reinitialise. */
     361  public void ReInit(java.io.InputStream dstream, int startline,
     362                          int startcolumn, int buffersize)
     363  {
     364    ReInit(new java.io.InputStreamReader(dstream), startline, startcolumn, buffersize);
     365  }
     366
     367  /** Reinitialise. */
     368  public void ReInit(java.io.InputStream dstream, String encoding) throws java.io.UnsupportedEncodingException
     369  {
     370    ReInit(dstream, encoding, 1, 1, 4096);
     371  }
     372
     373  /** Reinitialise. */
     374  public void ReInit(java.io.InputStream dstream)
     375  {
     376    ReInit(dstream, 1, 1, 4096);
     377  }
     378  /** Reinitialise. */
     379  public void ReInit(java.io.InputStream dstream, String encoding, int startline,
     380                     int startcolumn) throws java.io.UnsupportedEncodingException
     381  {
     382    ReInit(dstream, encoding, startline, startcolumn, 4096);
     383  }
     384  /** Reinitialise. */
     385  public void ReInit(java.io.InputStream dstream, int startline,
     386                     int startcolumn)
     387  {
     388    ReInit(dstream, startline, startcolumn, 4096);
     389  }
     390  /** Get token literal value. */
     391  public String GetImage()
     392  {
     393    if (bufpos >= tokenBegin)
     394      return new String(buffer, tokenBegin, bufpos - tokenBegin + 1);
     395    else
     396      return new String(buffer, tokenBegin, bufsize - tokenBegin) +
     397                            new String(buffer, 0, bufpos + 1);
     398  }
     399
     400  /** Get the suffix. */
     401  public char[] GetSuffix(int len)
     402  {
     403    char[] ret = new char[len];
     404
     405    if ((bufpos + 1) >= len)
     406      System.arraycopy(buffer, bufpos - len + 1, ret, 0, len);
     407    else
     408    {
     409      System.arraycopy(buffer, bufsize - (len - bufpos - 1), ret, 0,
     410                                                        len - bufpos - 1);
     411      System.arraycopy(buffer, 0, ret, len - bufpos - 1, bufpos + 1);
     412    }
     413
     414    return ret;
     415  }
     416
     417  /** Reset buffer when finished. */
     418  public void Done()
     419  {
     420    buffer = null;
     421    bufline = null;
     422    bufcolumn = null;
     423  }
     424
     425  /**
     426   * Method to adjust line and column numbers for the start of a token.
     427   */
     428  public void adjustBeginLineColumn(int newLine, int newCol)
     429  {
     430    int start = tokenBegin;
     431    int len;
     432
     433    if (bufpos >= tokenBegin)
     434    {
     435      len = bufpos - tokenBegin + inBuf + 1;
     436    }
     437    else
     438    {
     439      len = bufsize - tokenBegin + bufpos + 1 + inBuf;
     440    }
     441
     442    int i = 0, j = 0, k = 0;
     443    int nextColDiff = 0, columnDiff = 0;
     444
     445    while (i < len && bufline[j = start % bufsize] == bufline[k = ++start % bufsize])
     446    {
     447      bufline[j] = newLine;
     448      nextColDiff = columnDiff + bufcolumn[k] - bufcolumn[j];
     449      bufcolumn[j] = newCol + columnDiff;
     450      columnDiff = nextColDiff;
     451      i++;
     452    }
     453
     454    if (i < len)
     455    {
     456      bufline[j] = newLine++;
     457      bufcolumn[j] = newCol + columnDiff;
     458
     459      while (i++ < len)
     460      {
     461        if (bufline[j = start % bufsize] != bufline[++start % bufsize])
     462          bufline[j] = newLine++;
     463        else
     464          bufline[j] = newLine;
     465      }
     466    }
     467
     468    line = bufline[j];
     469    column = bufcolumn[j];
     470  }
     471  boolean getTrackLineColumn() { return trackLineColumn; }
     472  void setTrackLineColumn(boolean tlc) { trackLineColumn = tlc; }
     473}
     474/* JavaCC - OriginalChecksum=2f6b7f39a94ff76199e633e8579cec6c (do not edit this line) */
  • new file src/org/openstreetmap/josm/gui/mappaint/mapcss/parsergen/Token.java

    diff --git a/src/org/openstreetmap/josm/gui/mappaint/mapcss/parsergen/Token.java b/src/org/openstreetmap/josm/gui/mappaint/mapcss/parsergen/Token.java
    new file mode 100644
    index 0000000..1e940cd
    - +  
     1/* Generated By:JavaCC: Do not edit this line. Token.java Version 6.1 */
     2/* JavaCCOptions:TOKEN_EXTENDS=,KEEP_LINE_COLUMN=true,SUPPORT_CLASS_VISIBILITY_PUBLIC=true */
     3package org.openstreetmap.josm.gui.mappaint.mapcss.parsergen;
     4
     5/**
     6 * Describes the input token stream.
     7 */
     8
     9public class Token implements java.io.Serializable {
     10
     11  /**
     12   * The version identifier for this Serializable class.
     13   * Increment only if the <i>serialized</i> form of the
     14   * class changes.
     15   */
     16  private static final long serialVersionUID = 1L;
     17
     18  /**
     19   * An integer that describes the kind of this token.  This numbering
     20   * system is determined by JavaCCParser, and a table of these numbers is
     21   * stored in the file ...Constants.java.
     22   */
     23  public int kind;
     24
     25  /** The line number of the first character of this Token. */
     26  public int beginLine;
     27  /** The column number of the first character of this Token. */
     28  public int beginColumn;
     29  /** The line number of the last character of this Token. */
     30  public int endLine;
     31  /** The column number of the last character of this Token. */
     32  public int endColumn;
     33
     34  /**
     35   * The string image of the token.
     36   */
     37  public String image;
     38
     39  /**
     40   * A reference to the next regular (non-special) token from the input
     41   * stream.  If this is the last token from the input stream, or if the
     42   * token manager has not read tokens beyond this one, this field is
     43   * set to null.  This is true only if this token is also a regular
     44   * token.  Otherwise, see below for a description of the contents of
     45   * this field.
     46   */
     47  public Token next;
     48
     49  /**
     50   * This field is used to access special tokens that occur prior to this
     51   * token, but after the immediately preceding regular (non-special) token.
     52   * If there are no such special tokens, this field is set to null.
     53   * When there are more than one such special token, this field refers
     54   * to the last of these special tokens, which in turn refers to the next
     55   * previous special token through its specialToken field, and so on
     56   * until the first special token (whose specialToken field is null).
     57   * The next fields of special tokens refer to other special tokens that
     58   * immediately follow it (without an intervening regular token).  If there
     59   * is no such token, this field is null.
     60   */
     61  public Token specialToken;
     62
     63  /**
     64   * An optional attribute value of the Token.
     65   * Tokens which are not used as syntactic sugar will often contain
     66   * meaningful values that will be used later on by the compiler or
     67   * interpreter. This attribute value is often different from the image.
     68   * Any subclass of Token that actually wants to return a non-null value can
     69   * override this method as appropriate.
     70   */
     71  public Object getValue() {
     72    return null;
     73  }
     74
     75  /**
     76   * No-argument constructor
     77   */
     78  public Token() {}
     79
     80  /**
     81   * Constructs a new token for the specified Image.
     82   */
     83  public Token(int kind)
     84  {
     85    this(kind, null);
     86  }
     87
     88  /**
     89   * Constructs a new token for the specified Image and Kind.
     90   */
     91  public Token(int kind, String image)
     92  {
     93    this.kind = kind;
     94    this.image = image;
     95  }
     96
     97  /**
     98   * Returns the image.
     99   */
     100  public String toString()
     101  {
     102    return image;
     103  }
     104
     105  /**
     106   * Returns a new Token object, by default. However, if you want, you
     107   * can create and return subclass objects based on the value of ofKind.
     108   * Simply add the cases to the switch for all those special cases.
     109   * For example, if you have a subclass of Token called IDToken that
     110   * you want to create if ofKind is ID, simply add something like :
     111   *
     112   *    case MyParserConstants.ID : return new IDToken(ofKind, image);
     113   *
     114   * to the following switch statement. Then you can cast matchedToken
     115   * variable to the appropriate type and use sit in your lexical actions.
     116   */
     117  public static Token newToken(int ofKind, String image)
     118  {
     119    switch(ofKind)
     120    {
     121      default : return new Token(ofKind, image);
     122    }
     123  }
     124
     125  public static Token newToken(int ofKind)
     126  {
     127    return newToken(ofKind, null);
     128  }
     129
     130}
     131/* JavaCC - OriginalChecksum=9a5dc89ff6b77704ef74bd54f3677052 (do not edit this line) */
  • new file src/org/openstreetmap/josm/gui/mappaint/mapcss/parsergen/TokenMgrError.java

    diff --git a/src/org/openstreetmap/josm/gui/mappaint/mapcss/parsergen/TokenMgrError.java b/src/org/openstreetmap/josm/gui/mappaint/mapcss/parsergen/TokenMgrError.java
    new file mode 100644
    index 0000000..56b083c
    - +  
     1/* Generated By:JavaCC: Do not edit this line. TokenMgrError.java Version 6.1 */
     2/* JavaCCOptions: */
     3package org.openstreetmap.josm.gui.mappaint.mapcss.parsergen;
     4
     5/** Token Manager Error. */
     6public class TokenMgrError extends Error
     7{
     8
     9  /**
     10   * The version identifier for this Serializable class.
     11   * Increment only if the <i>serialized</i> form of the
     12   * class changes.
     13   */
     14  private static final long serialVersionUID = 1L;
     15
     16  /*
     17   * Ordinals for various reasons why an Error of this type can be thrown.
     18   */
     19
     20  /**
     21   * Lexical error occurred.
     22   */
     23  public static final int LEXICAL_ERROR = 0;
     24
     25  /**
     26   * An attempt was made to create a second instance of a static token manager.
     27   */
     28  public static final int STATIC_LEXER_ERROR = 1;
     29
     30  /**
     31   * Tried to change to an invalid lexical state.
     32   */
     33  public static final int INVALID_LEXICAL_STATE = 2;
     34
     35  /**
     36   * Detected (and bailed out of) an infinite loop in the token manager.
     37   */
     38  public static final int LOOP_DETECTED = 3;
     39
     40  /**
     41   * Indicates the reason why the exception is thrown. It will have
     42   * one of the above 4 values.
     43   */
     44  int errorCode;
     45
     46  /**
     47   * Replaces unprintable characters by their escaped (or unicode escaped)
     48   * equivalents in the given string
     49   */
     50  protected static final String addEscapes(String str) {
     51    StringBuffer retval = new StringBuffer();
     52    char ch;
     53    for (int i = 0; i < str.length(); i++) {
     54      switch (str.charAt(i))
     55      {
     56        case '\b':
     57          retval.append("\\b");
     58          continue;
     59        case '\t':
     60          retval.append("\\t");
     61          continue;
     62        case '\n':
     63          retval.append("\\n");
     64          continue;
     65        case '\f':
     66          retval.append("\\f");
     67          continue;
     68        case '\r':
     69          retval.append("\\r");
     70          continue;
     71        case '\"':
     72          retval.append("\\\"");
     73          continue;
     74        case '\'':
     75          retval.append("\\\'");
     76          continue;
     77        case '\\':
     78          retval.append("\\\\");
     79          continue;
     80        default:
     81          if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
     82            String s = "0000" + Integer.toString(ch, 16);
     83            retval.append("\\u" + s.substring(s.length() - 4, s.length()));
     84          } else {
     85            retval.append(ch);
     86          }
     87          continue;
     88      }
     89    }
     90    return retval.toString();
     91  }
     92
     93  /**
     94   * Returns a detailed message for the Error when it is thrown by the
     95   * token manager to indicate a lexical error.
     96   * Parameters :
     97   *    EOFSeen     : indicates if EOF caused the lexical error
     98   *    curLexState : lexical state in which this error occurred
     99   *    errorLine   : line number when the error occurred
     100   *    errorColumn : column number when the error occurred
     101   *    errorAfter  : prefix that was seen before this error occurred
     102   *    curchar     : the offending character
     103   * Note: You can customize the lexical error message by modifying this method.
     104   */
     105  protected static String LexicalErr(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, int curChar) {
     106    char curChar1 = (char)curChar;
     107    return("Lexical error at line " +
     108          errorLine + ", column " +
     109          errorColumn + ".  Encountered: " +
     110          (EOFSeen ? "<EOF> " : ("\"" + addEscapes(String.valueOf(curChar1)) + "\"") + " (" + (int)curChar + "), ") +
     111          "after : \"" + addEscapes(errorAfter) + "\"");
     112  }
     113
     114  /**
     115   * You can also modify the body of this method to customize your error messages.
     116   * For example, cases like LOOP_DETECTED and INVALID_LEXICAL_STATE are not
     117   * of end-users concern, so you can return something like :
     118   *
     119   *     "Internal Error : Please file a bug report .... "
     120   *
     121   * from this method for such cases in the release version of your parser.
     122   */
     123  public String getMessage() {
     124    return super.getMessage();
     125  }
     126
     127  /*
     128   * Constructors of various flavors follow.
     129   */
     130
     131  /** No arg constructor. */
     132  public TokenMgrError() {
     133  }
     134
     135  /** Constructor with message and reason. */
     136  public TokenMgrError(String message, int reason) {
     137    super(message);
     138    errorCode = reason;
     139  }
     140
     141  /** Full Constructor. */
     142  public TokenMgrError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, int curChar, int reason) {
     143    this(LexicalErr(EOFSeen, lexState, errorLine, errorColumn, errorAfter, curChar), reason);
     144  }
     145}
     146/* JavaCC - OriginalChecksum=0e1a6491f37ae169ef267e06e7e99988 (do not edit this line) */
  • src/org/openstreetmap/josm/gui/preferences/projection/ProjectionPreference.java

    diff --git a/src/org/openstreetmap/josm/gui/preferences/projection/ProjectionPreference.java b/src/org/openstreetmap/josm/gui/preferences/projection/ProjectionPreference.java
    index dacece7..3a1ec63 100644
    a b import org.openstreetmap.josm.data.preferences.CollectionProperty;  
    2929import org.openstreetmap.josm.data.preferences.StringProperty;
    3030import org.openstreetmap.josm.data.projection.CustomProjection;
    3131import org.openstreetmap.josm.data.projection.Projection;
    32 import org.openstreetmap.josm.gui.NavigatableComponent;
    3332import org.openstreetmap.josm.gui.preferences.PreferenceSetting;
    3433import org.openstreetmap.josm.gui.preferences.PreferenceSettingFactory;
    3534import org.openstreetmap.josm.gui.preferences.PreferenceTabbedPane;
    public class ProjectionPreference implements SubPreferenceSetting {  
    383382        }
    384383
    385384        int i = unitsCombo.getSelectedIndex();
    386         NavigatableComponent.setSystemOfMeasurement(unitsValues[i]);
     385        SystemOfMeasurement.setSystemOfMeasurement(unitsValues[i]);
    387386
    388387        return false;
    389388    }