diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5e56e04 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/bin diff --git a/README.md b/README.md new file mode 100644 index 0000000..9ab9d6b --- /dev/null +++ b/README.md @@ -0,0 +1,12 @@ +# Final Project +--- + +1. To run the program please run the script: + ```bash + chmod +x build.sh + ./build.sh + ``` +2. To run the program with bash run the command: + ```bash + bash build.sh + ``` diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..6a2db76 --- /dev/null +++ b/build.sh @@ -0,0 +1,43 @@ +#!/bin/bash +set -e +GREEN="\033[32m" +RESET="\033[0m" +echo "" +echo "==== CPSC 449 Project ====" + +# Create lib directory +mkdir -p bin + +echo "1. Checking dependencies" + +if [ ! -f "lib/antlr-4.9.3-complete.jar" ]; then + echo " Please Download ANTLR" +fi + +if [ ! -f "lib/jgrapht-core-1.5.1.jar" ]; then + echo " Please Download JGraphT" +fi + +if [ ! -f "lib/jgrapht-io-1.5.1.jar" ]; then + echo " Please Download JGraphT IO" +fi + +echo " [x] All dependencies acounted for" + +CP="lib/antlr-4.9.3-complete.jar:lib/jgrapht-core-1.5.1.jar:lib/jgrapht-io-1.5.1.jar" + +echo "2. Compiling CFG packages" +javac -d bin -cp "$CP" src/org/lsmr/cfg/*.java +echo " [x] CFG compiled" + +echo "3. Compiling PDG packages" +javac -d bin -cp "$CP:bin" src/pdg/*.java +echo " [x] PDG compiled" + +echo "" +echo -e "${GREEN}==== Compilation Complete! ====${RESET}" +echo -e "${GREEN}Compiled classes are in: bin/${RESET}" +echo "" +echo -e "${GREEN}>> To run this program:${RESET}" +echo -e "${GREEN} java -cp bin:$CP YourMainClass${RESET}" +echo "" diff --git a/lib/antlr-4.13.2-complete.jar b/lib/antlr-4.13.2-complete.jar new file mode 100644 index 0000000..75bfcc3 Binary files /dev/null and b/lib/antlr-4.13.2-complete.jar differ diff --git a/lib/antlr-4.9.3-complete.jar b/lib/antlr-4.9.3-complete.jar new file mode 100644 index 0000000..749296f Binary files /dev/null and b/lib/antlr-4.9.3-complete.jar differ diff --git a/lib/apfloat-1.10.1-javadoc.jar b/lib/apfloat-1.10.1-javadoc.jar new file mode 100644 index 0000000..6e86282 Binary files /dev/null and b/lib/apfloat-1.10.1-javadoc.jar differ diff --git a/lib/apfloat-1.10.1.jar b/lib/apfloat-1.10.1.jar new file mode 100644 index 0000000..9958619 Binary files /dev/null and b/lib/apfloat-1.10.1.jar differ diff --git a/lib/jgrapht-core-1.5.1.jar b/lib/jgrapht-core-1.5.1.jar new file mode 100644 index 0000000..2667b8f Binary files /dev/null and b/lib/jgrapht-core-1.5.1.jar differ diff --git a/lib/jgrapht-core-1.5.2-javadoc.jar b/lib/jgrapht-core-1.5.2-javadoc.jar new file mode 100644 index 0000000..3f9dc5b Binary files /dev/null and b/lib/jgrapht-core-1.5.2-javadoc.jar differ diff --git a/lib/jgrapht-core-1.5.2.jar b/lib/jgrapht-core-1.5.2.jar new file mode 100644 index 0000000..8283b35 Binary files /dev/null and b/lib/jgrapht-core-1.5.2.jar differ diff --git a/lib/jgrapht-io-1.5.1.jar b/lib/jgrapht-io-1.5.1.jar new file mode 100644 index 0000000..27c87ed Binary files /dev/null and b/lib/jgrapht-io-1.5.1.jar differ diff --git a/lib/jgrapht-io-1.5.2.jar b/lib/jgrapht-io-1.5.2.jar new file mode 100644 index 0000000..c444182 Binary files /dev/null and b/lib/jgrapht-io-1.5.2.jar differ diff --git a/lib/jheaps-0.14-javadoc.jar b/lib/jheaps-0.14-javadoc.jar new file mode 100644 index 0000000..863c71d Binary files /dev/null and b/lib/jheaps-0.14-javadoc.jar differ diff --git a/lib/jheaps-0.14.jar b/lib/jheaps-0.14.jar new file mode 100644 index 0000000..a0f0c23 Binary files /dev/null and b/lib/jheaps-0.14.jar differ diff --git a/src/.DS_Store b/src/.DS_Store new file mode 100644 index 0000000..a1d0d38 Binary files /dev/null and b/src/.DS_Store differ diff --git a/src/Test.java b/src/Test.java new file mode 100644 index 0000000..8bdf63f --- /dev/null +++ b/src/Test.java @@ -0,0 +1,55 @@ +import org.lsmr.cfg.ControlFlowGraph; +import org.lsmr.cfg.Node; +import org.lsmr.cfg.Edge; +import pdg.PDG; +import java.util.Set; + +public class Test { + public static void main(String[] args) { + System.out.println("=== PDG Test ===\n"); + + // Create a simple CFG manually + ControlFlowGraph cfg = new ControlFlowGraph("testMethod"); + + // Create nodes + Node n1 = cfg.buildNode("int x = 5"); + Node n2 = cfg.buildNode("int y = x + 10"); + Node n3 = cfg.buildNode("int z = y * 2"); + Node n4 = cfg.buildNode("System.out.println(z)"); + + // Connect nodes: entry -> n1 -> n2 -> n3 -> n4 -> exit + cfg.buildEdge(cfg.entry, n1, Edge.EdgeLabel.BLANK); + cfg.buildEdge(n1, n2, Edge.EdgeLabel.BLANK); + cfg.buildEdge(n2, n3, Edge.EdgeLabel.BLANK); + cfg.buildEdge(n3, n4, Edge.EdgeLabel.BLANK); + cfg.buildEdge(n4, cfg.normalExit, Edge.EdgeLabel.BLANK); + + System.out.println("CFG created with " + cfg.nodes().size() + " nodes"); + + // Create PDG from CFG + PDG pdg = new PDG(cfg); + + // Print CFG structure + pdg.printCFG(); + + // Print PDG structure + pdg.printPDG(); + + // Test impact analysis + System.out.println("\n=== Impact Analysis ==="); + + String[] testNodes = {"int x = 5", "int y = x + 10", "int z = y * 2"}; + + for (String nodeLabel : testNodes) { + Set impacted = pdg.computeForwardSlice(nodeLabel); + System.out.println("\nChanging '" + nodeLabel + "' impacts:"); + for (String label : impacted) { + if (!label.startsWith("*")) { // Skip special nodes + System.out.println(" - " + label); + } + } + } + + System.out.println("\n=== Test Complete ==="); + } +} diff --git a/src/org/.DS_Store b/src/org/.DS_Store new file mode 100644 index 0000000..da72000 Binary files /dev/null and b/src/org/.DS_Store differ diff --git a/src/org/lsmr/.DS_Store b/src/org/lsmr/.DS_Store new file mode 100644 index 0000000..b298281 Binary files /dev/null and b/src/org/lsmr/.DS_Store differ diff --git a/src/org/lsmr/cfg/ControlFlowGraph.java b/src/org/lsmr/cfg/ControlFlowGraph.java new file mode 100644 index 0000000..6f73c2a --- /dev/null +++ b/src/org/lsmr/cfg/ControlFlowGraph.java @@ -0,0 +1,297 @@ +package org.lsmr.cfg; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.antlr.v4.runtime.tree.ParseTree; +import org.lsmr.cfg.Edge.EdgeLabel; +import org.lsmr.cfg.Java1_4Parser.StatementContext; + +/** + * Represents mathematical graphs. Each graph contains a set of nodes, each of + * which will refer to this graph as its container, and a set of edges, each of + * which will refer to this graph as its container and to two nodes that must be + * in this graph. To guarantee that these constraints be met, nodes and edges + * are read-only and have to be created indirectly from the graph in which they + * exist. + */ +public class ControlFlowGraph { + /** + * Represents the entry point of this CFG. This will have no in-edges, but at + * least one out-edge. + */ + public Node entry; + + /** + * Represents the exit point of this CFG for normal returns. This will have no + * out-edges, but at least one in-edge. + */ + public Node normalExit; + + /** + * Represents the exit point of this CFG for exception throws. This will have no + * out-edges, but at least one in-edge. + */ + public Node abruptExit; + + private Map> nodes = new HashMap<>(); + private List edges = new ArrayList<>(); + private String name; + + /** + * Determines if this CFG contains the indicated node, using the + * {@link Node#equals(Object)} method. + * + * @param n + * The node to look for. + * @return true if this CFG contains the indicated node; otherwise, false. + */ + public boolean containsNode(Node n) { + String label = n.label(); + List list = nodes.get(label); + + return list.contains(n); + } + + /** + * Constructor + * + * @param name + * The name of the graph. Cannot be null or empty. + * @throws IllegalArgumentException + * If the name is null or empty. + */ + public ControlFlowGraph(String name) { + if(name == null || name.length() < 1) + throw new IllegalArgumentException(); + + this.name = name; + + String entryLabel = "*ENTRY*"; + entry = new Node(entryLabel); + entry.setGraph(this); + nodes.put(entryLabel, new ArrayList<>(Arrays.asList(entry))); + + String exitLabel = "*EXIT*"; + normalExit = new Node(exitLabel); + normalExit.setGraph(this); + nodes.put(exitLabel, new ArrayList<>(Arrays.asList(normalExit))); + + String abruptExitLabel = "*THROWN*"; + abruptExit = new Node(abruptExitLabel); + abruptExit.setGraph(this); + nodes.put(abruptExitLabel, new ArrayList<>(Arrays.asList(abruptExit))); + } + + /** + * Accesses the set of nodes defined on this graph. + * + * @return An immutable set of all nodes defined on this graph. + */ + public List nodes() { + ArrayList result = new ArrayList<>(); + + for(List list : nodes.values()) + result.addAll(list); + + return Collections.unmodifiableList(result); + } + + /** + * Accesses the set of edges defined on this graph. + * + * @return An immutable set of all edges defined on this graph. + */ + public List edges() { + return Collections.unmodifiableList(edges); + } + + /** + * Accesses the first node with label as its label. + * + * @param label + * The label to locate. Must not be null. + * @return The first node with the indicated label, or null if nonesuch exists. + */ + public Node findNode(String label) { + List list = nodes.get(label); + + if(list != null && list.size() > 0) + return list.get(0); + + return null; + } + + /** + * Accesses the first node with label as its label. + * + * @param label + * The label to locate. Must not be null. + * @return The first node with the indicated label, or null if nonesuch exists. + */ + public List findNodes(String label) { + List list = nodes.get(label); + + if(list != null) + return Collections.unmodifiableList(list); + + return null; + } + + /** + * Builds a node on this graph with the indicated label. + * + * @param label + * A label for the new node that may be used in identifying it. + * Cannot be null or empty. + * @return The newly created node. + * @throws IllegalArgumentException + * If the label is null or empty. + */ + public Node buildNode(String label) { + if(label == null || label.length() < 1) + throw new IllegalArgumentException(); + + Node node = new Node(label); + List list; + + if(nodes.containsKey(label)) + list = nodes.get(label); + else { + list = new ArrayList<>(); + nodes.put(label, list); + } + + list.add(node); + node.setGraph(this); + + return node; + } + + /** + * Builds an edge on this graph with the indicated label. + * + * @param source + * The source node. Cannot be null. + * @param target + * The target node. Cannot be null. + * @param label + * A label for the new edge that may be used in identifying it. + * Cannot be null or empty. + * @return The newly created edge. + * @throws IllegalArgumentException + * If the label is null or empty or either of the indicated nodes is + * null. + */ + public Edge buildEdge(Node source, Node target, EdgeLabel label) { + if(source == null || label == null) + throw new IllegalArgumentException(); + + Edge edge = new Edge(source, target, label); + + edges.add(edge); + edge.setGraph(this); + source.addOutEdge(edge); + + if(target != null) + target.addInEdge(edge); + + return edge; + } + + /** + * Builds an edge on this graph with the indicated label. + * + * @param source + * The source node. Cannot be null. + * @param target + * The target node. Cannot be null. + * @param label + * A label for the new edge that may be used in identifying it. + * Cannot be null or empty. + * @param extendedLabel + * An extension to the label for the new edge that may be used in + * identifying it. + * @return The newly created edge. + * @throws IllegalArgumentException + * If the label is null or empty or either of the indicated nodes is + * null. + */ + public Edge buildEdge(Node source, Node target, EdgeLabel label, String extendedLabel) { + if(source == null || label == null) + throw new IllegalArgumentException(); + + Edge edge = new Edge(source, target, label, extendedLabel); + + edges.add(edge); + edge.setGraph(this); + source.addOutEdge(edge); + + if(target != null) + target.addInEdge(edge); + + return edge; + } + + @Override + public boolean equals(Object obj) { + if(!(obj instanceof ControlFlowGraph)) + return false; + + ControlFlowGraph other = (ControlFlowGraph)obj; + + return areEqual(nodes, other.nodes) && areEqual(edges, other.edges); + } + + private static boolean areEqual(Map> nodes1, Map> nodes2) { + List list1 = new ArrayList<>(); + List list2 = new ArrayList<>(); + + for(List nodeList : nodes1.values()) + list1.addAll(nodeList); + + for(List nodeList : nodes2.values()) + list2.addAll(nodeList); + + if(list1.size() != list2.size()) + return false; + + for(Node n : list1) + if(!list2.contains(n)) + return false; + + return true; + } + + private static boolean areEqual(List edges1, List edges2) { + if(edges1.size() != edges2.size()) + return false; + + for(Edge edge : edges1) { + if(!edges2.contains(edge)) + return false; + } + + return true; + } + + public String toString() { + StringBuilder sb = new StringBuilder(); + + sb.append("graph "); + sb.append(name); + sb.append(": nodes ["); + sb.append(nodes.toString()); + sb.append("], edges ["); + sb.append(edges.toString()); + sb.append("]"); + + return sb.toString(); + } +} diff --git a/src/org/lsmr/cfg/Edge.java b/src/org/lsmr/cfg/Edge.java new file mode 100644 index 0000000..c6a00f2 --- /dev/null +++ b/src/org/lsmr/cfg/Edge.java @@ -0,0 +1,207 @@ +package org.lsmr.cfg; + +import java.util.Set; + +/** + * Represents an edge in a graph. During construction of a graph, it can be that + * edges are not fully initialized on a first pass. + */ +public class Edge { + + /** + * The legal labels to use on edges. + */ + public static enum EdgeLabel { + /** + * Represents a default edge without no label to test for branching. + */ + BLANK, + /** + * Represents a true branch. + */ + TRUE, + /** + * Represents a false branch. + */ + FALSE, + /** + * Represents a branch taken when an exception is thrown. + */ + THROWN, + /** + * Represents a branch taken when an exception is thrown but delayed for completion in a finally block. + */ + THROWN_DELAYED, + /** + * Represents a branch taken when an exception is definitively caught. + */ + CAUGHT, + /** + * Represents a branch taken when the corresponding extended label is matched. + */ + CASE; + + public String toString() { + switch(this) { + case BLANK: + return ""; + + default: + return super.toString(); + } + } + } + + private Node source; + Node target; + private EdgeLabel label; + private String extendedLabel; + private ControlFlowGraph graph; + + Edge(Node source, Node target, EdgeLabel label) { + this(source, target, label, ""); + } + + Edge(Node source, Node target, EdgeLabel label, String extendedLabel) { + if(source == null || label == null) + throw new IllegalArgumentException(); + + this.source = source; + this.target = target; + this.label = label; + this.extendedLabel = extendedLabel; + } + + /** + * Represents the source node for this edge. + * + * @return The source node. Should not be null. + */ + public Node source() { + return source; + } + + /** + * Represents the target node for this edge. + * + * @return The target node. May be null if it has not been fully initialized. + */ + public Node target() { + return target; + } + + /** + * Represents the kind of edge represented: BLANK if default. + * + * @return The label of this edge. Should not be null. + */ + public EdgeLabel label() { + return label; + } + + /** + * Represents the extended label for edges whose labels cannot be purely + * represented via an enum constant. + * + * @return The extended label of this edge. Should not be null; may be empty. + */ + public String extendedLabel() { + return extendedLabel; + } + + /** + * Represents the graph in which this edge occurs. + * + * @return The graph in which this edge occurs. Should not be null unless the + * edge is not fully initialized. + */ + public ControlFlowGraph graph() { + return graph; + } + + void setTarget(Node target) { + if(target == null || target.graph() != graph) + throw new IllegalArgumentException(); + + this.target = target; + + if(target != null) + target.addInEdge(this); + } + + void setGraph(ControlFlowGraph graph) { + if(this.graph != null) { + if(graph == null) + this.graph = null; + else + throw new IllegalStateException("Non-null graph cannot be swapped to another. Erase it first"); + } + else if(graph == null) + throw new IllegalStateException("Null graph should not be set to null again"); + else + this.graph = graph; + + if(!graph.containsNode(source)) + throw new IllegalStateException("Edge source not member of graph"); + + if(target != null && !graph.containsNode(target)) + throw new IllegalStateException("Edge target not member of graph"); + } + + @Override + public int hashCode() { + int result = 17; + + result = 31 * result + source.hashCode(); + result = 31 * result + (target != null ? target.hashCode() : 0); + + return result; + } + + @Override + public boolean equals(Object obj) { + if(obj instanceof Edge) { + Edge other = (Edge)obj; + + if(label != null) + return label.equals(other.label); + + if(source.equals(other.source)) { + if(target == null) { + if(other.target == null) + return true; + } + else + return target.equals(other.target); + } + } + + return false; + } + + public String toString() { + StringBuilder sb = new StringBuilder(); + + sb.append("edge"); + + String ls = label.toString(); + + if(ls != "") { + sb.append(" "); + sb.append(ls); + + if(extendedLabel != null) { + sb.append(" "); + sb.append(extendedLabel); + } + } + + sb.append(": ("); + sb.append(source.label()); + sb.append(", "); + sb.append(target == null ? "null" : target.label()); + sb.append(")"); + + return sb.toString(); + } +} diff --git a/src/org/lsmr/cfg/Java1_4Lexer.java b/src/org/lsmr/cfg/Java1_4Lexer.java new file mode 100644 index 0000000..f870caf --- /dev/null +++ b/src/org/lsmr/cfg/Java1_4Lexer.java @@ -0,0 +1,891 @@ +// Generated from Java1_4Lexer.g4 by ANTLR 4.13.2 + + package org.lsmr.cfg; + +import org.antlr.v4.runtime.Lexer; +import org.antlr.v4.runtime.CharStream; +import org.antlr.v4.runtime.Token; +import org.antlr.v4.runtime.TokenStream; +import org.antlr.v4.runtime.*; +import org.antlr.v4.runtime.atn.*; +import org.antlr.v4.runtime.dfa.DFA; +import org.antlr.v4.runtime.misc.*; + +@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue", "this-escape"}) +public class Java1_4Lexer extends Lexer { + static { RuntimeMetaData.checkVersion("4.13.2", RuntimeMetaData.VERSION); } + + protected static final DFA[] _decisionToDFA; + protected static final PredictionContextCache _sharedContextCache = + new PredictionContextCache(); + public static final int + ABSTRACT=1, ASSERT=2, BOOLEAN=3, BREAK=4, BYTE=5, CASE=6, CATCH=7, CHAR=8, + CLASS=9, CONTINUE=10, DEFAULT=11, DO=12, DOUBLE=13, ELSE=14, EXTENDS=15, + FINAL=16, FINALLY=17, FLOAT=18, FOR=19, IF=20, IMPLEMENTS=21, IMPORT=22, + INSTANCEOF=23, INT=24, INTERFACE=25, LONG=26, NATIVE=27, NEW=28, PACKAGE=29, + PRIVATE=30, PROTECTED=31, PUBLIC=32, RETURN=33, SHORT=34, STATIC=35, STRICTFP=36, + SUPER=37, SWITCH=38, SYNCHRONIZED=39, THIS=40, THROW=41, THROWS=42, TRANSIENT=43, + TRY=44, VOID=45, VOLATILE=46, WHILE=47, SEMICOLON=48, COMMA=49, PERIOD=50, + OPEN_PARENTHESIS=51, CLOSE_PARENTHESIS=52, OPEN_BRACE=53, CLOSE_BRACE=54, + OPEN_BRACKET=55, CLOSE_BRACKET=56, COLON=57, QUESTION=58, EQUALS=59, PLUS=60, + MINUS=61, ASTERISK=62, SLASH=63, PERCENT=64, DOUBLE_PLUS=65, DOUBLE_MINUS=66, + EXCLAMATION=67, TILDE=68, DOUBLE_EQUALS=69, EXCLAMATION_EQUALS=70, LESS_THAN=71, + GREATER_THAN=72, LESS_THAN_OR_EQUALS=73, GREATER_THAN_OR_EQUALS=74, DOUBLE_AMPERSAND=75, + DOUBLE_PIPE=76, AMPERSAND=77, PIPE=78, CARET=79, DOUBLE_LESS_THAN=80, + DOUBLE_GREATER_THAN=81, TRIPLE_GREATER_THAN=82, PLUS_EQUALS=83, MINUS_EQUALS=84, + ASTERISK_EQUALS=85, SLASH_EQUALS=86, AMPERSAND_EQUALS=87, PIPE_EQUALS=88, + CARET_EQUALS=89, PERCENT_EQUALS=90, DOUBLE_LESS_THAN_EQUALS=91, DOUBLE_GREATER_THAN_EQUALS=92, + TRIPLE_GREATER_THAN_EQUALS=93, Identifier=94, IntegerLiteral=95, FloatingPointLiteral=96, + CharacterLiteral=97, StringLiteral=98, BooleanLiteral=99, NullLiteral=100, + WHITESPACE=101, LINE_COMMENT=102, COMMENT=103; + public static String[] channelNames = { + "DEFAULT_TOKEN_CHANNEL", "HIDDEN" + }; + + public static String[] modeNames = { + "DEFAULT_MODE" + }; + + private static String[] makeRuleNames() { + return new String[] { + "ABSTRACT", "ASSERT", "BOOLEAN", "BREAK", "BYTE", "CASE", "CATCH", "CHAR", + "CLASS", "CONTINUE", "DEFAULT", "DO", "DOUBLE", "ELSE", "EXTENDS", "FINAL", + "FINALLY", "FLOAT", "FOR", "IF", "IMPLEMENTS", "IMPORT", "INSTANCEOF", + "INT", "INTERFACE", "LONG", "NATIVE", "NEW", "PACKAGE", "PRIVATE", "PROTECTED", + "PUBLIC", "RETURN", "SHORT", "STATIC", "STRICTFP", "SUPER", "SWITCH", + "SYNCHRONIZED", "THIS", "THROW", "THROWS", "TRANSIENT", "TRY", "VOID", + "VOLATILE", "WHILE", "SEMICOLON", "COMMA", "PERIOD", "OPEN_PARENTHESIS", + "CLOSE_PARENTHESIS", "OPEN_BRACE", "CLOSE_BRACE", "OPEN_BRACKET", "CLOSE_BRACKET", + "COLON", "QUESTION", "EQUALS", "PLUS", "MINUS", "ASTERISK", "SLASH", + "PERCENT", "DOUBLE_PLUS", "DOUBLE_MINUS", "EXCLAMATION", "TILDE", "DOUBLE_EQUALS", + "EXCLAMATION_EQUALS", "LESS_THAN", "GREATER_THAN", "LESS_THAN_OR_EQUALS", + "GREATER_THAN_OR_EQUALS", "DOUBLE_AMPERSAND", "DOUBLE_PIPE", "AMPERSAND", + "PIPE", "CARET", "DOUBLE_LESS_THAN", "DOUBLE_GREATER_THAN", "TRIPLE_GREATER_THAN", + "PLUS_EQUALS", "MINUS_EQUALS", "ASTERISK_EQUALS", "SLASH_EQUALS", "AMPERSAND_EQUALS", + "PIPE_EQUALS", "CARET_EQUALS", "PERCENT_EQUALS", "DOUBLE_LESS_THAN_EQUALS", + "DOUBLE_GREATER_THAN_EQUALS", "TRIPLE_GREATER_THAN_EQUALS", "Identifier", + "JavaLetter", "JavaLetterOrDigit", "IntegerLiteral", "FloatingPointLiteral", + "CharacterLiteral", "StringLiteral", "BooleanLiteral", "NullLiteral", + "WHITESPACE", "LINE_COMMENT", "COMMENT" + }; + } + public static final String[] ruleNames = makeRuleNames(); + + private static String[] makeLiteralNames() { + return new String[] { + null, "'abstract'", "'assert'", "'boolean'", "'break'", "'byte'", "'case'", + "'catch'", "'char'", "'class'", "'continue'", "'default'", "'do'", "'double'", + "'else'", "'extends'", "'final'", "'finally'", "'float'", "'for'", "'if'", + "'implements'", "'import'", "'instanceof'", "'int'", "'interface'", "'long'", + "'native'", "'new'", "'package'", "'private'", "'protected'", "'public'", + "'return'", "'short'", "'static'", "'strictfp'", "'super'", "'switch'", + "'synchronized'", "'this'", "'throw'", "'throws'", "'transient'", "'try'", + "'void'", "'volatile'", "'while'", "';'", "','", "'.'", "'('", "')'", + "'{'", "'}'", "'['", "']'", "':'", "'?'", "'='", "'+'", "'-'", "'*'", + "'/'", "'%'", "'++'", "'--'", "'!'", "'~'", "'=='", "'!='", "'<'", "'>'", + "'<='", "'>='", "'&&'", "'||'", "'&'", "'|'", "'^'", "'<<'", "'>>'", + "'>>>'", "'+='", "'-='", "'*='", "'/='", "'&='", "'|='", "'^='", "'%='", + "'<<='", "'>>='", "'>>>='", null, null, null, null, null, null, "'null'" + }; + } + private static final String[] _LITERAL_NAMES = makeLiteralNames(); + private static String[] makeSymbolicNames() { + return new String[] { + null, "ABSTRACT", "ASSERT", "BOOLEAN", "BREAK", "BYTE", "CASE", "CATCH", + "CHAR", "CLASS", "CONTINUE", "DEFAULT", "DO", "DOUBLE", "ELSE", "EXTENDS", + "FINAL", "FINALLY", "FLOAT", "FOR", "IF", "IMPLEMENTS", "IMPORT", "INSTANCEOF", + "INT", "INTERFACE", "LONG", "NATIVE", "NEW", "PACKAGE", "PRIVATE", "PROTECTED", + "PUBLIC", "RETURN", "SHORT", "STATIC", "STRICTFP", "SUPER", "SWITCH", + "SYNCHRONIZED", "THIS", "THROW", "THROWS", "TRANSIENT", "TRY", "VOID", + "VOLATILE", "WHILE", "SEMICOLON", "COMMA", "PERIOD", "OPEN_PARENTHESIS", + "CLOSE_PARENTHESIS", "OPEN_BRACE", "CLOSE_BRACE", "OPEN_BRACKET", "CLOSE_BRACKET", + "COLON", "QUESTION", "EQUALS", "PLUS", "MINUS", "ASTERISK", "SLASH", + "PERCENT", "DOUBLE_PLUS", "DOUBLE_MINUS", "EXCLAMATION", "TILDE", "DOUBLE_EQUALS", + "EXCLAMATION_EQUALS", "LESS_THAN", "GREATER_THAN", "LESS_THAN_OR_EQUALS", + "GREATER_THAN_OR_EQUALS", "DOUBLE_AMPERSAND", "DOUBLE_PIPE", "AMPERSAND", + "PIPE", "CARET", "DOUBLE_LESS_THAN", "DOUBLE_GREATER_THAN", "TRIPLE_GREATER_THAN", + "PLUS_EQUALS", "MINUS_EQUALS", "ASTERISK_EQUALS", "SLASH_EQUALS", "AMPERSAND_EQUALS", + "PIPE_EQUALS", "CARET_EQUALS", "PERCENT_EQUALS", "DOUBLE_LESS_THAN_EQUALS", + "DOUBLE_GREATER_THAN_EQUALS", "TRIPLE_GREATER_THAN_EQUALS", "Identifier", + "IntegerLiteral", "FloatingPointLiteral", "CharacterLiteral", "StringLiteral", + "BooleanLiteral", "NullLiteral", "WHITESPACE", "LINE_COMMENT", "COMMENT" + }; + } + private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); + public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); + + /** + * @deprecated Use {@link #VOCABULARY} instead. + */ + @Deprecated + public static final String[] tokenNames; + static { + tokenNames = new String[_SYMBOLIC_NAMES.length]; + for (int i = 0; i < tokenNames.length; i++) { + tokenNames[i] = VOCABULARY.getLiteralName(i); + if (tokenNames[i] == null) { + tokenNames[i] = VOCABULARY.getSymbolicName(i); + } + + if (tokenNames[i] == null) { + tokenNames[i] = ""; + } + } + } + + @Override + @Deprecated + public String[] getTokenNames() { + return tokenNames; + } + + @Override + + public Vocabulary getVocabulary() { + return VOCABULARY; + } + + + public Java1_4Lexer(CharStream input) { + super(input); + _interp = new LexerATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache); + } + + @Override + public String getGrammarFileName() { return "Java1_4Lexer.g4"; } + + @Override + public String[] getRuleNames() { return ruleNames; } + + @Override + public String getSerializedATN() { return _serializedATN; } + + @Override + public String[] getChannelNames() { return channelNames; } + + @Override + public String[] getModeNames() { return modeNames; } + + @Override + public ATN getATN() { return _ATN; } + + public static final String _serializedATN = + "\u0004\u0000g\u02ef\u0006\uffff\uffff\u0002\u0000\u0007\u0000\u0002\u0001"+ + "\u0007\u0001\u0002\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004"+ + "\u0007\u0004\u0002\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007"+ + "\u0007\u0007\u0002\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b"+ + "\u0007\u000b\u0002\f\u0007\f\u0002\r\u0007\r\u0002\u000e\u0007\u000e\u0002"+ + "\u000f\u0007\u000f\u0002\u0010\u0007\u0010\u0002\u0011\u0007\u0011\u0002"+ + "\u0012\u0007\u0012\u0002\u0013\u0007\u0013\u0002\u0014\u0007\u0014\u0002"+ + "\u0015\u0007\u0015\u0002\u0016\u0007\u0016\u0002\u0017\u0007\u0017\u0002"+ + "\u0018\u0007\u0018\u0002\u0019\u0007\u0019\u0002\u001a\u0007\u001a\u0002"+ + "\u001b\u0007\u001b\u0002\u001c\u0007\u001c\u0002\u001d\u0007\u001d\u0002"+ + "\u001e\u0007\u001e\u0002\u001f\u0007\u001f\u0002 \u0007 \u0002!\u0007"+ + "!\u0002\"\u0007\"\u0002#\u0007#\u0002$\u0007$\u0002%\u0007%\u0002&\u0007"+ + "&\u0002\'\u0007\'\u0002(\u0007(\u0002)\u0007)\u0002*\u0007*\u0002+\u0007"+ + "+\u0002,\u0007,\u0002-\u0007-\u0002.\u0007.\u0002/\u0007/\u00020\u0007"+ + "0\u00021\u00071\u00022\u00072\u00023\u00073\u00024\u00074\u00025\u0007"+ + "5\u00026\u00076\u00027\u00077\u00028\u00078\u00029\u00079\u0002:\u0007"+ + ":\u0002;\u0007;\u0002<\u0007<\u0002=\u0007=\u0002>\u0007>\u0002?\u0007"+ + "?\u0002@\u0007@\u0002A\u0007A\u0002B\u0007B\u0002C\u0007C\u0002D\u0007"+ + "D\u0002E\u0007E\u0002F\u0007F\u0002G\u0007G\u0002H\u0007H\u0002I\u0007"+ + "I\u0002J\u0007J\u0002K\u0007K\u0002L\u0007L\u0002M\u0007M\u0002N\u0007"+ + "N\u0002O\u0007O\u0002P\u0007P\u0002Q\u0007Q\u0002R\u0007R\u0002S\u0007"+ + "S\u0002T\u0007T\u0002U\u0007U\u0002V\u0007V\u0002W\u0007W\u0002X\u0007"+ + "X\u0002Y\u0007Y\u0002Z\u0007Z\u0002[\u0007[\u0002\\\u0007\\\u0002]\u0007"+ + "]\u0002^\u0007^\u0002_\u0007_\u0002`\u0007`\u0002a\u0007a\u0002b\u0007"+ + "b\u0002c\u0007c\u0002d\u0007d\u0002e\u0007e\u0002f\u0007f\u0002g\u0007"+ + "g\u0002h\u0007h\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001"+ + "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0001\u0001"+ + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001"+ + "\u0002\u0001\u0002\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001"+ + "\u0003\u0001\u0003\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001"+ + "\u0004\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\b\u0001\b"+ + "\u0001\b\u0001\b\u0001\b\u0001\b\u0001\t\u0001\t\u0001\t\u0001\t\u0001"+ + "\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\n\u0001\n\u0001\n\u0001\n\u0001"+ + "\n\u0001\n\u0001\n\u0001\n\u0001\u000b\u0001\u000b\u0001\u000b\u0001\f"+ + "\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\r\u0001\r\u0001"+ + "\r\u0001\r\u0001\r\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001"+ + "\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000f\u0001\u000f\u0001"+ + "\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u0010\u0001\u0010\u0001"+ + "\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+ + "\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001"+ + "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0013\u0001\u0013\u0001"+ + "\u0013\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001"+ + "\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001"+ + "\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0001"+ + "\u0015\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001"+ + "\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001"+ + "\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001"+ + "\u0019\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001"+ + "\u001a\u0001\u001a\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001"+ + "\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001"+ + "\u001c\u0001\u001c\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001"+ + "\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001e\u0001\u001e\u0001"+ + "\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001"+ + "\u001e\u0001\u001e\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001"+ + "\u001f\u0001\u001f\u0001\u001f\u0001 \u0001 \u0001 \u0001 \u0001 \u0001"+ + " \u0001 \u0001!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001\"\u0001\"\u0001"+ + "\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001#\u0001#\u0001#\u0001#\u0001#"+ + "\u0001#\u0001#\u0001#\u0001#\u0001$\u0001$\u0001$\u0001$\u0001$\u0001"+ + "$\u0001%\u0001%\u0001%\u0001%\u0001%\u0001%\u0001%\u0001&\u0001&\u0001"+ + "&\u0001&\u0001&\u0001&\u0001&\u0001&\u0001&\u0001&\u0001&\u0001&\u0001"+ + "&\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001(\u0001(\u0001(\u0001("+ + "\u0001(\u0001(\u0001)\u0001)\u0001)\u0001)\u0001)\u0001)\u0001)\u0001"+ + "*\u0001*\u0001*\u0001*\u0001*\u0001*\u0001*\u0001*\u0001*\u0001*\u0001"+ + "+\u0001+\u0001+\u0001+\u0001,\u0001,\u0001,\u0001,\u0001,\u0001-\u0001"+ + "-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001.\u0001.\u0001"+ + ".\u0001.\u0001.\u0001.\u0001/\u0001/\u00010\u00010\u00011\u00011\u0001"+ + "2\u00012\u00013\u00013\u00014\u00014\u00015\u00015\u00016\u00016\u0001"+ + "7\u00017\u00018\u00018\u00019\u00019\u0001:\u0001:\u0001;\u0001;\u0001"+ + "<\u0001<\u0001=\u0001=\u0001>\u0001>\u0001?\u0001?\u0001@\u0001@\u0001"+ + "@\u0001A\u0001A\u0001A\u0001B\u0001B\u0001C\u0001C\u0001D\u0001D\u0001"+ + "D\u0001E\u0001E\u0001E\u0001F\u0001F\u0001G\u0001G\u0001H\u0001H\u0001"+ + "H\u0001I\u0001I\u0001I\u0001J\u0001J\u0001J\u0001K\u0001K\u0001K\u0001"+ + "L\u0001L\u0001M\u0001M\u0001N\u0001N\u0001O\u0001O\u0001O\u0001P\u0001"+ + "P\u0001P\u0001Q\u0001Q\u0001Q\u0001Q\u0001R\u0001R\u0001R\u0001S\u0001"+ + "S\u0001S\u0001T\u0001T\u0001T\u0001U\u0001U\u0001U\u0001V\u0001V\u0001"+ + "V\u0001W\u0001W\u0001W\u0001X\u0001X\u0001X\u0001Y\u0001Y\u0001Y\u0001"+ + "Z\u0001Z\u0001Z\u0001Z\u0001[\u0001[\u0001[\u0001[\u0001\\\u0001\\\u0001"+ + "\\\u0001\\\u0001\\\u0001]\u0001]\u0005]\u0290\b]\n]\f]\u0293\t]\u0001"+ + "^\u0003^\u0296\b^\u0001_\u0001_\u0003_\u029a\b_\u0001`\u0004`\u029d\b"+ + "`\u000b`\f`\u029e\u0001a\u0004a\u02a2\ba\u000ba\fa\u02a3\u0001a\u0001"+ + "a\u0005a\u02a8\ba\na\fa\u02ab\ta\u0001b\u0001b\u0001b\u0001b\u0003b\u02b1"+ + "\bb\u0001b\u0001b\u0001c\u0001c\u0001c\u0001c\u0005c\u02b9\bc\nc\fc\u02bc"+ + "\tc\u0001c\u0001c\u0001d\u0001d\u0001d\u0001d\u0001d\u0001d\u0001d\u0001"+ + "d\u0001d\u0003d\u02c9\bd\u0001e\u0001e\u0001e\u0001e\u0001e\u0001f\u0004"+ + "f\u02d1\bf\u000bf\ff\u02d2\u0001f\u0001f\u0001g\u0001g\u0001g\u0001g\u0005"+ + "g\u02db\bg\ng\fg\u02de\tg\u0001g\u0001g\u0001h\u0001h\u0001h\u0001h\u0005"+ + "h\u02e6\bh\nh\fh\u02e9\th\u0001h\u0001h\u0001h\u0001h\u0001h\u0001\u02e7"+ + "\u0000i\u0001\u0001\u0003\u0002\u0005\u0003\u0007\u0004\t\u0005\u000b"+ + "\u0006\r\u0007\u000f\b\u0011\t\u0013\n\u0015\u000b\u0017\f\u0019\r\u001b"+ + "\u000e\u001d\u000f\u001f\u0010!\u0011#\u0012%\u0013\'\u0014)\u0015+\u0016"+ + "-\u0017/\u00181\u00193\u001a5\u001b7\u001c9\u001d;\u001e=\u001f? A!C\""+ + "E#G$I%K&M\'O(Q)S*U+W,Y-[.]/_0a1c2e3g4i5k6m7o8q9s:u;w}?\u007f@\u0081"+ + "A\u0083B\u0085C\u0087D\u0089E\u008bF\u008dG\u008fH\u0091I\u0093J\u0095"+ + "K\u0097L\u0099M\u009bN\u009dO\u009fP\u00a1Q\u00a3R\u00a5S\u00a7T\u00a9"+ + "U\u00abV\u00adW\u00afX\u00b1Y\u00b3Z\u00b5[\u00b7\\\u00b9]\u00bb^\u00bd"+ + "\u0000\u00bf\u0000\u00c1_\u00c3`\u00c5a\u00c7b\u00c9c\u00cbd\u00cde\u00cf"+ + "f\u00d1g\u0001\u0000\u0007\u0294\u0000$$AZ__az\u00a2\u00a5\u00aa\u00aa"+ + "\u00b5\u00b5\u00ba\u00ba\u00c0\u00d6\u00d8\u00f6\u00f8\u02af\u0370\u0373"+ + "\u0376\u0377\u037b\u037d\u037f\u037f\u0386\u0386\u0388\u038a\u038c\u038c"+ + "\u038e\u03a1\u03a3\u03f5\u03f7\u0481\u048a\u052f\u0531\u0556\u0560\u0588"+ + "\u058f\u058f\u05d0\u05ea\u05ef\u05f2\u060b\u060b\u0620\u063f\u0641\u064a"+ + "\u066e\u066f\u0671\u06d3\u06d5\u06d5\u06ee\u06ef\u06fa\u06fc\u06ff\u06ff"+ + "\u0710\u0710\u0712\u072f\u074d\u07a5\u07b1\u07b1\u07ca\u07ea\u07fe\u0815"+ + "\u0840\u0858\u0860\u086a\u0870\u0887\u0889\u088e\u08a0\u08c8\u0904\u0939"+ + "\u093d\u093d\u0950\u0950\u0958\u0961\u0972\u0980\u0985\u098c\u098f\u0990"+ + "\u0993\u09a8\u09aa\u09b0\u09b2\u09b2\u09b6\u09b9\u09bd\u09bd\u09ce\u09ce"+ + "\u09dc\u09dd\u09df\u09e1\u09f0\u09f3\u09fb\u09fc\u0a05\u0a0a\u0a0f\u0a10"+ + "\u0a13\u0a28\u0a2a\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59\u0a5c"+ + "\u0a5e\u0a5e\u0a72\u0a74\u0a85\u0a8d\u0a8f\u0a91\u0a93\u0aa8\u0aaa\u0ab0"+ + "\u0ab2\u0ab3\u0ab5\u0ab9\u0abd\u0abd\u0ad0\u0ad0\u0ae0\u0ae1\u0af1\u0af1"+ + "\u0af9\u0af9\u0b05\u0b0c\u0b0f\u0b10\u0b13\u0b28\u0b2a\u0b30\u0b32\u0b33"+ + "\u0b35\u0b39\u0b3d\u0b3d\u0b5c\u0b5d\u0b5f\u0b61\u0b71\u0b71\u0b83\u0b83"+ + "\u0b85\u0b8a\u0b8e\u0b90\u0b92\u0b95\u0b99\u0b9a\u0b9c\u0b9c\u0b9e\u0b9f"+ + "\u0ba3\u0ba4\u0ba8\u0baa\u0bae\u0bb9\u0bd0\u0bd0\u0bf9\u0bf9\u0c05\u0c0c"+ + "\u0c0e\u0c10\u0c12\u0c28\u0c2a\u0c39\u0c3d\u0c3d\u0c58\u0c5a\u0c5d\u0c5d"+ + "\u0c60\u0c61\u0c80\u0c80\u0c85\u0c8c\u0c8e\u0c90\u0c92\u0ca8\u0caa\u0cb3"+ + "\u0cb5\u0cb9\u0cbd\u0cbd\u0cdd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d04\u0d0c"+ + "\u0d0e\u0d10\u0d12\u0d3a\u0d3d\u0d3d\u0d4e\u0d4e\u0d54\u0d56\u0d5f\u0d61"+ + "\u0d7a\u0d7f\u0d85\u0d96\u0d9a\u0db1\u0db3\u0dbb\u0dbd\u0dbd\u0dc0\u0dc6"+ + "\u0e01\u0e30\u0e32\u0e33\u0e3f\u0e45\u0e81\u0e82\u0e84\u0e84\u0e86\u0e8a"+ + "\u0e8c\u0ea3\u0ea5\u0ea5\u0ea7\u0eb0\u0eb2\u0eb3\u0ebd\u0ebd\u0ec0\u0ec4"+ + "\u0edc\u0edf\u0f00\u0f00\u0f40\u0f47\u0f49\u0f6c\u0f88\u0f8c\u1000\u102a"+ + "\u103f\u103f\u1050\u1055\u105a\u105d\u1061\u1061\u1065\u1066\u106e\u1070"+ + "\u1075\u1081\u108e\u108e\u10a0\u10c5\u10c7\u10c7\u10cd\u10cd\u10d0\u10fa"+ + "\u10fd\u1248\u124a\u124d\u1250\u1256\u1258\u1258\u125a\u125d\u1260\u1288"+ + "\u128a\u128d\u1290\u12b0\u12b2\u12b5\u12b8\u12be\u12c0\u12c0\u12c2\u12c5"+ + "\u12c8\u12d6\u12d8\u1310\u1312\u1315\u1318\u135a\u1380\u138f\u13a0\u13f5"+ + "\u13f8\u13fd\u1401\u166c\u166f\u167f\u1681\u169a\u16a0\u16ea\u16ee\u16f8"+ + "\u1700\u1711\u171f\u1731\u1740\u1751\u1760\u176c\u176e\u1770\u1780\u17b3"+ + "\u17db\u17dc\u1820\u1842\u1844\u1878\u1880\u1884\u1887\u18a8\u18aa\u18aa"+ + "\u18b0\u18f5\u1900\u191e\u1950\u196d\u1970\u1974\u1980\u19ab\u19b0\u19c9"+ + "\u1a00\u1a16\u1a20\u1a54\u1b05\u1b33\u1b45\u1b4c\u1b83\u1ba0\u1bae\u1baf"+ + "\u1bba\u1be5\u1c00\u1c23\u1c4d\u1c4f\u1c5a\u1c77\u1c80\u1c88\u1c90\u1cba"+ + "\u1cbd\u1cbf\u1ce9\u1cec\u1cee\u1cf3\u1cf5\u1cf6\u1cfa\u1cfa\u1d00\u1d2b"+ + "\u1d6b\u1d77\u1d79\u1d9a\u1e00\u1f15\u1f18\u1f1d\u1f20\u1f45\u1f48\u1f4d"+ + "\u1f50\u1f57\u1f59\u1f59\u1f5b\u1f5b\u1f5d\u1f5d\u1f5f\u1f7d\u1f80\u1fb4"+ + "\u1fb6\u1fbc\u1fbe\u1fbe\u1fc2\u1fc4\u1fc6\u1fcc\u1fd0\u1fd3\u1fd6\u1fdb"+ + "\u1fe0\u1fec\u1ff2\u1ff4\u1ff6\u1ffc\u203f\u2040\u2054\u2054\u20a0\u20c0"+ + "\u2102\u2102\u2107\u2107\u210a\u2113\u2115\u2115\u2119\u211d\u2124\u2124"+ + "\u2126\u2126\u2128\u2128\u212a\u212d\u212f\u2139\u213c\u213f\u2145\u2149"+ + "\u214e\u214e\u2160\u2188\u2c00\u2c7b\u2c7e\u2ce4\u2ceb\u2cee\u2cf2\u2cf3"+ + "\u2d00\u2d25\u2d27\u2d27\u2d2d\u2d2d\u2d30\u2d67\u2d80\u2d96\u2da0\u2da6"+ + "\u2da8\u2dae\u2db0\u2db6\u2db8\u2dbe\u2dc0\u2dc6\u2dc8\u2dce\u2dd0\u2dd6"+ + "\u2dd8\u2dde\u3006\u3007\u3021\u3029\u3038\u303a\u303c\u303c\u3041\u3096"+ + "\u309f\u309f\u30a1\u30fa\u30ff\u30ff\u3105\u312f\u3131\u318e\u31a0\u31bf"+ + "\u31f0\u31ff\u3400\u4dbf\u4e00\u8000\ua014\u8000\ua016\u8000\ua48c\u8000"+ + "\ua4d0\u8000\ua4f7\u8000\ua500\u8000\ua60b\u8000\ua610\u8000\ua61f\u8000"+ + "\ua62a\u8000\ua62b\u8000\ua640\u8000\ua66e\u8000\ua680\u8000\ua69b\u8000"+ + "\ua6a0\u8000\ua6ef\u8000\ua722\u8000\ua76f\u8000\ua771\u8000\ua787\u8000"+ + "\ua78b\u8000\ua7ca\u8000\ua7d0\u8000\ua7d1\u8000\ua7d3\u8000\ua7d3\u8000"+ + "\ua7d5\u8000\ua7d9\u8000\ua7f5\u8000\ua7f7\u8000\ua7fa\u8000\ua801\u8000"+ + "\ua803\u8000\ua805\u8000\ua807\u8000\ua80a\u8000\ua80c\u8000\ua822\u8000"+ + "\ua838\u8000\ua838\u8000\ua840\u8000\ua873\u8000\ua882\u8000\ua8b3\u8000"+ + "\ua8f2\u8000\ua8f7\u8000\ua8fb\u8000\ua8fb\u8000\ua8fd\u8000\ua8fe\u8000"+ + "\ua90a\u8000\ua925\u8000\ua930\u8000\ua946\u8000\ua960\u8000\ua97c\u8000"+ + "\ua984\u8000\ua9b2\u8000\ua9e0\u8000\ua9e4\u8000\ua9e7\u8000\ua9ef\u8000"+ + "\ua9fa\u8000\ua9fe\u8000\uaa00\u8000\uaa28\u8000\uaa40\u8000\uaa42\u8000"+ + "\uaa44\u8000\uaa4b\u8000\uaa60\u8000\uaa6f\u8000\uaa71\u8000\uaa76\u8000"+ + "\uaa7a\u8000\uaa7a\u8000\uaa7e\u8000\uaaaf\u8000\uaab1\u8000\uaab1\u8000"+ + "\uaab5\u8000\uaab6\u8000\uaab9\u8000\uaabd\u8000\uaac0\u8000\uaac0\u8000"+ + "\uaac2\u8000\uaac2\u8000\uaadb\u8000\uaadc\u8000\uaae0\u8000\uaaea\u8000"+ + "\uaaf2\u8000\uaaf2\u8000\uab01\u8000\uab06\u8000\uab09\u8000\uab0e\u8000"+ + "\uab11\u8000\uab16\u8000\uab20\u8000\uab26\u8000\uab28\u8000\uab2e\u8000"+ + "\uab30\u8000\uab5a\u8000\uab60\u8000\uab68\u8000\uab70\u8000\uabe2\u8000"+ + "\uac00\u8000\ud7a3\u8000\ud7b0\u8000\ud7c6\u8000\ud7cb\u8000\ud7fb\u8000"+ + "\uf900\u8000\ufa6d\u8000\ufa70\u8000\ufad9\u8000\ufb00\u8000\ufb06\u8000"+ + "\ufb13\u8000\ufb17\u8000\ufb1d\u8000\ufb1d\u8000\ufb1f\u8000\ufb28\u8000"+ + "\ufb2a\u8000\ufb36\u8000\ufb38\u8000\ufb3c\u8000\ufb3e\u8000\ufb3e\u8000"+ + "\ufb40\u8000\ufb41\u8000\ufb43\u8000\ufb44\u8000\ufb46\u8000\ufbb1\u8000"+ + "\ufbd3\u8000\ufd3d\u8000\ufd50\u8000\ufd8f\u8000\ufd92\u8000\ufdc7\u8000"+ + "\ufdf0\u8000\ufdfc\u8000\ufe33\u8000\ufe34\u8000\ufe4d\u8000\ufe4f\u8000"+ + "\ufe69\u8000\ufe69\u8000\ufe70\u8000\ufe74\u8000\ufe76\u8000\ufefc\u8000"+ + "\uff04\u8000\uff04\u8000\uff21\u8000\uff3a\u8000\uff3f\u8000\uff3f\u8000"+ + "\uff41\u8000\uff5a\u8000\uff66\u8000\uff6f\u8000\uff71\u8000\uff9d\u8000"+ + "\uffa0\u8000\uffbe\u8000\uffc2\u8000\uffc7\u8000\uffca\u8000\uffcf\u8000"+ + "\uffd2\u8000\uffd7\u8000\uffda\u8000\uffdc\u8000\uffe0\u8000\uffe1\u8000"+ + "\uffe5\u8000\uffe6\u8001\u0000\u8001\u000b\u8001\r\u8001&\u8001(\u8001"+ + ":\u8001<\u8001=\u8001?\u8001M\u8001P\u8001]\u8001\u0080\u8001\u00fa\u8001"+ + "\u0140\u8001\u0174\u8001\u0280\u8001\u029c\u8001\u02a0\u8001\u02d0\u8001"+ + "\u0300\u8001\u031f\u8001\u032d\u8001\u034a\u8001\u0350\u8001\u0375\u8001"+ + "\u0380\u8001\u039d\u8001\u03a0\u8001\u03c3\u8001\u03c8\u8001\u03cf\u8001"+ + "\u03d1\u8001\u03d5\u8001\u0400\u8001\u049d\u8001\u04b0\u8001\u04d3\u8001"+ + "\u04d8\u8001\u04fb\u8001\u0500\u8001\u0527\u8001\u0530\u8001\u0563\u8001"+ + "\u0570\u8001\u057a\u8001\u057c\u8001\u058a\u8001\u058c\u8001\u0592\u8001"+ + "\u0594\u8001\u0595\u8001\u0597\u8001\u05a1\u8001\u05a3\u8001\u05b1\u8001"+ + "\u05b3\u8001\u05b9\u8001\u05bb\u8001\u05bc\u8001\u0600\u8001\u0736\u8001"+ + "\u0740\u8001\u0755\u8001\u0760\u8001\u0767\u8001\u0800\u8001\u0805\u8001"+ + "\u0808\u8001\u0808\u8001\u080a\u8001\u0835\u8001\u0837\u8001\u0838\u8001"+ + "\u083c\u8001\u083c\u8001\u083f\u8001\u0855\u8001\u0860\u8001\u0876\u8001"+ + "\u0880\u8001\u089e\u8001\u08e0\u8001\u08f2\u8001\u08f4\u8001\u08f5\u8001"+ + "\u0900\u8001\u0915\u8001\u0920\u8001\u0939\u8001\u0980\u8001\u09b7\u8001"+ + "\u09be\u8001\u09bf\u8001\u0a00\u8001\u0a00\u8001\u0a10\u8001\u0a13\u8001"+ + "\u0a15\u8001\u0a17\u8001\u0a19\u8001\u0a35\u8001\u0a60\u8001\u0a7c\u8001"+ + "\u0a80\u8001\u0a9c\u8001\u0ac0\u8001\u0ac7\u8001\u0ac9\u8001\u0ae4\u8001"+ + "\u0b00\u8001\u0b35\u8001\u0b40\u8001\u0b55\u8001\u0b60\u8001\u0b72\u8001"+ + "\u0b80\u8001\u0b91\u8001\u0c00\u8001\u0c48\u8001\u0c80\u8001\u0cb2\u8001"+ + "\u0cc0\u8001\u0cf2\u8001\u0d00\u8001\u0d23\u8001\u0e80\u8001\u0ea9\u8001"+ + "\u0eb0\u8001\u0eb1\u8001\u0f00\u8001\u0f1c\u8001\u0f27\u8001\u0f27\u8001"+ + "\u0f30\u8001\u0f45\u8001\u0f70\u8001\u0f81\u8001\u0fb0\u8001\u0fc4\u8001"+ + "\u0fe0\u8001\u0ff6\u8001\u1003\u8001\u1037\u8001\u1071\u8001\u1072\u8001"+ + "\u1075\u8001\u1075\u8001\u1083\u8001\u10af\u8001\u10d0\u8001\u10e8\u8001"+ + "\u1103\u8001\u1126\u8001\u1144\u8001\u1144\u8001\u1147\u8001\u1147\u8001"+ + "\u1150\u8001\u1172\u8001\u1176\u8001\u1176\u8001\u1183\u8001\u11b2\u8001"+ + "\u11c1\u8001\u11c4\u8001\u11da\u8001\u11da\u8001\u11dc\u8001\u11dc\u8001"+ + "\u1200\u8001\u1211\u8001\u1213\u8001\u122b\u8001\u123f\u8001\u1240\u8001"+ + "\u1280\u8001\u1286\u8001\u1288\u8001\u1288\u8001\u128a\u8001\u128d\u8001"+ + "\u128f\u8001\u129d\u8001\u129f\u8001\u12a8\u8001\u12b0\u8001\u12de\u8001"+ + "\u1305\u8001\u130c\u8001\u130f\u8001\u1310\u8001\u1313\u8001\u1328\u8001"+ + "\u132a\u8001\u1330\u8001\u1332\u8001\u1333\u8001\u1335\u8001\u1339\u8001"+ + "\u133d\u8001\u133d\u8001\u1350\u8001\u1350\u8001\u135d\u8001\u1361\u8001"+ + "\u1400\u8001\u1434\u8001\u1447\u8001\u144a\u8001\u145f\u8001\u1461\u8001"+ + "\u1480\u8001\u14af\u8001\u14c4\u8001\u14c5\u8001\u14c7\u8001\u14c7\u8001"+ + "\u1580\u8001\u15ae\u8001\u15d8\u8001\u15db\u8001\u1600\u8001\u162f\u8001"+ + "\u1644\u8001\u1644\u8001\u1680\u8001\u16aa\u8001\u16b8\u8001\u16b8\u8001"+ + "\u1700\u8001\u171a\u8001\u1740\u8001\u1746\u8001\u1800\u8001\u182b\u8001"+ + "\u18a0\u8001\u18df\u8001\u18ff\u8001\u1906\u8001\u1909\u8001\u1909\u8001"+ + "\u190c\u8001\u1913\u8001\u1915\u8001\u1916\u8001\u1918\u8001\u192f\u8001"+ + "\u193f\u8001\u193f\u8001\u1941\u8001\u1941\u8001\u19a0\u8001\u19a7\u8001"+ + "\u19aa\u8001\u19d0\u8001\u19e1\u8001\u19e1\u8001\u19e3\u8001\u19e3\u8001"+ + "\u1a00\u8001\u1a00\u8001\u1a0b\u8001\u1a32\u8001\u1a3a\u8001\u1a3a\u8001"+ + "\u1a50\u8001\u1a50\u8001\u1a5c\u8001\u1a89\u8001\u1a9d\u8001\u1a9d\u8001"+ + "\u1ab0\u8001\u1af8\u8001\u1c00\u8001\u1c08\u8001\u1c0a\u8001\u1c2e\u8001"+ + "\u1c40\u8001\u1c40\u8001\u1c72\u8001\u1c8f\u8001\u1d00\u8001\u1d06\u8001"+ + "\u1d08\u8001\u1d09\u8001\u1d0b\u8001\u1d30\u8001\u1d46\u8001\u1d46\u8001"+ + "\u1d60\u8001\u1d65\u8001\u1d67\u8001\u1d68\u8001\u1d6a\u8001\u1d89\u8001"+ + "\u1d98\u8001\u1d98\u8001\u1ee0\u8001\u1ef2\u8001\u1f02\u8001\u1f02\u8001"+ + "\u1f04\u8001\u1f10\u8001\u1f12\u8001\u1f33\u8001\u1fb0\u8001\u1fb0\u8001"+ + "\u1fdd\u8001\u1fe0\u8001\u2000\u8001\u2399\u8001\u2400\u8001\u246e\u8001"+ + "\u2480\u8001\u2543\u8001\u2f90\u8001\u2ff0\u8001\u3000\u8001\u342f\u8001"+ + "\u3441\u8001\u3446\u8001\u4400\u8001\u4646\u8001\u6800\u8001\u6a38\u8001"+ + "\u6a40\u8001\u6a5e\u8001\u6a70\u8001\u6abe\u8001\u6ad0\u8001\u6aed\u8001"+ + "\u6b00\u8001\u6b2f\u8001\u6b63\u8001\u6b77\u8001\u6b7d\u8001\u6b8f\u8001"+ + "\u6e40\u8001\u6e7f\u8001\u6f00\u8001\u6f4a\u8001\u6f50\u8001\u6f50\u8001"+ + "\u7000\u8001\u87f7\u8001\u8800\u8001\u8cd5\u8001\u8d00\u8001\u8d08\u8001"+ + "\ub000\u8001\ub122\u8001\ub132\u8001\ub132\u8001\ub150\u8001\ub152\u8001"+ + "\ub155\u8001\ub155\u8001\ub164\u8001\ub167\u8001\ub170\u8001\ub2fb\u8001"+ + "\ubc00\u8001\ubc6a\u8001\ubc70\u8001\ubc7c\u8001\ubc80\u8001\ubc88\u8001"+ + "\ubc90\u8001\ubc99\u8001\ud400\u8001\ud454\u8001\ud456\u8001\ud49c\u8001"+ + "\ud49e\u8001\ud49f\u8001\ud4a2\u8001\ud4a2\u8001\ud4a5\u8001\ud4a6\u8001"+ + "\ud4a9\u8001\ud4ac\u8001\ud4ae\u8001\ud4b9\u8001\ud4bb\u8001\ud4bb\u8001"+ + "\ud4bd\u8001\ud4c3\u8001\ud4c5\u8001\ud505\u8001\ud507\u8001\ud50a\u8001"+ + "\ud50d\u8001\ud514\u8001\ud516\u8001\ud51c\u8001\ud51e\u8001\ud539\u8001"+ + "\ud53b\u8001\ud53e\u8001\ud540\u8001\ud544\u8001\ud546\u8001\ud546\u8001"+ + "\ud54a\u8001\ud550\u8001\ud552\u8001\ud6a5\u8001\ud6a8\u8001\ud6c0\u8001"+ + "\ud6c2\u8001\ud6da\u8001\ud6dc\u8001\ud6fa\u8001\ud6fc\u8001\ud714\u8001"+ + "\ud716\u8001\ud734\u8001\ud736\u8001\ud74e\u8001\ud750\u8001\ud76e\u8001"+ + "\ud770\u8001\ud788\u8001\ud78a\u8001\ud7a8\u8001\ud7aa\u8001\ud7c2\u8001"+ + "\ud7c4\u8001\ud7cb\u8001\udf00\u8001\udf1e\u8001\udf25\u8001\udf2a\u8001"+ + "\ue100\u8001\ue12c\u8001\ue14e\u8001\ue14e\u8001\ue290\u8001\ue2ad\u8001"+ + "\ue2c0\u8001\ue2eb\u8001\ue2ff\u8001\ue2ff\u8001\ue4d0\u8001\ue4ea\u8001"+ + "\ue7e0\u8001\ue7e6\u8001\ue7e8\u8001\ue7eb\u8001\ue7ed\u8001\ue7ee\u8001"+ + "\ue7f0\u8001\ue7fe\u8001\ue800\u8001\ue8c4\u8001\ue900\u8001\ue943\u8001"+ + "\uecb0\u8001\uecb0\u8001\uee00\u8001\uee03\u8001\uee05\u8001\uee1f\u8001"+ + "\uee21\u8001\uee22\u8001\uee24\u8001\uee24\u8001\uee27\u8001\uee27\u8001"+ + "\uee29\u8001\uee32\u8001\uee34\u8001\uee37\u8001\uee39\u8001\uee39\u8001"+ + "\uee3b\u8001\uee3b\u8001\uee42\u8001\uee42\u8001\uee47\u8001\uee47\u8001"+ + "\uee49\u8001\uee49\u8001\uee4b\u8001\uee4b\u8001\uee4d\u8001\uee4f\u8001"+ + "\uee51\u8001\uee52\u8001\uee54\u8001\uee54\u8001\uee57\u8001\uee57\u8001"+ + "\uee59\u8001\uee59\u8001\uee5b\u8001\uee5b\u8001\uee5d\u8001\uee5d\u8001"+ + "\uee5f\u8001\uee5f\u8001\uee61\u8001\uee62\u8001\uee64\u8001\uee64\u8001"+ + "\uee67\u8001\uee6a\u8001\uee6c\u8001\uee72\u8001\uee74\u8001\uee77\u8001"+ + "\uee79\u8001\uee7c\u8001\uee7e\u8001\uee7e\u8001\uee80\u8001\uee89\u8001"+ + "\uee8b\u8001\uee9b\u8001\ueea1\u8001\ueea3\u8001\ueea5\u8001\ueea9\u8001"+ + "\ueeab\u8001\ueebb\u8002\u0000\u8002\ua6df\u8002\ua700\u8002\ub739\u8002"+ + "\ub740\u8002\ub81d\u8002\ub820\u8002\ucea1\u8002\uceb0\u8002\uebe0\u8002"+ + "\uf800\u8002\ufa1d\u8003\u0000\u8003\u134a\u8003\u1350\u8003\u23af\u017b"+ + "\u000009\u00ad\u00ad\u0300\u036f\u0483\u0487\u0591\u05bd\u05bf\u05bf\u05c1"+ + "\u05c2\u05c4\u05c5\u05c7\u05c7\u0600\u0605\u0610\u061a\u061c\u061c\u064b"+ + "\u0669\u0670\u0670\u06d6\u06dd\u06df\u06e4\u06e7\u06e8\u06ea\u06ed\u06f0"+ + "\u06f9\u070f\u070f\u0711\u0711\u0730\u074a\u07a6\u07b0\u07c0\u07c9\u07eb"+ + "\u07f3\u07fd\u07fd\u0816\u0819\u081b\u0823\u0825\u0827\u0829\u082d\u0859"+ + "\u085b\u0890\u0891\u0898\u089f\u08ca\u0903\u093a\u093c\u093e\u094f\u0951"+ + "\u0957\u0962\u0963\u0966\u096f\u0981\u0983\u09bc\u09bc\u09be\u09c4\u09c7"+ + "\u09c8\u09cb\u09cd\u09d7\u09d7\u09e2\u09e3\u09e6\u09ef\u09fe\u09fe\u0a01"+ + "\u0a03\u0a3c\u0a3c\u0a3e\u0a42\u0a47\u0a48\u0a4b\u0a4d\u0a51\u0a51\u0a66"+ + "\u0a71\u0a75\u0a75\u0a81\u0a83\u0abc\u0abc\u0abe\u0ac5\u0ac7\u0ac9\u0acb"+ + "\u0acd\u0ae2\u0ae3\u0ae6\u0aef\u0afa\u0aff\u0b01\u0b03\u0b3c\u0b3c\u0b3e"+ + "\u0b44\u0b47\u0b48\u0b4b\u0b4d\u0b55\u0b57\u0b62\u0b63\u0b66\u0b6f\u0b82"+ + "\u0b82\u0bbe\u0bc2\u0bc6\u0bc8\u0bca\u0bcd\u0bd7\u0bd7\u0be6\u0bef\u0c00"+ + "\u0c04\u0c3c\u0c3c\u0c3e\u0c44\u0c46\u0c48\u0c4a\u0c4d\u0c55\u0c56\u0c62"+ + "\u0c63\u0c66\u0c6f\u0c81\u0c83\u0cbc\u0cbc\u0cbe\u0cc4\u0cc6\u0cc8\u0cca"+ + "\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0ce6\u0cef\u0cf3\u0cf3\u0d00\u0d03\u0d3b"+ + "\u0d3c\u0d3e\u0d44\u0d46\u0d48\u0d4a\u0d4d\u0d57\u0d57\u0d62\u0d63\u0d66"+ + "\u0d6f\u0d81\u0d83\u0dca\u0dca\u0dcf\u0dd4\u0dd6\u0dd6\u0dd8\u0ddf\u0de6"+ + "\u0def\u0df2\u0df3\u0e31\u0e31\u0e34\u0e3a\u0e47\u0e4e\u0e50\u0e59\u0eb1"+ + "\u0eb1\u0eb4\u0ebc\u0ec8\u0ece\u0ed0\u0ed9\u0f18\u0f19\u0f20\u0f29\u0f35"+ + "\u0f35\u0f37\u0f37\u0f39\u0f39\u0f3e\u0f3f\u0f71\u0f84\u0f86\u0f87\u0f8d"+ + "\u0f97\u0f99\u0fbc\u0fc6\u0fc6\u102b\u103e\u1040\u1049\u1056\u1059\u105e"+ + "\u1060\u1062\u1064\u1067\u106d\u1071\u1074\u1082\u108d\u108f\u109d\u135d"+ + "\u135f\u1712\u1715\u1732\u1734\u1752\u1753\u1772\u1773\u17b4\u17d3\u17dd"+ + "\u17dd\u17e0\u17e9\u180b\u1819\u1885\u1886\u18a9\u18a9\u1920\u192b\u1930"+ + "\u193b\u1946\u194f\u19d0\u19d9\u1a17\u1a1b\u1a55\u1a5e\u1a60\u1a7c\u1a7f"+ + "\u1a89\u1a90\u1a99\u1ab0\u1abd\u1abf\u1ace\u1b00\u1b04\u1b34\u1b44\u1b50"+ + "\u1b59\u1b6b\u1b73\u1b80\u1b82\u1ba1\u1bad\u1bb0\u1bb9\u1be6\u1bf3\u1c24"+ + "\u1c37\u1c40\u1c49\u1c50\u1c59\u1cd0\u1cd2\u1cd4\u1ce8\u1ced\u1ced\u1cf4"+ + "\u1cf4\u1cf7\u1cf9\u1dc0\u1dff\u200b\u200f\u202a\u202e\u2060\u2064\u2066"+ + "\u206f\u20d0\u20dc\u20e1\u20e1\u20e5\u20f0\u2cef\u2cf1\u2d7f\u2d7f\u2de0"+ + "\u2dff\u302a\u302f\u3099\u309a\u8000\ua620\u8000\ua629\u8000\ua66f\u8000"+ + "\ua66f\u8000\ua674\u8000\ua67d\u8000\ua69e\u8000\ua69f\u8000\ua6f0\u8000"+ + "\ua6f1\u8000\ua802\u8000\ua802\u8000\ua806\u8000\ua806\u8000\ua80b\u8000"+ + "\ua80b\u8000\ua823\u8000\ua827\u8000\ua82c\u8000\ua82c\u8000\ua880\u8000"+ + "\ua881\u8000\ua8b4\u8000\ua8c5\u8000\ua8d0\u8000\ua8d9\u8000\ua8e0\u8000"+ + "\ua8f1\u8000\ua8ff\u8000\ua909\u8000\ua926\u8000\ua92d\u8000\ua947\u8000"+ + "\ua953\u8000\ua980\u8000\ua983\u8000\ua9b3\u8000\ua9c0\u8000\ua9d0\u8000"+ + "\ua9d9\u8000\ua9e5\u8000\ua9e5\u8000\ua9f0\u8000\ua9f9\u8000\uaa29\u8000"+ + "\uaa36\u8000\uaa43\u8000\uaa43\u8000\uaa4c\u8000\uaa4d\u8000\uaa50\u8000"+ + "\uaa59\u8000\uaa7b\u8000\uaa7d\u8000\uaab0\u8000\uaab0\u8000\uaab2\u8000"+ + "\uaab4\u8000\uaab7\u8000\uaab8\u8000\uaabe\u8000\uaabf\u8000\uaac1\u8000"+ + "\uaac1\u8000\uaaeb\u8000\uaaef\u8000\uaaf5\u8000\uaaf6\u8000\uabe3\u8000"+ + "\uabea\u8000\uabec\u8000\uabed\u8000\uabf0\u8000\uabf9\u8000\ufb1e\u8000"+ + "\ufb1e\u8000\ufe00\u8000\ufe0f\u8000\ufe20\u8000\ufe2f\u8000\ufeff\u8000"+ + "\ufeff\u8000\uff10\u8000\uff19\u8000\ufff9\u8000\ufffb\u8001\u01fd\u8001"+ + "\u01fd\u8001\u02e0\u8001\u02e0\u8001\u0376\u8001\u037a\u8001\u04a0\u8001"+ + "\u04a9\u8001\u0a01\u8001\u0a03\u8001\u0a05\u8001\u0a06\u8001\u0a0c\u8001"+ + "\u0a0f\u8001\u0a38\u8001\u0a3a\u8001\u0a3f\u8001\u0a3f\u8001\u0ae5\u8001"+ + "\u0ae6\u8001\u0d24\u8001\u0d27\u8001\u0d30\u8001\u0d39\u8001\u0eab\u8001"+ + "\u0eac\u8001\u0efd\u8001\u0eff\u8001\u0f46\u8001\u0f50\u8001\u0f82\u8001"+ + "\u0f85\u8001\u1000\u8001\u1002\u8001\u1038\u8001\u1046\u8001\u1066\u8001"+ + "\u1070\u8001\u1073\u8001\u1074\u8001\u107f\u8001\u1082\u8001\u10b0\u8001"+ + "\u10ba\u8001\u10bd\u8001\u10bd\u8001\u10c2\u8001\u10c2\u8001\u10cd\u8001"+ + "\u10cd\u8001\u10f0\u8001\u10f9\u8001\u1100\u8001\u1102\u8001\u1127\u8001"+ + "\u1134\u8001\u1136\u8001\u113f\u8001\u1145\u8001\u1146\u8001\u1173\u8001"+ + "\u1173\u8001\u1180\u8001\u1182\u8001\u11b3\u8001\u11c0\u8001\u11c9\u8001"+ + "\u11cc\u8001\u11ce\u8001\u11d9\u8001\u122c\u8001\u1237\u8001\u123e\u8001"+ + "\u123e\u8001\u1241\u8001\u1241\u8001\u12df\u8001\u12ea\u8001\u12f0\u8001"+ + "\u12f9\u8001\u1300\u8001\u1303\u8001\u133b\u8001\u133c\u8001\u133e\u8001"+ + "\u1344\u8001\u1347\u8001\u1348\u8001\u134b\u8001\u134d\u8001\u1357\u8001"+ + "\u1357\u8001\u1362\u8001\u1363\u8001\u1366\u8001\u136c\u8001\u1370\u8001"+ + "\u1374\u8001\u1435\u8001\u1446\u8001\u1450\u8001\u1459\u8001\u145e\u8001"+ + "\u145e\u8001\u14b0\u8001\u14c3\u8001\u14d0\u8001\u14d9\u8001\u15af\u8001"+ + "\u15b5\u8001\u15b8\u8001\u15c0\u8001\u15dc\u8001\u15dd\u8001\u1630\u8001"+ + "\u1640\u8001\u1650\u8001\u1659\u8001\u16ab\u8001\u16b7\u8001\u16c0\u8001"+ + "\u16c9\u8001\u171d\u8001\u172b\u8001\u1730\u8001\u1739\u8001\u182c\u8001"+ + "\u183a\u8001\u18e0\u8001\u18e9\u8001\u1930\u8001\u1935\u8001\u1937\u8001"+ + "\u1938\u8001\u193b\u8001\u193e\u8001\u1940\u8001\u1940\u8001\u1942\u8001"+ + "\u1943\u8001\u1950\u8001\u1959\u8001\u19d1\u8001\u19d7\u8001\u19da\u8001"+ + "\u19e0\u8001\u19e4\u8001\u19e4\u8001\u1a01\u8001\u1a0a\u8001\u1a33\u8001"+ + "\u1a39\u8001\u1a3b\u8001\u1a3e\u8001\u1a47\u8001\u1a47\u8001\u1a51\u8001"+ + "\u1a5b\u8001\u1a8a\u8001\u1a99\u8001\u1c2f\u8001\u1c36\u8001\u1c38\u8001"+ + "\u1c3f\u8001\u1c50\u8001\u1c59\u8001\u1c92\u8001\u1ca7\u8001\u1ca9\u8001"+ + "\u1cb6\u8001\u1d31\u8001\u1d36\u8001\u1d3a\u8001\u1d3a\u8001\u1d3c\u8001"+ + "\u1d3d\u8001\u1d3f\u8001\u1d45\u8001\u1d47\u8001\u1d47\u8001\u1d50\u8001"+ + "\u1d59\u8001\u1d8a\u8001\u1d8e\u8001\u1d90\u8001\u1d91\u8001\u1d93\u8001"+ + "\u1d97\u8001\u1da0\u8001\u1da9\u8001\u1ef3\u8001\u1ef6\u8001\u1f00\u8001"+ + "\u1f01\u8001\u1f03\u8001\u1f03\u8001\u1f34\u8001\u1f3a\u8001\u1f3e\u8001"+ + "\u1f42\u8001\u1f50\u8001\u1f59\u8001\u3430\u8001\u3440\u8001\u3447\u8001"+ + "\u3455\u8001\u6a60\u8001\u6a69\u8001\u6ac0\u8001\u6ac9\u8001\u6af0\u8001"+ + "\u6af4\u8001\u6b30\u8001\u6b36\u8001\u6b50\u8001\u6b59\u8001\u6f4f\u8001"+ + "\u6f4f\u8001\u6f51\u8001\u6f87\u8001\u6f8f\u8001\u6f92\u8001\u6fe4\u8001"+ + "\u6fe4\u8001\u6ff0\u8001\u6ff1\u8001\ubc9d\u8001\ubc9e\u8001\ubca0\u8001"+ + "\ubca3\u8001\ucf00\u8001\ucf2d\u8001\ucf30\u8001\ucf46\u8001\ud165\u8001"+ + "\ud169\u8001\ud16d\u8001\ud182\u8001\ud185\u8001\ud18b\u8001\ud1aa\u8001"+ + "\ud1ad\u8001\ud242\u8001\ud244\u8001\ud7ce\u8001\ud7ff\u8001\uda00\u8001"+ + "\uda36\u8001\uda3b\u8001\uda6c\u8001\uda75\u8001\uda75\u8001\uda84\u8001"+ + "\uda84\u8001\uda9b\u8001\uda9f\u8001\udaa1\u8001\udaaf\u8001\ue000\u8001"+ + "\ue006\u8001\ue008\u8001\ue018\u8001\ue01b\u8001\ue021\u8001\ue023\u8001"+ + "\ue024\u8001\ue026\u8001\ue02a\u8001\ue08f\u8001\ue08f\u8001\ue130\u8001"+ + "\ue136\u8001\ue140\u8001\ue149\u8001\ue2ae\u8001\ue2ae\u8001\ue2ec\u8001"+ + "\ue2f9\u8001\ue4ec\u8001\ue4f9\u8001\ue8d0\u8001\ue8d6\u8001\ue944\u8001"+ + "\ue94a\u8001\ue950\u8001\ue959\u8001\ufbf0\u8001\ufbf9\u800e\u0001\u800e"+ + "\u0001\u800e \u800e\u007f\u800e\u0100\u800e\u01ef\u0001\u000009\u0002"+ + "\u0000\'\'\\\\\u0002\u0000\"\"\\\\\u0003\u0000\t\n\f\r \u0002\u0000\n"+ + "\n\r\r\u02f8\u0000\u0001\u0001\u0000\u0000\u0000\u0000\u0003\u0001\u0000"+ + "\u0000\u0000\u0000\u0005\u0001\u0000\u0000\u0000\u0000\u0007\u0001\u0000"+ + "\u0000\u0000\u0000\t\u0001\u0000\u0000\u0000\u0000\u000b\u0001\u0000\u0000"+ + "\u0000\u0000\r\u0001\u0000\u0000\u0000\u0000\u000f\u0001\u0000\u0000\u0000"+ + "\u0000\u0011\u0001\u0000\u0000\u0000\u0000\u0013\u0001\u0000\u0000\u0000"+ + "\u0000\u0015\u0001\u0000\u0000\u0000\u0000\u0017\u0001\u0000\u0000\u0000"+ + "\u0000\u0019\u0001\u0000\u0000\u0000\u0000\u001b\u0001\u0000\u0000\u0000"+ + "\u0000\u001d\u0001\u0000\u0000\u0000\u0000\u001f\u0001\u0000\u0000\u0000"+ + "\u0000!\u0001\u0000\u0000\u0000\u0000#\u0001\u0000\u0000\u0000\u0000%"+ + "\u0001\u0000\u0000\u0000\u0000\'\u0001\u0000\u0000\u0000\u0000)\u0001"+ + "\u0000\u0000\u0000\u0000+\u0001\u0000\u0000\u0000\u0000-\u0001\u0000\u0000"+ + "\u0000\u0000/\u0001\u0000\u0000\u0000\u00001\u0001\u0000\u0000\u0000\u0000"+ + "3\u0001\u0000\u0000\u0000\u00005\u0001\u0000\u0000\u0000\u00007\u0001"+ + "\u0000\u0000\u0000\u00009\u0001\u0000\u0000\u0000\u0000;\u0001\u0000\u0000"+ + "\u0000\u0000=\u0001\u0000\u0000\u0000\u0000?\u0001\u0000\u0000\u0000\u0000"+ + "A\u0001\u0000\u0000\u0000\u0000C\u0001\u0000\u0000\u0000\u0000E\u0001"+ + "\u0000\u0000\u0000\u0000G\u0001\u0000\u0000\u0000\u0000I\u0001\u0000\u0000"+ + "\u0000\u0000K\u0001\u0000\u0000\u0000\u0000M\u0001\u0000\u0000\u0000\u0000"+ + "O\u0001\u0000\u0000\u0000\u0000Q\u0001\u0000\u0000\u0000\u0000S\u0001"+ + "\u0000\u0000\u0000\u0000U\u0001\u0000\u0000\u0000\u0000W\u0001\u0000\u0000"+ + "\u0000\u0000Y\u0001\u0000\u0000\u0000\u0000[\u0001\u0000\u0000\u0000\u0000"+ + "]\u0001\u0000\u0000\u0000\u0000_\u0001\u0000\u0000\u0000\u0000a\u0001"+ + "\u0000\u0000\u0000\u0000c\u0001\u0000\u0000\u0000\u0000e\u0001\u0000\u0000"+ + "\u0000\u0000g\u0001\u0000\u0000\u0000\u0000i\u0001\u0000\u0000\u0000\u0000"+ + "k\u0001\u0000\u0000\u0000\u0000m\u0001\u0000\u0000\u0000\u0000o\u0001"+ + "\u0000\u0000\u0000\u0000q\u0001\u0000\u0000\u0000\u0000s\u0001\u0000\u0000"+ + "\u0000\u0000u\u0001\u0000\u0000\u0000\u0000w\u0001\u0000\u0000\u0000\u0000"+ + "y\u0001\u0000\u0000\u0000\u0000{\u0001\u0000\u0000\u0000\u0000}\u0001"+ + "\u0000\u0000\u0000\u0000\u007f\u0001\u0000\u0000\u0000\u0000\u0081\u0001"+ + "\u0000\u0000\u0000\u0000\u0083\u0001\u0000\u0000\u0000\u0000\u0085\u0001"+ + "\u0000\u0000\u0000\u0000\u0087\u0001\u0000\u0000\u0000\u0000\u0089\u0001"+ + "\u0000\u0000\u0000\u0000\u008b\u0001\u0000\u0000\u0000\u0000\u008d\u0001"+ + "\u0000\u0000\u0000\u0000\u008f\u0001\u0000\u0000\u0000\u0000\u0091\u0001"+ + "\u0000\u0000\u0000\u0000\u0093\u0001\u0000\u0000\u0000\u0000\u0095\u0001"+ + "\u0000\u0000\u0000\u0000\u0097\u0001\u0000\u0000\u0000\u0000\u0099\u0001"+ + "\u0000\u0000\u0000\u0000\u009b\u0001\u0000\u0000\u0000\u0000\u009d\u0001"+ + "\u0000\u0000\u0000\u0000\u009f\u0001\u0000\u0000\u0000\u0000\u00a1\u0001"+ + "\u0000\u0000\u0000\u0000\u00a3\u0001\u0000\u0000\u0000\u0000\u00a5\u0001"+ + "\u0000\u0000\u0000\u0000\u00a7\u0001\u0000\u0000\u0000\u0000\u00a9\u0001"+ + "\u0000\u0000\u0000\u0000\u00ab\u0001\u0000\u0000\u0000\u0000\u00ad\u0001"+ + "\u0000\u0000\u0000\u0000\u00af\u0001\u0000\u0000\u0000\u0000\u00b1\u0001"+ + "\u0000\u0000\u0000\u0000\u00b3\u0001\u0000\u0000\u0000\u0000\u00b5\u0001"+ + "\u0000\u0000\u0000\u0000\u00b7\u0001\u0000\u0000\u0000\u0000\u00b9\u0001"+ + "\u0000\u0000\u0000\u0000\u00bb\u0001\u0000\u0000\u0000\u0000\u00c1\u0001"+ + "\u0000\u0000\u0000\u0000\u00c3\u0001\u0000\u0000\u0000\u0000\u00c5\u0001"+ + "\u0000\u0000\u0000\u0000\u00c7\u0001\u0000\u0000\u0000\u0000\u00c9\u0001"+ + "\u0000\u0000\u0000\u0000\u00cb\u0001\u0000\u0000\u0000\u0000\u00cd\u0001"+ + "\u0000\u0000\u0000\u0000\u00cf\u0001\u0000\u0000\u0000\u0000\u00d1\u0001"+ + "\u0000\u0000\u0000\u0001\u00d3\u0001\u0000\u0000\u0000\u0003\u00dc\u0001"+ + "\u0000\u0000\u0000\u0005\u00e3\u0001\u0000\u0000\u0000\u0007\u00eb\u0001"+ + "\u0000\u0000\u0000\t\u00f1\u0001\u0000\u0000\u0000\u000b\u00f6\u0001\u0000"+ + "\u0000\u0000\r\u00fb\u0001\u0000\u0000\u0000\u000f\u0101\u0001\u0000\u0000"+ + "\u0000\u0011\u0106\u0001\u0000\u0000\u0000\u0013\u010c\u0001\u0000\u0000"+ + "\u0000\u0015\u0115\u0001\u0000\u0000\u0000\u0017\u011d\u0001\u0000\u0000"+ + "\u0000\u0019\u0120\u0001\u0000\u0000\u0000\u001b\u0127\u0001\u0000\u0000"+ + "\u0000\u001d\u012c\u0001\u0000\u0000\u0000\u001f\u0134\u0001\u0000\u0000"+ + "\u0000!\u013a\u0001\u0000\u0000\u0000#\u0142\u0001\u0000\u0000\u0000%"+ + "\u0148\u0001\u0000\u0000\u0000\'\u014c\u0001\u0000\u0000\u0000)\u014f"+ + "\u0001\u0000\u0000\u0000+\u015a\u0001\u0000\u0000\u0000-\u0161\u0001\u0000"+ + "\u0000\u0000/\u016c\u0001\u0000\u0000\u00001\u0170\u0001\u0000\u0000\u0000"+ + "3\u017a\u0001\u0000\u0000\u00005\u017f\u0001\u0000\u0000\u00007\u0186"+ + "\u0001\u0000\u0000\u00009\u018a\u0001\u0000\u0000\u0000;\u0192\u0001\u0000"+ + "\u0000\u0000=\u019a\u0001\u0000\u0000\u0000?\u01a4\u0001\u0000\u0000\u0000"+ + "A\u01ab\u0001\u0000\u0000\u0000C\u01b2\u0001\u0000\u0000\u0000E\u01b8"+ + "\u0001\u0000\u0000\u0000G\u01bf\u0001\u0000\u0000\u0000I\u01c8\u0001\u0000"+ + "\u0000\u0000K\u01ce\u0001\u0000\u0000\u0000M\u01d5\u0001\u0000\u0000\u0000"+ + "O\u01e2\u0001\u0000\u0000\u0000Q\u01e7\u0001\u0000\u0000\u0000S\u01ed"+ + "\u0001\u0000\u0000\u0000U\u01f4\u0001\u0000\u0000\u0000W\u01fe\u0001\u0000"+ + "\u0000\u0000Y\u0202\u0001\u0000\u0000\u0000[\u0207\u0001\u0000\u0000\u0000"+ + "]\u0210\u0001\u0000\u0000\u0000_\u0216\u0001\u0000\u0000\u0000a\u0218"+ + "\u0001\u0000\u0000\u0000c\u021a\u0001\u0000\u0000\u0000e\u021c\u0001\u0000"+ + "\u0000\u0000g\u021e\u0001\u0000\u0000\u0000i\u0220\u0001\u0000\u0000\u0000"+ + "k\u0222\u0001\u0000\u0000\u0000m\u0224\u0001\u0000\u0000\u0000o\u0226"+ + "\u0001\u0000\u0000\u0000q\u0228\u0001\u0000\u0000\u0000s\u022a\u0001\u0000"+ + "\u0000\u0000u\u022c\u0001\u0000\u0000\u0000w\u022e\u0001\u0000\u0000\u0000"+ + "y\u0230\u0001\u0000\u0000\u0000{\u0232\u0001\u0000\u0000\u0000}\u0234"+ + "\u0001\u0000\u0000\u0000\u007f\u0236\u0001\u0000\u0000\u0000\u0081\u0238"+ + "\u0001\u0000\u0000\u0000\u0083\u023b\u0001\u0000\u0000\u0000\u0085\u023e"+ + "\u0001\u0000\u0000\u0000\u0087\u0240\u0001\u0000\u0000\u0000\u0089\u0242"+ + "\u0001\u0000\u0000\u0000\u008b\u0245\u0001\u0000\u0000\u0000\u008d\u0248"+ + "\u0001\u0000\u0000\u0000\u008f\u024a\u0001\u0000\u0000\u0000\u0091\u024c"+ + "\u0001\u0000\u0000\u0000\u0093\u024f\u0001\u0000\u0000\u0000\u0095\u0252"+ + "\u0001\u0000\u0000\u0000\u0097\u0255\u0001\u0000\u0000\u0000\u0099\u0258"+ + "\u0001\u0000\u0000\u0000\u009b\u025a\u0001\u0000\u0000\u0000\u009d\u025c"+ + "\u0001\u0000\u0000\u0000\u009f\u025e\u0001\u0000\u0000\u0000\u00a1\u0261"+ + "\u0001\u0000\u0000\u0000\u00a3\u0264\u0001\u0000\u0000\u0000\u00a5\u0268"+ + "\u0001\u0000\u0000\u0000\u00a7\u026b\u0001\u0000\u0000\u0000\u00a9\u026e"+ + "\u0001\u0000\u0000\u0000\u00ab\u0271\u0001\u0000\u0000\u0000\u00ad\u0274"+ + "\u0001\u0000\u0000\u0000\u00af\u0277\u0001\u0000\u0000\u0000\u00b1\u027a"+ + "\u0001\u0000\u0000\u0000\u00b3\u027d\u0001\u0000\u0000\u0000\u00b5\u0280"+ + "\u0001\u0000\u0000\u0000\u00b7\u0284\u0001\u0000\u0000\u0000\u00b9\u0288"+ + "\u0001\u0000\u0000\u0000\u00bb\u028d\u0001\u0000\u0000\u0000\u00bd\u0295"+ + "\u0001\u0000\u0000\u0000\u00bf\u0299\u0001\u0000\u0000\u0000\u00c1\u029c"+ + "\u0001\u0000\u0000\u0000\u00c3\u02a1\u0001\u0000\u0000\u0000\u00c5\u02ac"+ + "\u0001\u0000\u0000\u0000\u00c7\u02b4\u0001\u0000\u0000\u0000\u00c9\u02c8"+ + "\u0001\u0000\u0000\u0000\u00cb\u02ca\u0001\u0000\u0000\u0000\u00cd\u02d0"+ + "\u0001\u0000\u0000\u0000\u00cf\u02d6\u0001\u0000\u0000\u0000\u00d1\u02e1"+ + "\u0001\u0000\u0000\u0000\u00d3\u00d4\u0005a\u0000\u0000\u00d4\u00d5\u0005"+ + "b\u0000\u0000\u00d5\u00d6\u0005s\u0000\u0000\u00d6\u00d7\u0005t\u0000"+ + "\u0000\u00d7\u00d8\u0005r\u0000\u0000\u00d8\u00d9\u0005a\u0000\u0000\u00d9"+ + "\u00da\u0005c\u0000\u0000\u00da\u00db\u0005t\u0000\u0000\u00db\u0002\u0001"+ + "\u0000\u0000\u0000\u00dc\u00dd\u0005a\u0000\u0000\u00dd\u00de\u0005s\u0000"+ + "\u0000\u00de\u00df\u0005s\u0000\u0000\u00df\u00e0\u0005e\u0000\u0000\u00e0"+ + "\u00e1\u0005r\u0000\u0000\u00e1\u00e2\u0005t\u0000\u0000\u00e2\u0004\u0001"+ + "\u0000\u0000\u0000\u00e3\u00e4\u0005b\u0000\u0000\u00e4\u00e5\u0005o\u0000"+ + "\u0000\u00e5\u00e6\u0005o\u0000\u0000\u00e6\u00e7\u0005l\u0000\u0000\u00e7"+ + "\u00e8\u0005e\u0000\u0000\u00e8\u00e9\u0005a\u0000\u0000\u00e9\u00ea\u0005"+ + "n\u0000\u0000\u00ea\u0006\u0001\u0000\u0000\u0000\u00eb\u00ec\u0005b\u0000"+ + "\u0000\u00ec\u00ed\u0005r\u0000\u0000\u00ed\u00ee\u0005e\u0000\u0000\u00ee"+ + "\u00ef\u0005a\u0000\u0000\u00ef\u00f0\u0005k\u0000\u0000\u00f0\b\u0001"+ + "\u0000\u0000\u0000\u00f1\u00f2\u0005b\u0000\u0000\u00f2\u00f3\u0005y\u0000"+ + "\u0000\u00f3\u00f4\u0005t\u0000\u0000\u00f4\u00f5\u0005e\u0000\u0000\u00f5"+ + "\n\u0001\u0000\u0000\u0000\u00f6\u00f7\u0005c\u0000\u0000\u00f7\u00f8"+ + "\u0005a\u0000\u0000\u00f8\u00f9\u0005s\u0000\u0000\u00f9\u00fa\u0005e"+ + "\u0000\u0000\u00fa\f\u0001\u0000\u0000\u0000\u00fb\u00fc\u0005c\u0000"+ + "\u0000\u00fc\u00fd\u0005a\u0000\u0000\u00fd\u00fe\u0005t\u0000\u0000\u00fe"+ + "\u00ff\u0005c\u0000\u0000\u00ff\u0100\u0005h\u0000\u0000\u0100\u000e\u0001"+ + "\u0000\u0000\u0000\u0101\u0102\u0005c\u0000\u0000\u0102\u0103\u0005h\u0000"+ + "\u0000\u0103\u0104\u0005a\u0000\u0000\u0104\u0105\u0005r\u0000\u0000\u0105"+ + "\u0010\u0001\u0000\u0000\u0000\u0106\u0107\u0005c\u0000\u0000\u0107\u0108"+ + "\u0005l\u0000\u0000\u0108\u0109\u0005a\u0000\u0000\u0109\u010a\u0005s"+ + "\u0000\u0000\u010a\u010b\u0005s\u0000\u0000\u010b\u0012\u0001\u0000\u0000"+ + "\u0000\u010c\u010d\u0005c\u0000\u0000\u010d\u010e\u0005o\u0000\u0000\u010e"+ + "\u010f\u0005n\u0000\u0000\u010f\u0110\u0005t\u0000\u0000\u0110\u0111\u0005"+ + "i\u0000\u0000\u0111\u0112\u0005n\u0000\u0000\u0112\u0113\u0005u\u0000"+ + "\u0000\u0113\u0114\u0005e\u0000\u0000\u0114\u0014\u0001\u0000\u0000\u0000"+ + "\u0115\u0116\u0005d\u0000\u0000\u0116\u0117\u0005e\u0000\u0000\u0117\u0118"+ + "\u0005f\u0000\u0000\u0118\u0119\u0005a\u0000\u0000\u0119\u011a\u0005u"+ + "\u0000\u0000\u011a\u011b\u0005l\u0000\u0000\u011b\u011c\u0005t\u0000\u0000"+ + "\u011c\u0016\u0001\u0000\u0000\u0000\u011d\u011e\u0005d\u0000\u0000\u011e"+ + "\u011f\u0005o\u0000\u0000\u011f\u0018\u0001\u0000\u0000\u0000\u0120\u0121"+ + "\u0005d\u0000\u0000\u0121\u0122\u0005o\u0000\u0000\u0122\u0123\u0005u"+ + "\u0000\u0000\u0123\u0124\u0005b\u0000\u0000\u0124\u0125\u0005l\u0000\u0000"+ + "\u0125\u0126\u0005e\u0000\u0000\u0126\u001a\u0001\u0000\u0000\u0000\u0127"+ + "\u0128\u0005e\u0000\u0000\u0128\u0129\u0005l\u0000\u0000\u0129\u012a\u0005"+ + "s\u0000\u0000\u012a\u012b\u0005e\u0000\u0000\u012b\u001c\u0001\u0000\u0000"+ + "\u0000\u012c\u012d\u0005e\u0000\u0000\u012d\u012e\u0005x\u0000\u0000\u012e"+ + "\u012f\u0005t\u0000\u0000\u012f\u0130\u0005e\u0000\u0000\u0130\u0131\u0005"+ + "n\u0000\u0000\u0131\u0132\u0005d\u0000\u0000\u0132\u0133\u0005s\u0000"+ + "\u0000\u0133\u001e\u0001\u0000\u0000\u0000\u0134\u0135\u0005f\u0000\u0000"+ + "\u0135\u0136\u0005i\u0000\u0000\u0136\u0137\u0005n\u0000\u0000\u0137\u0138"+ + "\u0005a\u0000\u0000\u0138\u0139\u0005l\u0000\u0000\u0139 \u0001\u0000"+ + "\u0000\u0000\u013a\u013b\u0005f\u0000\u0000\u013b\u013c\u0005i\u0000\u0000"+ + "\u013c\u013d\u0005n\u0000\u0000\u013d\u013e\u0005a\u0000\u0000\u013e\u013f"+ + "\u0005l\u0000\u0000\u013f\u0140\u0005l\u0000\u0000\u0140\u0141\u0005y"+ + "\u0000\u0000\u0141\"\u0001\u0000\u0000\u0000\u0142\u0143\u0005f\u0000"+ + "\u0000\u0143\u0144\u0005l\u0000\u0000\u0144\u0145\u0005o\u0000\u0000\u0145"+ + "\u0146\u0005a\u0000\u0000\u0146\u0147\u0005t\u0000\u0000\u0147$\u0001"+ + "\u0000\u0000\u0000\u0148\u0149\u0005f\u0000\u0000\u0149\u014a\u0005o\u0000"+ + "\u0000\u014a\u014b\u0005r\u0000\u0000\u014b&\u0001\u0000\u0000\u0000\u014c"+ + "\u014d\u0005i\u0000\u0000\u014d\u014e\u0005f\u0000\u0000\u014e(\u0001"+ + "\u0000\u0000\u0000\u014f\u0150\u0005i\u0000\u0000\u0150\u0151\u0005m\u0000"+ + "\u0000\u0151\u0152\u0005p\u0000\u0000\u0152\u0153\u0005l\u0000\u0000\u0153"+ + "\u0154\u0005e\u0000\u0000\u0154\u0155\u0005m\u0000\u0000\u0155\u0156\u0005"+ + "e\u0000\u0000\u0156\u0157\u0005n\u0000\u0000\u0157\u0158\u0005t\u0000"+ + "\u0000\u0158\u0159\u0005s\u0000\u0000\u0159*\u0001\u0000\u0000\u0000\u015a"+ + "\u015b\u0005i\u0000\u0000\u015b\u015c\u0005m\u0000\u0000\u015c\u015d\u0005"+ + "p\u0000\u0000\u015d\u015e\u0005o\u0000\u0000\u015e\u015f\u0005r\u0000"+ + "\u0000\u015f\u0160\u0005t\u0000\u0000\u0160,\u0001\u0000\u0000\u0000\u0161"+ + "\u0162\u0005i\u0000\u0000\u0162\u0163\u0005n\u0000\u0000\u0163\u0164\u0005"+ + "s\u0000\u0000\u0164\u0165\u0005t\u0000\u0000\u0165\u0166\u0005a\u0000"+ + "\u0000\u0166\u0167\u0005n\u0000\u0000\u0167\u0168\u0005c\u0000\u0000\u0168"+ + "\u0169\u0005e\u0000\u0000\u0169\u016a\u0005o\u0000\u0000\u016a\u016b\u0005"+ + "f\u0000\u0000\u016b.\u0001\u0000\u0000\u0000\u016c\u016d\u0005i\u0000"+ + "\u0000\u016d\u016e\u0005n\u0000\u0000\u016e\u016f\u0005t\u0000\u0000\u016f"+ + "0\u0001\u0000\u0000\u0000\u0170\u0171\u0005i\u0000\u0000\u0171\u0172\u0005"+ + "n\u0000\u0000\u0172\u0173\u0005t\u0000\u0000\u0173\u0174\u0005e\u0000"+ + "\u0000\u0174\u0175\u0005r\u0000\u0000\u0175\u0176\u0005f\u0000\u0000\u0176"+ + "\u0177\u0005a\u0000\u0000\u0177\u0178\u0005c\u0000\u0000\u0178\u0179\u0005"+ + "e\u0000\u0000\u01792\u0001\u0000\u0000\u0000\u017a\u017b\u0005l\u0000"+ + "\u0000\u017b\u017c\u0005o\u0000\u0000\u017c\u017d\u0005n\u0000\u0000\u017d"+ + "\u017e\u0005g\u0000\u0000\u017e4\u0001\u0000\u0000\u0000\u017f\u0180\u0005"+ + "n\u0000\u0000\u0180\u0181\u0005a\u0000\u0000\u0181\u0182\u0005t\u0000"+ + "\u0000\u0182\u0183\u0005i\u0000\u0000\u0183\u0184\u0005v\u0000\u0000\u0184"+ + "\u0185\u0005e\u0000\u0000\u01856\u0001\u0000\u0000\u0000\u0186\u0187\u0005"+ + "n\u0000\u0000\u0187\u0188\u0005e\u0000\u0000\u0188\u0189\u0005w\u0000"+ + "\u0000\u01898\u0001\u0000\u0000\u0000\u018a\u018b\u0005p\u0000\u0000\u018b"+ + "\u018c\u0005a\u0000\u0000\u018c\u018d\u0005c\u0000\u0000\u018d\u018e\u0005"+ + "k\u0000\u0000\u018e\u018f\u0005a\u0000\u0000\u018f\u0190\u0005g\u0000"+ + "\u0000\u0190\u0191\u0005e\u0000\u0000\u0191:\u0001\u0000\u0000\u0000\u0192"+ + "\u0193\u0005p\u0000\u0000\u0193\u0194\u0005r\u0000\u0000\u0194\u0195\u0005"+ + "i\u0000\u0000\u0195\u0196\u0005v\u0000\u0000\u0196\u0197\u0005a\u0000"+ + "\u0000\u0197\u0198\u0005t\u0000\u0000\u0198\u0199\u0005e\u0000\u0000\u0199"+ + "<\u0001\u0000\u0000\u0000\u019a\u019b\u0005p\u0000\u0000\u019b\u019c\u0005"+ + "r\u0000\u0000\u019c\u019d\u0005o\u0000\u0000\u019d\u019e\u0005t\u0000"+ + "\u0000\u019e\u019f\u0005e\u0000\u0000\u019f\u01a0\u0005c\u0000\u0000\u01a0"+ + "\u01a1\u0005t\u0000\u0000\u01a1\u01a2\u0005e\u0000\u0000\u01a2\u01a3\u0005"+ + "d\u0000\u0000\u01a3>\u0001\u0000\u0000\u0000\u01a4\u01a5\u0005p\u0000"+ + "\u0000\u01a5\u01a6\u0005u\u0000\u0000\u01a6\u01a7\u0005b\u0000\u0000\u01a7"+ + "\u01a8\u0005l\u0000\u0000\u01a8\u01a9\u0005i\u0000\u0000\u01a9\u01aa\u0005"+ + "c\u0000\u0000\u01aa@\u0001\u0000\u0000\u0000\u01ab\u01ac\u0005r\u0000"+ + "\u0000\u01ac\u01ad\u0005e\u0000\u0000\u01ad\u01ae\u0005t\u0000\u0000\u01ae"+ + "\u01af\u0005u\u0000\u0000\u01af\u01b0\u0005r\u0000\u0000\u01b0\u01b1\u0005"+ + "n\u0000\u0000\u01b1B\u0001\u0000\u0000\u0000\u01b2\u01b3\u0005s\u0000"+ + "\u0000\u01b3\u01b4\u0005h\u0000\u0000\u01b4\u01b5\u0005o\u0000\u0000\u01b5"+ + "\u01b6\u0005r\u0000\u0000\u01b6\u01b7\u0005t\u0000\u0000\u01b7D\u0001"+ + "\u0000\u0000\u0000\u01b8\u01b9\u0005s\u0000\u0000\u01b9\u01ba\u0005t\u0000"+ + "\u0000\u01ba\u01bb\u0005a\u0000\u0000\u01bb\u01bc\u0005t\u0000\u0000\u01bc"+ + "\u01bd\u0005i\u0000\u0000\u01bd\u01be\u0005c\u0000\u0000\u01beF\u0001"+ + "\u0000\u0000\u0000\u01bf\u01c0\u0005s\u0000\u0000\u01c0\u01c1\u0005t\u0000"+ + "\u0000\u01c1\u01c2\u0005r\u0000\u0000\u01c2\u01c3\u0005i\u0000\u0000\u01c3"+ + "\u01c4\u0005c\u0000\u0000\u01c4\u01c5\u0005t\u0000\u0000\u01c5\u01c6\u0005"+ + "f\u0000\u0000\u01c6\u01c7\u0005p\u0000\u0000\u01c7H\u0001\u0000\u0000"+ + "\u0000\u01c8\u01c9\u0005s\u0000\u0000\u01c9\u01ca\u0005u\u0000\u0000\u01ca"+ + "\u01cb\u0005p\u0000\u0000\u01cb\u01cc\u0005e\u0000\u0000\u01cc\u01cd\u0005"+ + "r\u0000\u0000\u01cdJ\u0001\u0000\u0000\u0000\u01ce\u01cf\u0005s\u0000"+ + "\u0000\u01cf\u01d0\u0005w\u0000\u0000\u01d0\u01d1\u0005i\u0000\u0000\u01d1"+ + "\u01d2\u0005t\u0000\u0000\u01d2\u01d3\u0005c\u0000\u0000\u01d3\u01d4\u0005"+ + "h\u0000\u0000\u01d4L\u0001\u0000\u0000\u0000\u01d5\u01d6\u0005s\u0000"+ + "\u0000\u01d6\u01d7\u0005y\u0000\u0000\u01d7\u01d8\u0005n\u0000\u0000\u01d8"+ + "\u01d9\u0005c\u0000\u0000\u01d9\u01da\u0005h\u0000\u0000\u01da\u01db\u0005"+ + "r\u0000\u0000\u01db\u01dc\u0005o\u0000\u0000\u01dc\u01dd\u0005n\u0000"+ + "\u0000\u01dd\u01de\u0005i\u0000\u0000\u01de\u01df\u0005z\u0000\u0000\u01df"+ + "\u01e0\u0005e\u0000\u0000\u01e0\u01e1\u0005d\u0000\u0000\u01e1N\u0001"+ + "\u0000\u0000\u0000\u01e2\u01e3\u0005t\u0000\u0000\u01e3\u01e4\u0005h\u0000"+ + "\u0000\u01e4\u01e5\u0005i\u0000\u0000\u01e5\u01e6\u0005s\u0000\u0000\u01e6"+ + "P\u0001\u0000\u0000\u0000\u01e7\u01e8\u0005t\u0000\u0000\u01e8\u01e9\u0005"+ + "h\u0000\u0000\u01e9\u01ea\u0005r\u0000\u0000\u01ea\u01eb\u0005o\u0000"+ + "\u0000\u01eb\u01ec\u0005w\u0000\u0000\u01ecR\u0001\u0000\u0000\u0000\u01ed"+ + "\u01ee\u0005t\u0000\u0000\u01ee\u01ef\u0005h\u0000\u0000\u01ef\u01f0\u0005"+ + "r\u0000\u0000\u01f0\u01f1\u0005o\u0000\u0000\u01f1\u01f2\u0005w\u0000"+ + "\u0000\u01f2\u01f3\u0005s\u0000\u0000\u01f3T\u0001\u0000\u0000\u0000\u01f4"+ + "\u01f5\u0005t\u0000\u0000\u01f5\u01f6\u0005r\u0000\u0000\u01f6\u01f7\u0005"+ + "a\u0000\u0000\u01f7\u01f8\u0005n\u0000\u0000\u01f8\u01f9\u0005s\u0000"+ + "\u0000\u01f9\u01fa\u0005i\u0000\u0000\u01fa\u01fb\u0005e\u0000\u0000\u01fb"+ + "\u01fc\u0005n\u0000\u0000\u01fc\u01fd\u0005t\u0000\u0000\u01fdV\u0001"+ + "\u0000\u0000\u0000\u01fe\u01ff\u0005t\u0000\u0000\u01ff\u0200\u0005r\u0000"+ + "\u0000\u0200\u0201\u0005y\u0000\u0000\u0201X\u0001\u0000\u0000\u0000\u0202"+ + "\u0203\u0005v\u0000\u0000\u0203\u0204\u0005o\u0000\u0000\u0204\u0205\u0005"+ + "i\u0000\u0000\u0205\u0206\u0005d\u0000\u0000\u0206Z\u0001\u0000\u0000"+ + "\u0000\u0207\u0208\u0005v\u0000\u0000\u0208\u0209\u0005o\u0000\u0000\u0209"+ + "\u020a\u0005l\u0000\u0000\u020a\u020b\u0005a\u0000\u0000\u020b\u020c\u0005"+ + "t\u0000\u0000\u020c\u020d\u0005i\u0000\u0000\u020d\u020e\u0005l\u0000"+ + "\u0000\u020e\u020f\u0005e\u0000\u0000\u020f\\\u0001\u0000\u0000\u0000"+ + "\u0210\u0211\u0005w\u0000\u0000\u0211\u0212\u0005h\u0000\u0000\u0212\u0213"+ + "\u0005i\u0000\u0000\u0213\u0214\u0005l\u0000\u0000\u0214\u0215\u0005e"+ + "\u0000\u0000\u0215^\u0001\u0000\u0000\u0000\u0216\u0217\u0005;\u0000\u0000"+ + "\u0217`\u0001\u0000\u0000\u0000\u0218\u0219\u0005,\u0000\u0000\u0219b"+ + "\u0001\u0000\u0000\u0000\u021a\u021b\u0005.\u0000\u0000\u021bd\u0001\u0000"+ + "\u0000\u0000\u021c\u021d\u0005(\u0000\u0000\u021df\u0001\u0000\u0000\u0000"+ + "\u021e\u021f\u0005)\u0000\u0000\u021fh\u0001\u0000\u0000\u0000\u0220\u0221"+ + "\u0005{\u0000\u0000\u0221j\u0001\u0000\u0000\u0000\u0222\u0223\u0005}"+ + "\u0000\u0000\u0223l\u0001\u0000\u0000\u0000\u0224\u0225\u0005[\u0000\u0000"+ + "\u0225n\u0001\u0000\u0000\u0000\u0226\u0227\u0005]\u0000\u0000\u0227p"+ + "\u0001\u0000\u0000\u0000\u0228\u0229\u0005:\u0000\u0000\u0229r\u0001\u0000"+ + "\u0000\u0000\u022a\u022b\u0005?\u0000\u0000\u022bt\u0001\u0000\u0000\u0000"+ + "\u022c\u022d\u0005=\u0000\u0000\u022dv\u0001\u0000\u0000\u0000\u022e\u022f"+ + "\u0005+\u0000\u0000\u022fx\u0001\u0000\u0000\u0000\u0230\u0231\u0005-"+ + "\u0000\u0000\u0231z\u0001\u0000\u0000\u0000\u0232\u0233\u0005*\u0000\u0000"+ + "\u0233|\u0001\u0000\u0000\u0000\u0234\u0235\u0005/\u0000\u0000\u0235~"+ + "\u0001\u0000\u0000\u0000\u0236\u0237\u0005%\u0000\u0000\u0237\u0080\u0001"+ + "\u0000\u0000\u0000\u0238\u0239\u0005+\u0000\u0000\u0239\u023a\u0005+\u0000"+ + "\u0000\u023a\u0082\u0001\u0000\u0000\u0000\u023b\u023c\u0005-\u0000\u0000"+ + "\u023c\u023d\u0005-\u0000\u0000\u023d\u0084\u0001\u0000\u0000\u0000\u023e"+ + "\u023f\u0005!\u0000\u0000\u023f\u0086\u0001\u0000\u0000\u0000\u0240\u0241"+ + "\u0005~\u0000\u0000\u0241\u0088\u0001\u0000\u0000\u0000\u0242\u0243\u0005"+ + "=\u0000\u0000\u0243\u0244\u0005=\u0000\u0000\u0244\u008a\u0001\u0000\u0000"+ + "\u0000\u0245\u0246\u0005!\u0000\u0000\u0246\u0247\u0005=\u0000\u0000\u0247"+ + "\u008c\u0001\u0000\u0000\u0000\u0248\u0249\u0005<\u0000\u0000\u0249\u008e"+ + "\u0001\u0000\u0000\u0000\u024a\u024b\u0005>\u0000\u0000\u024b\u0090\u0001"+ + "\u0000\u0000\u0000\u024c\u024d\u0005<\u0000\u0000\u024d\u024e\u0005=\u0000"+ + "\u0000\u024e\u0092\u0001\u0000\u0000\u0000\u024f\u0250\u0005>\u0000\u0000"+ + "\u0250\u0251\u0005=\u0000\u0000\u0251\u0094\u0001\u0000\u0000\u0000\u0252"+ + "\u0253\u0005&\u0000\u0000\u0253\u0254\u0005&\u0000\u0000\u0254\u0096\u0001"+ + "\u0000\u0000\u0000\u0255\u0256\u0005|\u0000\u0000\u0256\u0257\u0005|\u0000"+ + "\u0000\u0257\u0098\u0001\u0000\u0000\u0000\u0258\u0259\u0005&\u0000\u0000"+ + "\u0259\u009a\u0001\u0000\u0000\u0000\u025a\u025b\u0005|\u0000\u0000\u025b"+ + "\u009c\u0001\u0000\u0000\u0000\u025c\u025d\u0005^\u0000\u0000\u025d\u009e"+ + "\u0001\u0000\u0000\u0000\u025e\u025f\u0005<\u0000\u0000\u025f\u0260\u0005"+ + "<\u0000\u0000\u0260\u00a0\u0001\u0000\u0000\u0000\u0261\u0262\u0005>\u0000"+ + "\u0000\u0262\u0263\u0005>\u0000\u0000\u0263\u00a2\u0001\u0000\u0000\u0000"+ + "\u0264\u0265\u0005>\u0000\u0000\u0265\u0266\u0005>\u0000\u0000\u0266\u0267"+ + "\u0005>\u0000\u0000\u0267\u00a4\u0001\u0000\u0000\u0000\u0268\u0269\u0005"+ + "+\u0000\u0000\u0269\u026a\u0005=\u0000\u0000\u026a\u00a6\u0001\u0000\u0000"+ + "\u0000\u026b\u026c\u0005-\u0000\u0000\u026c\u026d\u0005=\u0000\u0000\u026d"+ + "\u00a8\u0001\u0000\u0000\u0000\u026e\u026f\u0005*\u0000\u0000\u026f\u0270"+ + "\u0005=\u0000\u0000\u0270\u00aa\u0001\u0000\u0000\u0000\u0271\u0272\u0005"+ + "/\u0000\u0000\u0272\u0273\u0005=\u0000\u0000\u0273\u00ac\u0001\u0000\u0000"+ + "\u0000\u0274\u0275\u0005&\u0000\u0000\u0275\u0276\u0005=\u0000\u0000\u0276"+ + "\u00ae\u0001\u0000\u0000\u0000\u0277\u0278\u0005|\u0000\u0000\u0278\u0279"+ + "\u0005=\u0000\u0000\u0279\u00b0\u0001\u0000\u0000\u0000\u027a\u027b\u0005"+ + "^\u0000\u0000\u027b\u027c\u0005=\u0000\u0000\u027c\u00b2\u0001\u0000\u0000"+ + "\u0000\u027d\u027e\u0005%\u0000\u0000\u027e\u027f\u0005=\u0000\u0000\u027f"+ + "\u00b4\u0001\u0000\u0000\u0000\u0280\u0281\u0005<\u0000\u0000\u0281\u0282"+ + "\u0005<\u0000\u0000\u0282\u0283\u0005=\u0000\u0000\u0283\u00b6\u0001\u0000"+ + "\u0000\u0000\u0284\u0285\u0005>\u0000\u0000\u0285\u0286\u0005>\u0000\u0000"+ + "\u0286\u0287\u0005=\u0000\u0000\u0287\u00b8\u0001\u0000\u0000\u0000\u0288"+ + "\u0289\u0005>\u0000\u0000\u0289\u028a\u0005>\u0000\u0000\u028a\u028b\u0005"+ + ">\u0000\u0000\u028b\u028c\u0005=\u0000\u0000\u028c\u00ba\u0001\u0000\u0000"+ + "\u0000\u028d\u0291\u0003\u00bd^\u0000\u028e\u0290\u0003\u00bf_\u0000\u028f"+ + "\u028e\u0001\u0000\u0000\u0000\u0290\u0293\u0001\u0000\u0000\u0000\u0291"+ + "\u028f\u0001\u0000\u0000\u0000\u0291\u0292\u0001\u0000\u0000\u0000\u0292"+ + "\u00bc\u0001\u0000\u0000\u0000\u0293\u0291\u0001\u0000\u0000\u0000\u0294"+ + "\u0296\u0007\u0000\u0000\u0000\u0295\u0294\u0001\u0000\u0000\u0000\u0296"+ + "\u00be\u0001\u0000\u0000\u0000\u0297\u029a\u0003\u00bd^\u0000\u0298\u029a"+ + "\u0007\u0001\u0000\u0000\u0299\u0297\u0001\u0000\u0000\u0000\u0299\u0298"+ + "\u0001\u0000\u0000\u0000\u029a\u00c0\u0001\u0000\u0000\u0000\u029b\u029d"+ + "\u0007\u0002\u0000\u0000\u029c\u029b\u0001\u0000\u0000\u0000\u029d\u029e"+ + "\u0001\u0000\u0000\u0000\u029e\u029c\u0001\u0000\u0000\u0000\u029e\u029f"+ + "\u0001\u0000\u0000\u0000\u029f\u00c2\u0001\u0000\u0000\u0000\u02a0\u02a2"+ + "\u0007\u0002\u0000\u0000\u02a1\u02a0\u0001\u0000\u0000\u0000\u02a2\u02a3"+ + "\u0001\u0000\u0000\u0000\u02a3\u02a1\u0001\u0000\u0000\u0000\u02a3\u02a4"+ + "\u0001\u0000\u0000\u0000\u02a4\u02a5\u0001\u0000\u0000\u0000\u02a5\u02a9"+ + "\u0005.\u0000\u0000\u02a6\u02a8\u0007\u0002\u0000\u0000\u02a7\u02a6\u0001"+ + "\u0000\u0000\u0000\u02a8\u02ab\u0001\u0000\u0000\u0000\u02a9\u02a7\u0001"+ + "\u0000\u0000\u0000\u02a9\u02aa\u0001\u0000\u0000\u0000\u02aa\u00c4\u0001"+ + "\u0000\u0000\u0000\u02ab\u02a9\u0001\u0000\u0000\u0000\u02ac\u02b0\u0005"+ + "\'\u0000\u0000\u02ad\u02b1\b\u0003\u0000\u0000\u02ae\u02af\u0005\\\u0000"+ + "\u0000\u02af\u02b1\t\u0000\u0000\u0000\u02b0\u02ad\u0001\u0000\u0000\u0000"+ + "\u02b0\u02ae\u0001\u0000\u0000\u0000\u02b1\u02b2\u0001\u0000\u0000\u0000"+ + "\u02b2\u02b3\u0005\'\u0000\u0000\u02b3\u00c6\u0001\u0000\u0000\u0000\u02b4"+ + "\u02ba\u0005\"\u0000\u0000\u02b5\u02b9\b\u0004\u0000\u0000\u02b6\u02b7"+ + "\u0005\\\u0000\u0000\u02b7\u02b9\t\u0000\u0000\u0000\u02b8\u02b5\u0001"+ + "\u0000\u0000\u0000\u02b8\u02b6\u0001\u0000\u0000\u0000\u02b9\u02bc\u0001"+ + "\u0000\u0000\u0000\u02ba\u02b8\u0001\u0000\u0000\u0000\u02ba\u02bb\u0001"+ + "\u0000\u0000\u0000\u02bb\u02bd\u0001\u0000\u0000\u0000\u02bc\u02ba\u0001"+ + "\u0000\u0000\u0000\u02bd\u02be\u0005\"\u0000\u0000\u02be\u00c8\u0001\u0000"+ + "\u0000\u0000\u02bf\u02c0\u0005t\u0000\u0000\u02c0\u02c1\u0005r\u0000\u0000"+ + "\u02c1\u02c2\u0005u\u0000\u0000\u02c2\u02c9\u0005e\u0000\u0000\u02c3\u02c4"+ + "\u0005f\u0000\u0000\u02c4\u02c5\u0005a\u0000\u0000\u02c5\u02c6\u0005l"+ + "\u0000\u0000\u02c6\u02c7\u0005s\u0000\u0000\u02c7\u02c9\u0005e\u0000\u0000"+ + "\u02c8\u02bf\u0001\u0000\u0000\u0000\u02c8\u02c3\u0001\u0000\u0000\u0000"+ + "\u02c9\u00ca\u0001\u0000\u0000\u0000\u02ca\u02cb\u0005n\u0000\u0000\u02cb"+ + "\u02cc\u0005u\u0000\u0000\u02cc\u02cd\u0005l\u0000\u0000\u02cd\u02ce\u0005"+ + "l\u0000\u0000\u02ce\u00cc\u0001\u0000\u0000\u0000\u02cf\u02d1\u0007\u0005"+ + "\u0000\u0000\u02d0\u02cf\u0001\u0000\u0000\u0000\u02d1\u02d2\u0001\u0000"+ + "\u0000\u0000\u02d2\u02d0\u0001\u0000\u0000\u0000\u02d2\u02d3\u0001\u0000"+ + "\u0000\u0000\u02d3\u02d4\u0001\u0000\u0000\u0000\u02d4\u02d5\u0006f\u0000"+ + "\u0000\u02d5\u00ce\u0001\u0000\u0000\u0000\u02d6\u02d7\u0005/\u0000\u0000"+ + "\u02d7\u02d8\u0005/\u0000\u0000\u02d8\u02dc\u0001\u0000\u0000\u0000\u02d9"+ + "\u02db\b\u0006\u0000\u0000\u02da\u02d9\u0001\u0000\u0000\u0000\u02db\u02de"+ + "\u0001\u0000\u0000\u0000\u02dc\u02da\u0001\u0000\u0000\u0000\u02dc\u02dd"+ + "\u0001\u0000\u0000\u0000\u02dd\u02df\u0001\u0000\u0000\u0000\u02de\u02dc"+ + "\u0001\u0000\u0000\u0000\u02df\u02e0\u0006g\u0000\u0000\u02e0\u00d0\u0001"+ + "\u0000\u0000\u0000\u02e1\u02e2\u0005/\u0000\u0000\u02e2\u02e3\u0005*\u0000"+ + "\u0000\u02e3\u02e7\u0001\u0000\u0000\u0000\u02e4\u02e6\t\u0000\u0000\u0000"+ + "\u02e5\u02e4\u0001\u0000\u0000\u0000\u02e6\u02e9\u0001\u0000\u0000\u0000"+ + "\u02e7\u02e8\u0001\u0000\u0000\u0000\u02e7\u02e5\u0001\u0000\u0000\u0000"+ + "\u02e8\u02ea\u0001\u0000\u0000\u0000\u02e9\u02e7\u0001\u0000\u0000\u0000"+ + "\u02ea\u02eb\u0005*\u0000\u0000\u02eb\u02ec\u0005/\u0000\u0000\u02ec\u02ed"+ + "\u0001\u0000\u0000\u0000\u02ed\u02ee\u0006h\u0000\u0000\u02ee\u00d2\u0001"+ + "\u0000\u0000\u0000\u000e\u0000\u0291\u0295\u0299\u029e\u02a3\u02a9\u02b0"+ + "\u02b8\u02ba\u02c8\u02d2\u02dc\u02e7\u0001\u0006\u0000\u0000"; + public static final ATN _ATN = + new ATNDeserializer().deserialize(_serializedATN.toCharArray()); + static { + _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()]; + for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) { + _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i); + } + } +} \ No newline at end of file diff --git a/src/org/lsmr/cfg/Java1_4Parser.java b/src/org/lsmr/cfg/Java1_4Parser.java new file mode 100644 index 0000000..cd758b5 --- /dev/null +++ b/src/org/lsmr/cfg/Java1_4Parser.java @@ -0,0 +1,6775 @@ +// Generated from Java1_4Parser.g4 by ANTLR 4.13.2 + + package org.lsmr.cfg; + +import org.antlr.v4.runtime.atn.*; +import org.antlr.v4.runtime.dfa.DFA; +import org.antlr.v4.runtime.*; +import org.antlr.v4.runtime.misc.*; +import org.antlr.v4.runtime.tree.*; +import java.util.List; +import java.util.Iterator; +import java.util.ArrayList; + +@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue", "this-escape"}) +public class Java1_4Parser extends Parser { + static { RuntimeMetaData.checkVersion("4.13.2", RuntimeMetaData.VERSION); } + + protected static final DFA[] _decisionToDFA; + protected static final PredictionContextCache _sharedContextCache = + new PredictionContextCache(); + public static final int + ABSTRACT=1, ASSERT=2, BOOLEAN=3, BREAK=4, BYTE=5, CASE=6, CATCH=7, CHAR=8, + CLASS=9, CONTINUE=10, DEFAULT=11, DO=12, DOUBLE=13, ELSE=14, EXTENDS=15, + FINAL=16, FINALLY=17, FLOAT=18, FOR=19, IF=20, IMPLEMENTS=21, IMPORT=22, + INSTANCEOF=23, INT=24, INTERFACE=25, LONG=26, NATIVE=27, NEW=28, PACKAGE=29, + PRIVATE=30, PROTECTED=31, PUBLIC=32, RETURN=33, SHORT=34, STATIC=35, STRICTFP=36, + SUPER=37, SWITCH=38, SYNCHRONIZED=39, THIS=40, THROW=41, THROWS=42, TRANSIENT=43, + TRY=44, VOID=45, VOLATILE=46, WHILE=47, SEMICOLON=48, COMMA=49, PERIOD=50, + OPEN_PARENTHESIS=51, CLOSE_PARENTHESIS=52, OPEN_BRACE=53, CLOSE_BRACE=54, + OPEN_BRACKET=55, CLOSE_BRACKET=56, COLON=57, QUESTION=58, EQUALS=59, PLUS=60, + MINUS=61, ASTERISK=62, SLASH=63, PERCENT=64, DOUBLE_PLUS=65, DOUBLE_MINUS=66, + EXCLAMATION=67, TILDE=68, DOUBLE_EQUALS=69, EXCLAMATION_EQUALS=70, LESS_THAN=71, + GREATER_THAN=72, LESS_THAN_OR_EQUALS=73, GREATER_THAN_OR_EQUALS=74, DOUBLE_AMPERSAND=75, + DOUBLE_PIPE=76, AMPERSAND=77, PIPE=78, CARET=79, DOUBLE_LESS_THAN=80, + DOUBLE_GREATER_THAN=81, TRIPLE_GREATER_THAN=82, PLUS_EQUALS=83, MINUS_EQUALS=84, + ASTERISK_EQUALS=85, SLASH_EQUALS=86, AMPERSAND_EQUALS=87, PIPE_EQUALS=88, + CARET_EQUALS=89, PERCENT_EQUALS=90, DOUBLE_LESS_THAN_EQUALS=91, DOUBLE_GREATER_THAN_EQUALS=92, + TRIPLE_GREATER_THAN_EQUALS=93, Identifier=94, IntegerLiteral=95, FloatingPointLiteral=96, + CharacterLiteral=97, StringLiteral=98, BooleanLiteral=99, NullLiteral=100, + WHITESPACE=101, LINE_COMMENT=102, COMMENT=103; + public static final int + RULE_identifier = 0, RULE_qualifiedIdentifier = 1, RULE_literal = 2, RULE_type = 3, + RULE_basicType = 4, RULE_dims = 5, RULE_expression = 6, RULE_assignmentOperator = 7, + RULE_expression1 = 8, RULE_expression1Rest = 9, RULE_expression2 = 10, + RULE_expression2Rest = 11, RULE_infixOp = 12, RULE_expression3 = 13, RULE_prefixOp = 14, + RULE_postfixOp = 15, RULE_primary = 16, RULE_identifierSuffix = 17, RULE_selector = 18, + RULE_superSuffix = 19, RULE_arguments = 20, RULE_creator = 21, RULE_innerCreator = 22, + RULE_arrayCreatorRest = 23, RULE_classCreatorRest = 24, RULE_arrayInitializer = 25, + RULE_variableInitializer = 26, RULE_parenthesizedExpression = 27, RULE_block = 28, + RULE_blockStatement = 29, RULE_localVariableDeclarationStatement = 30, + RULE_statement = 31, RULE_ifStatement = 32, RULE_elseClause = 33, RULE_forStatement = 34, + RULE_whileStatement = 35, RULE_doStatement = 36, RULE_tryStatement = 37, + RULE_switchStatement = 38, RULE_synchronizedStatement = 39, RULE_returnStatement = 40, + RULE_throwStatement = 41, RULE_breakStatement = 42, RULE_continueStatement = 43, + RULE_emptyStatement = 44, RULE_expressionStatement = 45, RULE_assertStatement = 46, + RULE_labeledStatement = 47, RULE_statementExpression = 48, RULE_constantExpression = 49, + RULE_catches = 50, RULE_catchClause = 51, RULE_finallyClause = 52, RULE_switchBlockStatementGroup = 53, + RULE_switchLabel = 54, RULE_forInit = 55, RULE_forUpdate = 56, RULE_modifier = 57, + RULE_variableDeclarators = 58, RULE_variableDeclarator = 59, RULE_variableDeclaratorId = 60, + RULE_constantDeclarator = 61, RULE_compilationUnit = 62, RULE_importDeclaration = 63, + RULE_typeDeclaration = 64, RULE_classOrInterfaceDeclaration = 65, RULE_classDeclaration = 66, + RULE_superclass = 67, RULE_superinterfaces = 68, RULE_interfaceDeclaration = 69, + RULE_extendsInterfaces = 70, RULE_typeList = 71, RULE_classBody = 72, + RULE_interfaceBody = 73, RULE_classBodyDeclaration = 74, RULE_emptyDeclaration = 75, + RULE_initializer = 76, RULE_staticInitializer = 77, RULE_memberDeclaration = 78, + RULE_methodDeclaration = 79, RULE_result = 80, RULE_throws_ = 81, RULE_fieldDeclaration = 82, + RULE_constructorDeclaration = 83, RULE_constructorBody = 84, RULE_explicitConstructorInvocation = 85, + RULE_interfaceBodyDeclaration = 86, RULE_interfaceMemberDeclaration = 87, + RULE_interfaceMethodDeclaration = 88, RULE_constantDeclaration = 89, RULE_qualifiedIdentifiers = 90, + RULE_formalParameters = 91, RULE_formalParameter = 92; + private static String[] makeRuleNames() { + return new String[] { + "identifier", "qualifiedIdentifier", "literal", "type", "basicType", + "dims", "expression", "assignmentOperator", "expression1", "expression1Rest", + "expression2", "expression2Rest", "infixOp", "expression3", "prefixOp", + "postfixOp", "primary", "identifierSuffix", "selector", "superSuffix", + "arguments", "creator", "innerCreator", "arrayCreatorRest", "classCreatorRest", + "arrayInitializer", "variableInitializer", "parenthesizedExpression", + "block", "blockStatement", "localVariableDeclarationStatement", "statement", + "ifStatement", "elseClause", "forStatement", "whileStatement", "doStatement", + "tryStatement", "switchStatement", "synchronizedStatement", "returnStatement", + "throwStatement", "breakStatement", "continueStatement", "emptyStatement", + "expressionStatement", "assertStatement", "labeledStatement", "statementExpression", + "constantExpression", "catches", "catchClause", "finallyClause", "switchBlockStatementGroup", + "switchLabel", "forInit", "forUpdate", "modifier", "variableDeclarators", + "variableDeclarator", "variableDeclaratorId", "constantDeclarator", "compilationUnit", + "importDeclaration", "typeDeclaration", "classOrInterfaceDeclaration", + "classDeclaration", "superclass", "superinterfaces", "interfaceDeclaration", + "extendsInterfaces", "typeList", "classBody", "interfaceBody", "classBodyDeclaration", + "emptyDeclaration", "initializer", "staticInitializer", "memberDeclaration", + "methodDeclaration", "result", "throws_", "fieldDeclaration", "constructorDeclaration", + "constructorBody", "explicitConstructorInvocation", "interfaceBodyDeclaration", + "interfaceMemberDeclaration", "interfaceMethodDeclaration", "constantDeclaration", + "qualifiedIdentifiers", "formalParameters", "formalParameter" + }; + } + public static final String[] ruleNames = makeRuleNames(); + + private static String[] makeLiteralNames() { + return new String[] { + null, "'abstract'", "'assert'", "'boolean'", "'break'", "'byte'", "'case'", + "'catch'", "'char'", "'class'", "'continue'", "'default'", "'do'", "'double'", + "'else'", "'extends'", "'final'", "'finally'", "'float'", "'for'", "'if'", + "'implements'", "'import'", "'instanceof'", "'int'", "'interface'", "'long'", + "'native'", "'new'", "'package'", "'private'", "'protected'", "'public'", + "'return'", "'short'", "'static'", "'strictfp'", "'super'", "'switch'", + "'synchronized'", "'this'", "'throw'", "'throws'", "'transient'", "'try'", + "'void'", "'volatile'", "'while'", "';'", "','", "'.'", "'('", "')'", + "'{'", "'}'", "'['", "']'", "':'", "'?'", "'='", "'+'", "'-'", "'*'", + "'/'", "'%'", "'++'", "'--'", "'!'", "'~'", "'=='", "'!='", "'<'", "'>'", + "'<='", "'>='", "'&&'", "'||'", "'&'", "'|'", "'^'", "'<<'", "'>>'", + "'>>>'", "'+='", "'-='", "'*='", "'/='", "'&='", "'|='", "'^='", "'%='", + "'<<='", "'>>='", "'>>>='", null, null, null, null, null, null, "'null'" + }; + } + private static final String[] _LITERAL_NAMES = makeLiteralNames(); + private static String[] makeSymbolicNames() { + return new String[] { + null, "ABSTRACT", "ASSERT", "BOOLEAN", "BREAK", "BYTE", "CASE", "CATCH", + "CHAR", "CLASS", "CONTINUE", "DEFAULT", "DO", "DOUBLE", "ELSE", "EXTENDS", + "FINAL", "FINALLY", "FLOAT", "FOR", "IF", "IMPLEMENTS", "IMPORT", "INSTANCEOF", + "INT", "INTERFACE", "LONG", "NATIVE", "NEW", "PACKAGE", "PRIVATE", "PROTECTED", + "PUBLIC", "RETURN", "SHORT", "STATIC", "STRICTFP", "SUPER", "SWITCH", + "SYNCHRONIZED", "THIS", "THROW", "THROWS", "TRANSIENT", "TRY", "VOID", + "VOLATILE", "WHILE", "SEMICOLON", "COMMA", "PERIOD", "OPEN_PARENTHESIS", + "CLOSE_PARENTHESIS", "OPEN_BRACE", "CLOSE_BRACE", "OPEN_BRACKET", "CLOSE_BRACKET", + "COLON", "QUESTION", "EQUALS", "PLUS", "MINUS", "ASTERISK", "SLASH", + "PERCENT", "DOUBLE_PLUS", "DOUBLE_MINUS", "EXCLAMATION", "TILDE", "DOUBLE_EQUALS", + "EXCLAMATION_EQUALS", "LESS_THAN", "GREATER_THAN", "LESS_THAN_OR_EQUALS", + "GREATER_THAN_OR_EQUALS", "DOUBLE_AMPERSAND", "DOUBLE_PIPE", "AMPERSAND", + "PIPE", "CARET", "DOUBLE_LESS_THAN", "DOUBLE_GREATER_THAN", "TRIPLE_GREATER_THAN", + "PLUS_EQUALS", "MINUS_EQUALS", "ASTERISK_EQUALS", "SLASH_EQUALS", "AMPERSAND_EQUALS", + "PIPE_EQUALS", "CARET_EQUALS", "PERCENT_EQUALS", "DOUBLE_LESS_THAN_EQUALS", + "DOUBLE_GREATER_THAN_EQUALS", "TRIPLE_GREATER_THAN_EQUALS", "Identifier", + "IntegerLiteral", "FloatingPointLiteral", "CharacterLiteral", "StringLiteral", + "BooleanLiteral", "NullLiteral", "WHITESPACE", "LINE_COMMENT", "COMMENT" + }; + } + private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); + public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); + + /** + * @deprecated Use {@link #VOCABULARY} instead. + */ + @Deprecated + public static final String[] tokenNames; + static { + tokenNames = new String[_SYMBOLIC_NAMES.length]; + for (int i = 0; i < tokenNames.length; i++) { + tokenNames[i] = VOCABULARY.getLiteralName(i); + if (tokenNames[i] == null) { + tokenNames[i] = VOCABULARY.getSymbolicName(i); + } + + if (tokenNames[i] == null) { + tokenNames[i] = ""; + } + } + } + + @Override + @Deprecated + public String[] getTokenNames() { + return tokenNames; + } + + @Override + + public Vocabulary getVocabulary() { + return VOCABULARY; + } + + @Override + public String getGrammarFileName() { return "Java1_4Parser.g4"; } + + @Override + public String[] getRuleNames() { return ruleNames; } + + @Override + public String getSerializedATN() { return _serializedATN; } + + @Override + public ATN getATN() { return _ATN; } + + public Java1_4Parser(TokenStream input) { + super(input); + _interp = new ParserATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache); + } + + @SuppressWarnings("CheckReturnValue") + public static class IdentifierContext extends ParserRuleContext { + public TerminalNode Identifier() { return getToken(Java1_4Parser.Identifier, 0); } + public IdentifierContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_identifier; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitIdentifier(this); + else return visitor.visitChildren(this); + } + } + + public final IdentifierContext identifier() throws RecognitionException { + IdentifierContext _localctx = new IdentifierContext(_ctx, getState()); + enterRule(_localctx, 0, RULE_identifier); + try { + enterOuterAlt(_localctx, 1); + { + setState(186); + match(Identifier); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class QualifiedIdentifierContext extends ParserRuleContext { + public List identifier() { + return getRuleContexts(IdentifierContext.class); + } + public IdentifierContext identifier(int i) { + return getRuleContext(IdentifierContext.class,i); + } + public List PERIOD() { return getTokens(Java1_4Parser.PERIOD); } + public TerminalNode PERIOD(int i) { + return getToken(Java1_4Parser.PERIOD, i); + } + public QualifiedIdentifierContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_qualifiedIdentifier; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitQualifiedIdentifier(this); + else return visitor.visitChildren(this); + } + } + + public final QualifiedIdentifierContext qualifiedIdentifier() throws RecognitionException { + QualifiedIdentifierContext _localctx = new QualifiedIdentifierContext(_ctx, getState()); + enterRule(_localctx, 2, RULE_qualifiedIdentifier); + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(188); + identifier(); + setState(193); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,0,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(189); + match(PERIOD); + setState(190); + identifier(); + } + } + } + setState(195); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,0,_ctx); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class LiteralContext extends ParserRuleContext { + public TerminalNode IntegerLiteral() { return getToken(Java1_4Parser.IntegerLiteral, 0); } + public TerminalNode FloatingPointLiteral() { return getToken(Java1_4Parser.FloatingPointLiteral, 0); } + public TerminalNode CharacterLiteral() { return getToken(Java1_4Parser.CharacterLiteral, 0); } + public TerminalNode StringLiteral() { return getToken(Java1_4Parser.StringLiteral, 0); } + public TerminalNode BooleanLiteral() { return getToken(Java1_4Parser.BooleanLiteral, 0); } + public TerminalNode NullLiteral() { return getToken(Java1_4Parser.NullLiteral, 0); } + public LiteralContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_literal; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitLiteral(this); + else return visitor.visitChildren(this); + } + } + + public final LiteralContext literal() throws RecognitionException { + LiteralContext _localctx = new LiteralContext(_ctx, getState()); + enterRule(_localctx, 4, RULE_literal); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(196); + _la = _input.LA(1); + if ( !(((((_la - 95)) & ~0x3f) == 0 && ((1L << (_la - 95)) & 63L) != 0)) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class TypeContext extends ParserRuleContext { + public QualifiedIdentifierContext qualifiedIdentifier() { + return getRuleContext(QualifiedIdentifierContext.class,0); + } + public DimsContext dims() { + return getRuleContext(DimsContext.class,0); + } + public BasicTypeContext basicType() { + return getRuleContext(BasicTypeContext.class,0); + } + public TypeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_type; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitType(this); + else return visitor.visitChildren(this); + } + } + + public final TypeContext type() throws RecognitionException { + TypeContext _localctx = new TypeContext(_ctx, getState()); + enterRule(_localctx, 6, RULE_type); + int _la; + try { + setState(203); + _errHandler.sync(this); + switch (_input.LA(1)) { + case Identifier: + enterOuterAlt(_localctx, 1); + { + setState(198); + qualifiedIdentifier(); + setState(200); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==OPEN_BRACKET) { + { + setState(199); + dims(); + } + } + + } + break; + case BOOLEAN: + case BYTE: + case CHAR: + case DOUBLE: + case FLOAT: + case INT: + case LONG: + case SHORT: + enterOuterAlt(_localctx, 2); + { + setState(202); + basicType(); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class BasicTypeContext extends ParserRuleContext { + public TerminalNode BYTE() { return getToken(Java1_4Parser.BYTE, 0); } + public TerminalNode SHORT() { return getToken(Java1_4Parser.SHORT, 0); } + public TerminalNode CHAR() { return getToken(Java1_4Parser.CHAR, 0); } + public TerminalNode INT() { return getToken(Java1_4Parser.INT, 0); } + public TerminalNode LONG() { return getToken(Java1_4Parser.LONG, 0); } + public TerminalNode FLOAT() { return getToken(Java1_4Parser.FLOAT, 0); } + public TerminalNode DOUBLE() { return getToken(Java1_4Parser.DOUBLE, 0); } + public TerminalNode BOOLEAN() { return getToken(Java1_4Parser.BOOLEAN, 0); } + public BasicTypeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_basicType; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitBasicType(this); + else return visitor.visitChildren(this); + } + } + + public final BasicTypeContext basicType() throws RecognitionException { + BasicTypeContext _localctx = new BasicTypeContext(_ctx, getState()); + enterRule(_localctx, 8, RULE_basicType); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(205); + _la = _input.LA(1); + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 17264025896L) != 0)) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class DimsContext extends ParserRuleContext { + public List OPEN_BRACKET() { return getTokens(Java1_4Parser.OPEN_BRACKET); } + public TerminalNode OPEN_BRACKET(int i) { + return getToken(Java1_4Parser.OPEN_BRACKET, i); + } + public List CLOSE_BRACKET() { return getTokens(Java1_4Parser.CLOSE_BRACKET); } + public TerminalNode CLOSE_BRACKET(int i) { + return getToken(Java1_4Parser.CLOSE_BRACKET, i); + } + public DimsContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_dims; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitDims(this); + else return visitor.visitChildren(this); + } + } + + public final DimsContext dims() throws RecognitionException { + DimsContext _localctx = new DimsContext(_ctx, getState()); + enterRule(_localctx, 10, RULE_dims); + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(209); + _errHandler.sync(this); + _alt = 1; + do { + switch (_alt) { + case 1: + { + { + setState(207); + match(OPEN_BRACKET); + setState(208); + match(CLOSE_BRACKET); + } + } + break; + default: + throw new NoViableAltException(this); + } + setState(211); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,3,_ctx); + } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ExpressionContext extends ParserRuleContext { + public List expression1() { + return getRuleContexts(Expression1Context.class); + } + public Expression1Context expression1(int i) { + return getRuleContext(Expression1Context.class,i); + } + public AssignmentOperatorContext assignmentOperator() { + return getRuleContext(AssignmentOperatorContext.class,0); + } + public ExpressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_expression; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitExpression(this); + else return visitor.visitChildren(this); + } + } + + public final ExpressionContext expression() throws RecognitionException { + ExpressionContext _localctx = new ExpressionContext(_ctx, getState()); + enterRule(_localctx, 12, RULE_expression); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(213); + expression1(); + setState(217); + _errHandler.sync(this); + _la = _input.LA(1); + if (((((_la - 59)) & ~0x3f) == 0 && ((1L << (_la - 59)) & 34342961153L) != 0)) { + { + setState(214); + assignmentOperator(); + setState(215); + expression1(); + } + } + + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class AssignmentOperatorContext extends ParserRuleContext { + public TerminalNode EQUALS() { return getToken(Java1_4Parser.EQUALS, 0); } + public TerminalNode PLUS_EQUALS() { return getToken(Java1_4Parser.PLUS_EQUALS, 0); } + public TerminalNode MINUS_EQUALS() { return getToken(Java1_4Parser.MINUS_EQUALS, 0); } + public TerminalNode ASTERISK_EQUALS() { return getToken(Java1_4Parser.ASTERISK_EQUALS, 0); } + public TerminalNode SLASH_EQUALS() { return getToken(Java1_4Parser.SLASH_EQUALS, 0); } + public TerminalNode AMPERSAND_EQUALS() { return getToken(Java1_4Parser.AMPERSAND_EQUALS, 0); } + public TerminalNode PIPE_EQUALS() { return getToken(Java1_4Parser.PIPE_EQUALS, 0); } + public TerminalNode CARET_EQUALS() { return getToken(Java1_4Parser.CARET_EQUALS, 0); } + public TerminalNode PERCENT_EQUALS() { return getToken(Java1_4Parser.PERCENT_EQUALS, 0); } + public TerminalNode DOUBLE_LESS_THAN_EQUALS() { return getToken(Java1_4Parser.DOUBLE_LESS_THAN_EQUALS, 0); } + public TerminalNode DOUBLE_GREATER_THAN_EQUALS() { return getToken(Java1_4Parser.DOUBLE_GREATER_THAN_EQUALS, 0); } + public TerminalNode TRIPLE_GREATER_THAN_EQUALS() { return getToken(Java1_4Parser.TRIPLE_GREATER_THAN_EQUALS, 0); } + public AssignmentOperatorContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_assignmentOperator; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitAssignmentOperator(this); + else return visitor.visitChildren(this); + } + } + + public final AssignmentOperatorContext assignmentOperator() throws RecognitionException { + AssignmentOperatorContext _localctx = new AssignmentOperatorContext(_ctx, getState()); + enterRule(_localctx, 14, RULE_assignmentOperator); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(219); + _la = _input.LA(1); + if ( !(((((_la - 59)) & ~0x3f) == 0 && ((1L << (_la - 59)) & 34342961153L) != 0)) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Expression1Context extends ParserRuleContext { + public Expression2Context expression2() { + return getRuleContext(Expression2Context.class,0); + } + public Expression1RestContext expression1Rest() { + return getRuleContext(Expression1RestContext.class,0); + } + public Expression1Context(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_expression1; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitExpression1(this); + else return visitor.visitChildren(this); + } + } + + public final Expression1Context expression1() throws RecognitionException { + Expression1Context _localctx = new Expression1Context(_ctx, getState()); + enterRule(_localctx, 16, RULE_expression1); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(221); + expression2(); + setState(223); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==QUESTION) { + { + setState(222); + expression1Rest(); + } + } + + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Expression1RestContext extends ParserRuleContext { + public TerminalNode QUESTION() { return getToken(Java1_4Parser.QUESTION, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public TerminalNode COLON() { return getToken(Java1_4Parser.COLON, 0); } + public Expression1Context expression1() { + return getRuleContext(Expression1Context.class,0); + } + public Expression1RestContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_expression1Rest; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitExpression1Rest(this); + else return visitor.visitChildren(this); + } + } + + public final Expression1RestContext expression1Rest() throws RecognitionException { + Expression1RestContext _localctx = new Expression1RestContext(_ctx, getState()); + enterRule(_localctx, 18, RULE_expression1Rest); + try { + enterOuterAlt(_localctx, 1); + { + setState(225); + match(QUESTION); + setState(226); + expression(); + setState(227); + match(COLON); + setState(228); + expression1(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Expression2Context extends ParserRuleContext { + public Expression3Context expression3() { + return getRuleContext(Expression3Context.class,0); + } + public Expression2RestContext expression2Rest() { + return getRuleContext(Expression2RestContext.class,0); + } + public Expression2Context(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_expression2; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitExpression2(this); + else return visitor.visitChildren(this); + } + } + + public final Expression2Context expression2() throws RecognitionException { + Expression2Context _localctx = new Expression2Context(_ctx, getState()); + enterRule(_localctx, 20, RULE_expression2); + try { + enterOuterAlt(_localctx, 1); + { + setState(230); + expression3(); + setState(231); + expression2Rest(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Expression2RestContext extends ParserRuleContext { + public List infixOp() { + return getRuleContexts(InfixOpContext.class); + } + public InfixOpContext infixOp(int i) { + return getRuleContext(InfixOpContext.class,i); + } + public List expression3() { + return getRuleContexts(Expression3Context.class); + } + public Expression3Context expression3(int i) { + return getRuleContext(Expression3Context.class,i); + } + public TerminalNode INSTANCEOF() { return getToken(Java1_4Parser.INSTANCEOF, 0); } + public TypeContext type() { + return getRuleContext(TypeContext.class,0); + } + public Expression2RestContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_expression2Rest; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitExpression2Rest(this); + else return visitor.visitChildren(this); + } + } + + public final Expression2RestContext expression2Rest() throws RecognitionException { + Expression2RestContext _localctx = new Expression2RestContext(_ctx, getState()); + enterRule(_localctx, 22, RULE_expression2Rest); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(238); + _errHandler.sync(this); + _la = _input.LA(1); + while (((((_la - 60)) & ~0x3f) == 0 && ((1L << (_la - 60)) & 8388127L) != 0)) { + { + { + setState(233); + infixOp(); + setState(234); + expression3(); + } + } + setState(240); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(243); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==INSTANCEOF) { + { + setState(241); + match(INSTANCEOF); + setState(242); + type(); + } + } + + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class InfixOpContext extends ParserRuleContext { + public TerminalNode DOUBLE_PIPE() { return getToken(Java1_4Parser.DOUBLE_PIPE, 0); } + public TerminalNode DOUBLE_AMPERSAND() { return getToken(Java1_4Parser.DOUBLE_AMPERSAND, 0); } + public TerminalNode PIPE() { return getToken(Java1_4Parser.PIPE, 0); } + public TerminalNode CARET() { return getToken(Java1_4Parser.CARET, 0); } + public TerminalNode AMPERSAND() { return getToken(Java1_4Parser.AMPERSAND, 0); } + public TerminalNode DOUBLE_EQUALS() { return getToken(Java1_4Parser.DOUBLE_EQUALS, 0); } + public TerminalNode EXCLAMATION_EQUALS() { return getToken(Java1_4Parser.EXCLAMATION_EQUALS, 0); } + public TerminalNode LESS_THAN() { return getToken(Java1_4Parser.LESS_THAN, 0); } + public TerminalNode GREATER_THAN() { return getToken(Java1_4Parser.GREATER_THAN, 0); } + public TerminalNode LESS_THAN_OR_EQUALS() { return getToken(Java1_4Parser.LESS_THAN_OR_EQUALS, 0); } + public TerminalNode GREATER_THAN_OR_EQUALS() { return getToken(Java1_4Parser.GREATER_THAN_OR_EQUALS, 0); } + public TerminalNode DOUBLE_LESS_THAN() { return getToken(Java1_4Parser.DOUBLE_LESS_THAN, 0); } + public TerminalNode DOUBLE_GREATER_THAN() { return getToken(Java1_4Parser.DOUBLE_GREATER_THAN, 0); } + public TerminalNode TRIPLE_GREATER_THAN() { return getToken(Java1_4Parser.TRIPLE_GREATER_THAN, 0); } + public TerminalNode PLUS() { return getToken(Java1_4Parser.PLUS, 0); } + public TerminalNode MINUS() { return getToken(Java1_4Parser.MINUS, 0); } + public TerminalNode ASTERISK() { return getToken(Java1_4Parser.ASTERISK, 0); } + public TerminalNode SLASH() { return getToken(Java1_4Parser.SLASH, 0); } + public TerminalNode PERCENT() { return getToken(Java1_4Parser.PERCENT, 0); } + public InfixOpContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_infixOp; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitInfixOp(this); + else return visitor.visitChildren(this); + } + } + + public final InfixOpContext infixOp() throws RecognitionException { + InfixOpContext _localctx = new InfixOpContext(_ctx, getState()); + enterRule(_localctx, 24, RULE_infixOp); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(245); + _la = _input.LA(1); + if ( !(((((_la - 60)) & ~0x3f) == 0 && ((1L << (_la - 60)) & 8388127L) != 0)) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Expression3Context extends ParserRuleContext { + public PrefixOpContext prefixOp() { + return getRuleContext(PrefixOpContext.class,0); + } + public Expression3Context expression3() { + return getRuleContext(Expression3Context.class,0); + } + public TerminalNode OPEN_PARENTHESIS() { return getToken(Java1_4Parser.OPEN_PARENTHESIS, 0); } + public TerminalNode CLOSE_PARENTHESIS() { return getToken(Java1_4Parser.CLOSE_PARENTHESIS, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public TypeContext type() { + return getRuleContext(TypeContext.class,0); + } + public PrimaryContext primary() { + return getRuleContext(PrimaryContext.class,0); + } + public List selector() { + return getRuleContexts(SelectorContext.class); + } + public SelectorContext selector(int i) { + return getRuleContext(SelectorContext.class,i); + } + public List postfixOp() { + return getRuleContexts(PostfixOpContext.class); + } + public PostfixOpContext postfixOp(int i) { + return getRuleContext(PostfixOpContext.class,i); + } + public Expression3Context(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_expression3; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitExpression3(this); + else return visitor.visitChildren(this); + } + } + + public final Expression3Context expression3() throws RecognitionException { + Expression3Context _localctx = new Expression3Context(_ctx, getState()); + enterRule(_localctx, 26, RULE_expression3); + int _la; + try { + setState(271); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,11,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(247); + prefixOp(); + setState(248); + expression3(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(250); + match(OPEN_PARENTHESIS); + setState(253); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,8,_ctx) ) { + case 1: + { + setState(251); + expression(); + } + break; + case 2: + { + setState(252); + type(); + } + break; + } + setState(255); + match(CLOSE_PARENTHESIS); + setState(256); + expression3(); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(258); + primary(); + setState(262); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==PERIOD || _la==OPEN_BRACKET) { + { + { + setState(259); + selector(); + } + } + setState(264); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(268); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==DOUBLE_PLUS || _la==DOUBLE_MINUS) { + { + { + setState(265); + postfixOp(); + } + } + setState(270); + _errHandler.sync(this); + _la = _input.LA(1); + } + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class PrefixOpContext extends ParserRuleContext { + public TerminalNode DOUBLE_PLUS() { return getToken(Java1_4Parser.DOUBLE_PLUS, 0); } + public TerminalNode DOUBLE_MINUS() { return getToken(Java1_4Parser.DOUBLE_MINUS, 0); } + public TerminalNode EXCLAMATION() { return getToken(Java1_4Parser.EXCLAMATION, 0); } + public TerminalNode TILDE() { return getToken(Java1_4Parser.TILDE, 0); } + public TerminalNode PLUS() { return getToken(Java1_4Parser.PLUS, 0); } + public TerminalNode MINUS() { return getToken(Java1_4Parser.MINUS, 0); } + public PrefixOpContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_prefixOp; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitPrefixOp(this); + else return visitor.visitChildren(this); + } + } + + public final PrefixOpContext prefixOp() throws RecognitionException { + PrefixOpContext _localctx = new PrefixOpContext(_ctx, getState()); + enterRule(_localctx, 28, RULE_prefixOp); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(273); + _la = _input.LA(1); + if ( !(((((_la - 60)) & ~0x3f) == 0 && ((1L << (_la - 60)) & 483L) != 0)) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class PostfixOpContext extends ParserRuleContext { + public TerminalNode DOUBLE_PLUS() { return getToken(Java1_4Parser.DOUBLE_PLUS, 0); } + public TerminalNode DOUBLE_MINUS() { return getToken(Java1_4Parser.DOUBLE_MINUS, 0); } + public PostfixOpContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_postfixOp; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitPostfixOp(this); + else return visitor.visitChildren(this); + } + } + + public final PostfixOpContext postfixOp() throws RecognitionException { + PostfixOpContext _localctx = new PostfixOpContext(_ctx, getState()); + enterRule(_localctx, 30, RULE_postfixOp); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(275); + _la = _input.LA(1); + if ( !(_la==DOUBLE_PLUS || _la==DOUBLE_MINUS) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class PrimaryContext extends ParserRuleContext { + public ParenthesizedExpressionContext parenthesizedExpression() { + return getRuleContext(ParenthesizedExpressionContext.class,0); + } + public TerminalNode THIS() { return getToken(Java1_4Parser.THIS, 0); } + public ArgumentsContext arguments() { + return getRuleContext(ArgumentsContext.class,0); + } + public TerminalNode SUPER() { return getToken(Java1_4Parser.SUPER, 0); } + public SuperSuffixContext superSuffix() { + return getRuleContext(SuperSuffixContext.class,0); + } + public LiteralContext literal() { + return getRuleContext(LiteralContext.class,0); + } + public TerminalNode NEW() { return getToken(Java1_4Parser.NEW, 0); } + public CreatorContext creator() { + return getRuleContext(CreatorContext.class,0); + } + public QualifiedIdentifierContext qualifiedIdentifier() { + return getRuleContext(QualifiedIdentifierContext.class,0); + } + public IdentifierSuffixContext identifierSuffix() { + return getRuleContext(IdentifierSuffixContext.class,0); + } + public BasicTypeContext basicType() { + return getRuleContext(BasicTypeContext.class,0); + } + public TerminalNode PERIOD() { return getToken(Java1_4Parser.PERIOD, 0); } + public TerminalNode CLASS() { return getToken(Java1_4Parser.CLASS, 0); } + public DimsContext dims() { + return getRuleContext(DimsContext.class,0); + } + public TerminalNode VOID() { return getToken(Java1_4Parser.VOID, 0); } + public PrimaryContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_primary; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitPrimary(this); + else return visitor.visitChildren(this); + } + } + + public final PrimaryContext primary() throws RecognitionException { + PrimaryContext _localctx = new PrimaryContext(_ctx, getState()); + enterRule(_localctx, 32, RULE_primary); + int _la; + try { + setState(301); + _errHandler.sync(this); + switch (_input.LA(1)) { + case OPEN_PARENTHESIS: + enterOuterAlt(_localctx, 1); + { + setState(277); + parenthesizedExpression(); + } + break; + case THIS: + enterOuterAlt(_localctx, 2); + { + setState(278); + match(THIS); + setState(280); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==OPEN_PARENTHESIS) { + { + setState(279); + arguments(); + } + } + + } + break; + case SUPER: + enterOuterAlt(_localctx, 3); + { + setState(282); + match(SUPER); + setState(283); + superSuffix(); + } + break; + case IntegerLiteral: + case FloatingPointLiteral: + case CharacterLiteral: + case StringLiteral: + case BooleanLiteral: + case NullLiteral: + enterOuterAlt(_localctx, 4); + { + setState(284); + literal(); + } + break; + case NEW: + enterOuterAlt(_localctx, 5); + { + setState(285); + match(NEW); + setState(286); + creator(); + } + break; + case Identifier: + enterOuterAlt(_localctx, 6); + { + setState(287); + qualifiedIdentifier(); + setState(289); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,13,_ctx) ) { + case 1: + { + setState(288); + identifierSuffix(); + } + break; + } + } + break; + case BOOLEAN: + case BYTE: + case CHAR: + case DOUBLE: + case FLOAT: + case INT: + case LONG: + case SHORT: + enterOuterAlt(_localctx, 7); + { + setState(291); + basicType(); + setState(293); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==OPEN_BRACKET) { + { + setState(292); + dims(); + } + } + + setState(295); + match(PERIOD); + setState(296); + match(CLASS); + } + break; + case VOID: + enterOuterAlt(_localctx, 8); + { + setState(298); + match(VOID); + setState(299); + match(PERIOD); + setState(300); + match(CLASS); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class IdentifierSuffixContext extends ParserRuleContext { + public ArgumentsContext arguments() { + return getRuleContext(ArgumentsContext.class,0); + } + public TerminalNode PERIOD() { return getToken(Java1_4Parser.PERIOD, 0); } + public TerminalNode CLASS() { return getToken(Java1_4Parser.CLASS, 0); } + public TerminalNode THIS() { return getToken(Java1_4Parser.THIS, 0); } + public TerminalNode SUPER() { return getToken(Java1_4Parser.SUPER, 0); } + public SuperSuffixContext superSuffix() { + return getRuleContext(SuperSuffixContext.class,0); + } + public TerminalNode NEW() { return getToken(Java1_4Parser.NEW, 0); } + public InnerCreatorContext innerCreator() { + return getRuleContext(InnerCreatorContext.class,0); + } + public IdentifierSuffixContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_identifierSuffix; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitIdentifierSuffix(this); + else return visitor.visitChildren(this); + } + } + + public final IdentifierSuffixContext identifierSuffix() throws RecognitionException { + IdentifierSuffixContext _localctx = new IdentifierSuffixContext(_ctx, getState()); + enterRule(_localctx, 34, RULE_identifierSuffix); + try { + setState(313); + _errHandler.sync(this); + switch (_input.LA(1)) { + case OPEN_PARENTHESIS: + enterOuterAlt(_localctx, 1); + { + setState(303); + arguments(); + } + break; + case PERIOD: + enterOuterAlt(_localctx, 2); + { + setState(304); + match(PERIOD); + setState(311); + _errHandler.sync(this); + switch (_input.LA(1)) { + case CLASS: + { + setState(305); + match(CLASS); + } + break; + case THIS: + { + setState(306); + match(THIS); + } + break; + case SUPER: + { + setState(307); + match(SUPER); + { + setState(308); + superSuffix(); + } + } + break; + case NEW: + { + { + setState(309); + match(NEW); + setState(310); + innerCreator(); + } + } + break; + default: + throw new NoViableAltException(this); + } + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class SelectorContext extends ParserRuleContext { + public TerminalNode PERIOD() { return getToken(Java1_4Parser.PERIOD, 0); } + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public ArgumentsContext arguments() { + return getRuleContext(ArgumentsContext.class,0); + } + public TerminalNode THIS() { return getToken(Java1_4Parser.THIS, 0); } + public TerminalNode SUPER() { return getToken(Java1_4Parser.SUPER, 0); } + public SuperSuffixContext superSuffix() { + return getRuleContext(SuperSuffixContext.class,0); + } + public TerminalNode NEW() { return getToken(Java1_4Parser.NEW, 0); } + public InnerCreatorContext innerCreator() { + return getRuleContext(InnerCreatorContext.class,0); + } + public TerminalNode OPEN_BRACKET() { return getToken(Java1_4Parser.OPEN_BRACKET, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public TerminalNode CLOSE_BRACKET() { return getToken(Java1_4Parser.CLOSE_BRACKET, 0); } + public SelectorContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_selector; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitSelector(this); + else return visitor.visitChildren(this); + } + } + + public final SelectorContext selector() throws RecognitionException { + SelectorContext _localctx = new SelectorContext(_ctx, getState()); + enterRule(_localctx, 36, RULE_selector); + int _la; + try { + setState(332); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,19,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(315); + match(PERIOD); + setState(316); + identifier(); + setState(318); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==OPEN_PARENTHESIS) { + { + setState(317); + arguments(); + } + } + + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(320); + match(PERIOD); + setState(321); + match(THIS); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(322); + match(PERIOD); + setState(323); + match(SUPER); + setState(324); + superSuffix(); + } + break; + case 4: + enterOuterAlt(_localctx, 4); + { + setState(325); + match(PERIOD); + setState(326); + match(NEW); + setState(327); + innerCreator(); + } + break; + case 5: + enterOuterAlt(_localctx, 5); + { + setState(328); + match(OPEN_BRACKET); + setState(329); + expression(); + setState(330); + match(CLOSE_BRACKET); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class SuperSuffixContext extends ParserRuleContext { + public ArgumentsContext arguments() { + return getRuleContext(ArgumentsContext.class,0); + } + public TerminalNode PERIOD() { return getToken(Java1_4Parser.PERIOD, 0); } + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public SuperSuffixContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_superSuffix; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitSuperSuffix(this); + else return visitor.visitChildren(this); + } + } + + public final SuperSuffixContext superSuffix() throws RecognitionException { + SuperSuffixContext _localctx = new SuperSuffixContext(_ctx, getState()); + enterRule(_localctx, 38, RULE_superSuffix); + int _la; + try { + setState(340); + _errHandler.sync(this); + switch (_input.LA(1)) { + case OPEN_PARENTHESIS: + enterOuterAlt(_localctx, 1); + { + setState(334); + arguments(); + } + break; + case PERIOD: + enterOuterAlt(_localctx, 2); + { + setState(335); + match(PERIOD); + setState(336); + identifier(); + setState(338); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==OPEN_PARENTHESIS) { + { + setState(337); + arguments(); + } + } + + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ArgumentsContext extends ParserRuleContext { + public TerminalNode OPEN_PARENTHESIS() { return getToken(Java1_4Parser.OPEN_PARENTHESIS, 0); } + public TerminalNode CLOSE_PARENTHESIS() { return getToken(Java1_4Parser.CLOSE_PARENTHESIS, 0); } + public List expression() { + return getRuleContexts(ExpressionContext.class); + } + public ExpressionContext expression(int i) { + return getRuleContext(ExpressionContext.class,i); + } + public List COMMA() { return getTokens(Java1_4Parser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(Java1_4Parser.COMMA, i); + } + public ArgumentsContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_arguments; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitArguments(this); + else return visitor.visitChildren(this); + } + } + + public final ArgumentsContext arguments() throws RecognitionException { + ArgumentsContext _localctx = new ArgumentsContext(_ctx, getState()); + enterRule(_localctx, 40, RULE_arguments); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(342); + match(OPEN_PARENTHESIS); + setState(351); + _errHandler.sync(this); + _la = _input.LA(1); + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 3461052752489357608L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 68182605839L) != 0)) { + { + setState(343); + expression(); + setState(348); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(344); + match(COMMA); + setState(345); + expression(); + } + } + setState(350); + _errHandler.sync(this); + _la = _input.LA(1); + } + } + } + + setState(353); + match(CLOSE_PARENTHESIS); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class CreatorContext extends ParserRuleContext { + public QualifiedIdentifierContext qualifiedIdentifier() { + return getRuleContext(QualifiedIdentifierContext.class,0); + } + public ArrayCreatorRestContext arrayCreatorRest() { + return getRuleContext(ArrayCreatorRestContext.class,0); + } + public ClassCreatorRestContext classCreatorRest() { + return getRuleContext(ClassCreatorRestContext.class,0); + } + public CreatorContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_creator; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitCreator(this); + else return visitor.visitChildren(this); + } + } + + public final CreatorContext creator() throws RecognitionException { + CreatorContext _localctx = new CreatorContext(_ctx, getState()); + enterRule(_localctx, 42, RULE_creator); + try { + enterOuterAlt(_localctx, 1); + { + setState(355); + qualifiedIdentifier(); + setState(358); + _errHandler.sync(this); + switch (_input.LA(1)) { + case OPEN_BRACKET: + { + setState(356); + arrayCreatorRest(); + } + break; + case OPEN_PARENTHESIS: + { + setState(357); + classCreatorRest(); + } + break; + default: + throw new NoViableAltException(this); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class InnerCreatorContext extends ParserRuleContext { + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public ClassCreatorRestContext classCreatorRest() { + return getRuleContext(ClassCreatorRestContext.class,0); + } + public InnerCreatorContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_innerCreator; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitInnerCreator(this); + else return visitor.visitChildren(this); + } + } + + public final InnerCreatorContext innerCreator() throws RecognitionException { + InnerCreatorContext _localctx = new InnerCreatorContext(_ctx, getState()); + enterRule(_localctx, 44, RULE_innerCreator); + try { + enterOuterAlt(_localctx, 1); + { + setState(360); + identifier(); + setState(361); + classCreatorRest(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ArrayCreatorRestContext extends ParserRuleContext { + public List OPEN_BRACKET() { return getTokens(Java1_4Parser.OPEN_BRACKET); } + public TerminalNode OPEN_BRACKET(int i) { + return getToken(Java1_4Parser.OPEN_BRACKET, i); + } + public List CLOSE_BRACKET() { return getTokens(Java1_4Parser.CLOSE_BRACKET); } + public TerminalNode CLOSE_BRACKET(int i) { + return getToken(Java1_4Parser.CLOSE_BRACKET, i); + } + public ArrayInitializerContext arrayInitializer() { + return getRuleContext(ArrayInitializerContext.class,0); + } + public List expression() { + return getRuleContexts(ExpressionContext.class); + } + public ExpressionContext expression(int i) { + return getRuleContext(ExpressionContext.class,i); + } + public DimsContext dims() { + return getRuleContext(DimsContext.class,0); + } + public ArrayCreatorRestContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_arrayCreatorRest; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitArrayCreatorRest(this); + else return visitor.visitChildren(this); + } + } + + public final ArrayCreatorRestContext arrayCreatorRest() throws RecognitionException { + ArrayCreatorRestContext _localctx = new ArrayCreatorRestContext(_ctx, getState()); + enterRule(_localctx, 46, RULE_arrayCreatorRest); + int _la; + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(363); + match(OPEN_BRACKET); + setState(383); + _errHandler.sync(this); + switch (_input.LA(1)) { + case CLOSE_BRACKET: + { + setState(364); + match(CLOSE_BRACKET); + setState(366); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==OPEN_BRACKET) { + { + setState(365); + dims(); + } + } + + setState(368); + arrayInitializer(); + } + break; + case BOOLEAN: + case BYTE: + case CHAR: + case DOUBLE: + case FLOAT: + case INT: + case LONG: + case NEW: + case SHORT: + case SUPER: + case THIS: + case VOID: + case OPEN_PARENTHESIS: + case PLUS: + case MINUS: + case DOUBLE_PLUS: + case DOUBLE_MINUS: + case EXCLAMATION: + case TILDE: + case Identifier: + case IntegerLiteral: + case FloatingPointLiteral: + case CharacterLiteral: + case StringLiteral: + case BooleanLiteral: + case NullLiteral: + { + setState(369); + expression(); + setState(370); + match(CLOSE_BRACKET); + setState(377); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,26,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(371); + match(OPEN_BRACKET); + setState(372); + expression(); + setState(373); + match(CLOSE_BRACKET); + } + } + } + setState(379); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,26,_ctx); + } + setState(381); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,27,_ctx) ) { + case 1: + { + setState(380); + dims(); + } + break; + } + } + break; + default: + throw new NoViableAltException(this); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ClassCreatorRestContext extends ParserRuleContext { + public ArgumentsContext arguments() { + return getRuleContext(ArgumentsContext.class,0); + } + public ClassBodyContext classBody() { + return getRuleContext(ClassBodyContext.class,0); + } + public ClassCreatorRestContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_classCreatorRest; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitClassCreatorRest(this); + else return visitor.visitChildren(this); + } + } + + public final ClassCreatorRestContext classCreatorRest() throws RecognitionException { + ClassCreatorRestContext _localctx = new ClassCreatorRestContext(_ctx, getState()); + enterRule(_localctx, 48, RULE_classCreatorRest); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(385); + arguments(); + setState(387); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==OPEN_BRACE) { + { + setState(386); + classBody(); + } + } + + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ArrayInitializerContext extends ParserRuleContext { + public TerminalNode OPEN_BRACE() { return getToken(Java1_4Parser.OPEN_BRACE, 0); } + public TerminalNode CLOSE_BRACE() { return getToken(Java1_4Parser.CLOSE_BRACE, 0); } + public List variableInitializer() { + return getRuleContexts(VariableInitializerContext.class); + } + public VariableInitializerContext variableInitializer(int i) { + return getRuleContext(VariableInitializerContext.class,i); + } + public List COMMA() { return getTokens(Java1_4Parser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(Java1_4Parser.COMMA, i); + } + public ArrayInitializerContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_arrayInitializer; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitArrayInitializer(this); + else return visitor.visitChildren(this); + } + } + + public final ArrayInitializerContext arrayInitializer() throws RecognitionException { + ArrayInitializerContext _localctx = new ArrayInitializerContext(_ctx, getState()); + enterRule(_localctx, 50, RULE_arrayInitializer); + int _la; + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(389); + match(OPEN_BRACE); + setState(398); + _errHandler.sync(this); + _la = _input.LA(1); + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 3470059951744098600L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 68182605839L) != 0)) { + { + setState(390); + variableInitializer(); + setState(395); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,30,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(391); + match(COMMA); + setState(392); + variableInitializer(); + } + } + } + setState(397); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,30,_ctx); + } + } + } + + setState(401); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==COMMA) { + { + setState(400); + match(COMMA); + } + } + + setState(403); + match(CLOSE_BRACE); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class VariableInitializerContext extends ParserRuleContext { + public ArrayInitializerContext arrayInitializer() { + return getRuleContext(ArrayInitializerContext.class,0); + } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public VariableInitializerContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_variableInitializer; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitVariableInitializer(this); + else return visitor.visitChildren(this); + } + } + + public final VariableInitializerContext variableInitializer() throws RecognitionException { + VariableInitializerContext _localctx = new VariableInitializerContext(_ctx, getState()); + enterRule(_localctx, 52, RULE_variableInitializer); + try { + setState(407); + _errHandler.sync(this); + switch (_input.LA(1)) { + case OPEN_BRACE: + enterOuterAlt(_localctx, 1); + { + setState(405); + arrayInitializer(); + } + break; + case BOOLEAN: + case BYTE: + case CHAR: + case DOUBLE: + case FLOAT: + case INT: + case LONG: + case NEW: + case SHORT: + case SUPER: + case THIS: + case VOID: + case OPEN_PARENTHESIS: + case PLUS: + case MINUS: + case DOUBLE_PLUS: + case DOUBLE_MINUS: + case EXCLAMATION: + case TILDE: + case Identifier: + case IntegerLiteral: + case FloatingPointLiteral: + case CharacterLiteral: + case StringLiteral: + case BooleanLiteral: + case NullLiteral: + enterOuterAlt(_localctx, 2); + { + setState(406); + expression(); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ParenthesizedExpressionContext extends ParserRuleContext { + public TerminalNode OPEN_PARENTHESIS() { return getToken(Java1_4Parser.OPEN_PARENTHESIS, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public TerminalNode CLOSE_PARENTHESIS() { return getToken(Java1_4Parser.CLOSE_PARENTHESIS, 0); } + public ParenthesizedExpressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_parenthesizedExpression; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitParenthesizedExpression(this); + else return visitor.visitChildren(this); + } + } + + public final ParenthesizedExpressionContext parenthesizedExpression() throws RecognitionException { + ParenthesizedExpressionContext _localctx = new ParenthesizedExpressionContext(_ctx, getState()); + enterRule(_localctx, 54, RULE_parenthesizedExpression); + try { + enterOuterAlt(_localctx, 1); + { + setState(409); + match(OPEN_PARENTHESIS); + setState(410); + expression(); + setState(411); + match(CLOSE_PARENTHESIS); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class BlockContext extends ParserRuleContext { + public TerminalNode OPEN_BRACE() { return getToken(Java1_4Parser.OPEN_BRACE, 0); } + public TerminalNode CLOSE_BRACE() { return getToken(Java1_4Parser.CLOSE_BRACE, 0); } + public List blockStatement() { + return getRuleContexts(BlockStatementContext.class); + } + public BlockStatementContext blockStatement(int i) { + return getRuleContext(BlockStatementContext.class,i); + } + public BlockContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_block; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitBlock(this); + else return visitor.visitChildren(this); + } + } + + public final BlockContext block() throws RecognitionException { + BlockContext _localctx = new BlockContext(_ctx, getState()); + enterRule(_localctx, 56, RULE_block); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(413); + match(OPEN_BRACE); + setState(417); + _errHandler.sync(this); + _la = _input.LA(1); + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 3470582064244143934L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 68182605839L) != 0)) { + { + { + setState(414); + blockStatement(); + } + } + setState(419); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(420); + match(CLOSE_BRACE); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class BlockStatementContext extends ParserRuleContext { + public LocalVariableDeclarationStatementContext localVariableDeclarationStatement() { + return getRuleContext(LocalVariableDeclarationStatementContext.class,0); + } + public ClassOrInterfaceDeclarationContext classOrInterfaceDeclaration() { + return getRuleContext(ClassOrInterfaceDeclarationContext.class,0); + } + public StatementContext statement() { + return getRuleContext(StatementContext.class,0); + } + public BlockStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_blockStatement; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitBlockStatement(this); + else return visitor.visitChildren(this); + } + } + + public final BlockStatementContext blockStatement() throws RecognitionException { + BlockStatementContext _localctx = new BlockStatementContext(_ctx, getState()); + enterRule(_localctx, 58, RULE_blockStatement); + try { + setState(425); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,35,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(422); + localVariableDeclarationStatement(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(423); + classOrInterfaceDeclaration(); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(424); + statement(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class LocalVariableDeclarationStatementContext extends ParserRuleContext { + public TypeContext type() { + return getRuleContext(TypeContext.class,0); + } + public VariableDeclaratorsContext variableDeclarators() { + return getRuleContext(VariableDeclaratorsContext.class,0); + } + public TerminalNode SEMICOLON() { return getToken(Java1_4Parser.SEMICOLON, 0); } + public TerminalNode FINAL() { return getToken(Java1_4Parser.FINAL, 0); } + public LocalVariableDeclarationStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_localVariableDeclarationStatement; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitLocalVariableDeclarationStatement(this); + else return visitor.visitChildren(this); + } + } + + public final LocalVariableDeclarationStatementContext localVariableDeclarationStatement() throws RecognitionException { + LocalVariableDeclarationStatementContext _localctx = new LocalVariableDeclarationStatementContext(_ctx, getState()); + enterRule(_localctx, 60, RULE_localVariableDeclarationStatement); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(428); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==FINAL) { + { + setState(427); + match(FINAL); + } + } + + setState(430); + type(); + setState(431); + variableDeclarators(); + setState(432); + match(SEMICOLON); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class StatementContext extends ParserRuleContext { + public BlockContext block() { + return getRuleContext(BlockContext.class,0); + } + public LabeledStatementContext labeledStatement() { + return getRuleContext(LabeledStatementContext.class,0); + } + public IfStatementContext ifStatement() { + return getRuleContext(IfStatementContext.class,0); + } + public ForStatementContext forStatement() { + return getRuleContext(ForStatementContext.class,0); + } + public WhileStatementContext whileStatement() { + return getRuleContext(WhileStatementContext.class,0); + } + public DoStatementContext doStatement() { + return getRuleContext(DoStatementContext.class,0); + } + public TryStatementContext tryStatement() { + return getRuleContext(TryStatementContext.class,0); + } + public SwitchStatementContext switchStatement() { + return getRuleContext(SwitchStatementContext.class,0); + } + public SynchronizedStatementContext synchronizedStatement() { + return getRuleContext(SynchronizedStatementContext.class,0); + } + public ReturnStatementContext returnStatement() { + return getRuleContext(ReturnStatementContext.class,0); + } + public ThrowStatementContext throwStatement() { + return getRuleContext(ThrowStatementContext.class,0); + } + public BreakStatementContext breakStatement() { + return getRuleContext(BreakStatementContext.class,0); + } + public ContinueStatementContext continueStatement() { + return getRuleContext(ContinueStatementContext.class,0); + } + public EmptyStatementContext emptyStatement() { + return getRuleContext(EmptyStatementContext.class,0); + } + public ExpressionStatementContext expressionStatement() { + return getRuleContext(ExpressionStatementContext.class,0); + } + public AssertStatementContext assertStatement() { + return getRuleContext(AssertStatementContext.class,0); + } + public StatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_statement; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitStatement(this); + else return visitor.visitChildren(this); + } + } + + public final StatementContext statement() throws RecognitionException { + StatementContext _localctx = new StatementContext(_ctx, getState()); + enterRule(_localctx, 62, RULE_statement); + try { + setState(450); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,37,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(434); + block(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(435); + labeledStatement(); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(436); + ifStatement(); + } + break; + case 4: + enterOuterAlt(_localctx, 4); + { + setState(437); + forStatement(); + } + break; + case 5: + enterOuterAlt(_localctx, 5); + { + setState(438); + whileStatement(); + } + break; + case 6: + enterOuterAlt(_localctx, 6); + { + setState(439); + doStatement(); + } + break; + case 7: + enterOuterAlt(_localctx, 7); + { + setState(440); + tryStatement(); + } + break; + case 8: + enterOuterAlt(_localctx, 8); + { + setState(441); + switchStatement(); + } + break; + case 9: + enterOuterAlt(_localctx, 9); + { + setState(442); + synchronizedStatement(); + } + break; + case 10: + enterOuterAlt(_localctx, 10); + { + setState(443); + returnStatement(); + } + break; + case 11: + enterOuterAlt(_localctx, 11); + { + setState(444); + throwStatement(); + } + break; + case 12: + enterOuterAlt(_localctx, 12); + { + setState(445); + breakStatement(); + } + break; + case 13: + enterOuterAlt(_localctx, 13); + { + setState(446); + continueStatement(); + } + break; + case 14: + enterOuterAlt(_localctx, 14); + { + setState(447); + emptyStatement(); + } + break; + case 15: + enterOuterAlt(_localctx, 15); + { + setState(448); + expressionStatement(); + } + break; + case 16: + enterOuterAlt(_localctx, 16); + { + setState(449); + assertStatement(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class IfStatementContext extends ParserRuleContext { + public TerminalNode IF() { return getToken(Java1_4Parser.IF, 0); } + public ParenthesizedExpressionContext parenthesizedExpression() { + return getRuleContext(ParenthesizedExpressionContext.class,0); + } + public StatementContext statement() { + return getRuleContext(StatementContext.class,0); + } + public ElseClauseContext elseClause() { + return getRuleContext(ElseClauseContext.class,0); + } + public IfStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_ifStatement; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitIfStatement(this); + else return visitor.visitChildren(this); + } + } + + public final IfStatementContext ifStatement() throws RecognitionException { + IfStatementContext _localctx = new IfStatementContext(_ctx, getState()); + enterRule(_localctx, 64, RULE_ifStatement); + try { + enterOuterAlt(_localctx, 1); + { + setState(452); + match(IF); + setState(453); + parenthesizedExpression(); + setState(454); + statement(); + setState(456); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,38,_ctx) ) { + case 1: + { + setState(455); + elseClause(); + } + break; + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ElseClauseContext extends ParserRuleContext { + public TerminalNode ELSE() { return getToken(Java1_4Parser.ELSE, 0); } + public StatementContext statement() { + return getRuleContext(StatementContext.class,0); + } + public ElseClauseContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_elseClause; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitElseClause(this); + else return visitor.visitChildren(this); + } + } + + public final ElseClauseContext elseClause() throws RecognitionException { + ElseClauseContext _localctx = new ElseClauseContext(_ctx, getState()); + enterRule(_localctx, 66, RULE_elseClause); + try { + enterOuterAlt(_localctx, 1); + { + setState(458); + match(ELSE); + setState(459); + statement(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ForStatementContext extends ParserRuleContext { + public TerminalNode FOR() { return getToken(Java1_4Parser.FOR, 0); } + public TerminalNode OPEN_PARENTHESIS() { return getToken(Java1_4Parser.OPEN_PARENTHESIS, 0); } + public List SEMICOLON() { return getTokens(Java1_4Parser.SEMICOLON); } + public TerminalNode SEMICOLON(int i) { + return getToken(Java1_4Parser.SEMICOLON, i); + } + public TerminalNode CLOSE_PARENTHESIS() { return getToken(Java1_4Parser.CLOSE_PARENTHESIS, 0); } + public StatementContext statement() { + return getRuleContext(StatementContext.class,0); + } + public ForInitContext forInit() { + return getRuleContext(ForInitContext.class,0); + } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public ForUpdateContext forUpdate() { + return getRuleContext(ForUpdateContext.class,0); + } + public ForStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_forStatement; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitForStatement(this); + else return visitor.visitChildren(this); + } + } + + public final ForStatementContext forStatement() throws RecognitionException { + ForStatementContext _localctx = new ForStatementContext(_ctx, getState()); + enterRule(_localctx, 68, RULE_forStatement); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(461); + match(FOR); + setState(462); + match(OPEN_PARENTHESIS); + setState(464); + _errHandler.sync(this); + _la = _input.LA(1); + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 3461052752489423144L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 68182605839L) != 0)) { + { + setState(463); + forInit(); + } + } + + setState(466); + match(SEMICOLON); + setState(468); + _errHandler.sync(this); + _la = _input.LA(1); + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 3461052752489357608L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 68182605839L) != 0)) { + { + setState(467); + expression(); + } + } + + setState(470); + match(SEMICOLON); + setState(472); + _errHandler.sync(this); + _la = _input.LA(1); + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 3461052752489357608L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 68182605839L) != 0)) { + { + setState(471); + forUpdate(); + } + } + + setState(474); + match(CLOSE_PARENTHESIS); + setState(475); + statement(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class WhileStatementContext extends ParserRuleContext { + public TerminalNode WHILE() { return getToken(Java1_4Parser.WHILE, 0); } + public ParenthesizedExpressionContext parenthesizedExpression() { + return getRuleContext(ParenthesizedExpressionContext.class,0); + } + public StatementContext statement() { + return getRuleContext(StatementContext.class,0); + } + public WhileStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_whileStatement; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitWhileStatement(this); + else return visitor.visitChildren(this); + } + } + + public final WhileStatementContext whileStatement() throws RecognitionException { + WhileStatementContext _localctx = new WhileStatementContext(_ctx, getState()); + enterRule(_localctx, 70, RULE_whileStatement); + try { + enterOuterAlt(_localctx, 1); + { + setState(477); + match(WHILE); + setState(478); + parenthesizedExpression(); + setState(479); + statement(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class DoStatementContext extends ParserRuleContext { + public TerminalNode DO() { return getToken(Java1_4Parser.DO, 0); } + public StatementContext statement() { + return getRuleContext(StatementContext.class,0); + } + public TerminalNode WHILE() { return getToken(Java1_4Parser.WHILE, 0); } + public ParenthesizedExpressionContext parenthesizedExpression() { + return getRuleContext(ParenthesizedExpressionContext.class,0); + } + public TerminalNode SEMICOLON() { return getToken(Java1_4Parser.SEMICOLON, 0); } + public DoStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_doStatement; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitDoStatement(this); + else return visitor.visitChildren(this); + } + } + + public final DoStatementContext doStatement() throws RecognitionException { + DoStatementContext _localctx = new DoStatementContext(_ctx, getState()); + enterRule(_localctx, 72, RULE_doStatement); + try { + enterOuterAlt(_localctx, 1); + { + setState(481); + match(DO); + setState(482); + statement(); + setState(483); + match(WHILE); + setState(484); + parenthesizedExpression(); + setState(485); + match(SEMICOLON); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class TryStatementContext extends ParserRuleContext { + public TerminalNode TRY() { return getToken(Java1_4Parser.TRY, 0); } + public BlockContext block() { + return getRuleContext(BlockContext.class,0); + } + public CatchesContext catches() { + return getRuleContext(CatchesContext.class,0); + } + public FinallyClauseContext finallyClause() { + return getRuleContext(FinallyClauseContext.class,0); + } + public TryStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_tryStatement; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitTryStatement(this); + else return visitor.visitChildren(this); + } + } + + public final TryStatementContext tryStatement() throws RecognitionException { + TryStatementContext _localctx = new TryStatementContext(_ctx, getState()); + enterRule(_localctx, 74, RULE_tryStatement); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(487); + match(TRY); + setState(488); + block(); + setState(494); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,43,_ctx) ) { + case 1: + { + setState(489); + catches(); + } + break; + case 2: + { + { + setState(491); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==CATCH) { + { + setState(490); + catches(); + } + } + + setState(493); + finallyClause(); + } + } + break; + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class SwitchStatementContext extends ParserRuleContext { + public TerminalNode SWITCH() { return getToken(Java1_4Parser.SWITCH, 0); } + public ParenthesizedExpressionContext parenthesizedExpression() { + return getRuleContext(ParenthesizedExpressionContext.class,0); + } + public TerminalNode OPEN_BRACE() { return getToken(Java1_4Parser.OPEN_BRACE, 0); } + public TerminalNode CLOSE_BRACE() { return getToken(Java1_4Parser.CLOSE_BRACE, 0); } + public List switchBlockStatementGroup() { + return getRuleContexts(SwitchBlockStatementGroupContext.class); + } + public SwitchBlockStatementGroupContext switchBlockStatementGroup(int i) { + return getRuleContext(SwitchBlockStatementGroupContext.class,i); + } + public List switchLabel() { + return getRuleContexts(SwitchLabelContext.class); + } + public SwitchLabelContext switchLabel(int i) { + return getRuleContext(SwitchLabelContext.class,i); + } + public SwitchStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_switchStatement; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitSwitchStatement(this); + else return visitor.visitChildren(this); + } + } + + public final SwitchStatementContext switchStatement() throws RecognitionException { + SwitchStatementContext _localctx = new SwitchStatementContext(_ctx, getState()); + enterRule(_localctx, 76, RULE_switchStatement); + int _la; + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(496); + match(SWITCH); + setState(497); + parenthesizedExpression(); + setState(498); + match(OPEN_BRACE); + setState(502); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,44,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(499); + switchBlockStatementGroup(); + } + } + } + setState(504); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,44,_ctx); + } + setState(508); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==CASE || _la==DEFAULT) { + { + { + setState(505); + switchLabel(); + } + } + setState(510); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(511); + match(CLOSE_BRACE); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class SynchronizedStatementContext extends ParserRuleContext { + public TerminalNode SYNCHRONIZED() { return getToken(Java1_4Parser.SYNCHRONIZED, 0); } + public ParenthesizedExpressionContext parenthesizedExpression() { + return getRuleContext(ParenthesizedExpressionContext.class,0); + } + public BlockContext block() { + return getRuleContext(BlockContext.class,0); + } + public SynchronizedStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_synchronizedStatement; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitSynchronizedStatement(this); + else return visitor.visitChildren(this); + } + } + + public final SynchronizedStatementContext synchronizedStatement() throws RecognitionException { + SynchronizedStatementContext _localctx = new SynchronizedStatementContext(_ctx, getState()); + enterRule(_localctx, 78, RULE_synchronizedStatement); + try { + enterOuterAlt(_localctx, 1); + { + setState(513); + match(SYNCHRONIZED); + setState(514); + parenthesizedExpression(); + setState(515); + block(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ReturnStatementContext extends ParserRuleContext { + public TerminalNode RETURN() { return getToken(Java1_4Parser.RETURN, 0); } + public TerminalNode SEMICOLON() { return getToken(Java1_4Parser.SEMICOLON, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public ReturnStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_returnStatement; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitReturnStatement(this); + else return visitor.visitChildren(this); + } + } + + public final ReturnStatementContext returnStatement() throws RecognitionException { + ReturnStatementContext _localctx = new ReturnStatementContext(_ctx, getState()); + enterRule(_localctx, 80, RULE_returnStatement); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(517); + match(RETURN); + setState(519); + _errHandler.sync(this); + _la = _input.LA(1); + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 3461052752489357608L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 68182605839L) != 0)) { + { + setState(518); + expression(); + } + } + + setState(521); + match(SEMICOLON); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ThrowStatementContext extends ParserRuleContext { + public TerminalNode THROW() { return getToken(Java1_4Parser.THROW, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public TerminalNode SEMICOLON() { return getToken(Java1_4Parser.SEMICOLON, 0); } + public ThrowStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_throwStatement; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitThrowStatement(this); + else return visitor.visitChildren(this); + } + } + + public final ThrowStatementContext throwStatement() throws RecognitionException { + ThrowStatementContext _localctx = new ThrowStatementContext(_ctx, getState()); + enterRule(_localctx, 82, RULE_throwStatement); + try { + enterOuterAlt(_localctx, 1); + { + setState(523); + match(THROW); + setState(524); + expression(); + setState(525); + match(SEMICOLON); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class BreakStatementContext extends ParserRuleContext { + public TerminalNode BREAK() { return getToken(Java1_4Parser.BREAK, 0); } + public TerminalNode SEMICOLON() { return getToken(Java1_4Parser.SEMICOLON, 0); } + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public BreakStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_breakStatement; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitBreakStatement(this); + else return visitor.visitChildren(this); + } + } + + public final BreakStatementContext breakStatement() throws RecognitionException { + BreakStatementContext _localctx = new BreakStatementContext(_ctx, getState()); + enterRule(_localctx, 84, RULE_breakStatement); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(527); + match(BREAK); + setState(529); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==Identifier) { + { + setState(528); + identifier(); + } + } + + setState(531); + match(SEMICOLON); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ContinueStatementContext extends ParserRuleContext { + public TerminalNode CONTINUE() { return getToken(Java1_4Parser.CONTINUE, 0); } + public TerminalNode SEMICOLON() { return getToken(Java1_4Parser.SEMICOLON, 0); } + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public ContinueStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_continueStatement; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitContinueStatement(this); + else return visitor.visitChildren(this); + } + } + + public final ContinueStatementContext continueStatement() throws RecognitionException { + ContinueStatementContext _localctx = new ContinueStatementContext(_ctx, getState()); + enterRule(_localctx, 86, RULE_continueStatement); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(533); + match(CONTINUE); + setState(535); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==Identifier) { + { + setState(534); + identifier(); + } + } + + setState(537); + match(SEMICOLON); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class EmptyStatementContext extends ParserRuleContext { + public TerminalNode SEMICOLON() { return getToken(Java1_4Parser.SEMICOLON, 0); } + public EmptyStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_emptyStatement; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitEmptyStatement(this); + else return visitor.visitChildren(this); + } + } + + public final EmptyStatementContext emptyStatement() throws RecognitionException { + EmptyStatementContext _localctx = new EmptyStatementContext(_ctx, getState()); + enterRule(_localctx, 88, RULE_emptyStatement); + try { + enterOuterAlt(_localctx, 1); + { + setState(539); + match(SEMICOLON); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ExpressionStatementContext extends ParserRuleContext { + public StatementExpressionContext statementExpression() { + return getRuleContext(StatementExpressionContext.class,0); + } + public TerminalNode SEMICOLON() { return getToken(Java1_4Parser.SEMICOLON, 0); } + public ExpressionStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_expressionStatement; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitExpressionStatement(this); + else return visitor.visitChildren(this); + } + } + + public final ExpressionStatementContext expressionStatement() throws RecognitionException { + ExpressionStatementContext _localctx = new ExpressionStatementContext(_ctx, getState()); + enterRule(_localctx, 90, RULE_expressionStatement); + try { + enterOuterAlt(_localctx, 1); + { + setState(541); + statementExpression(); + setState(542); + match(SEMICOLON); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class AssertStatementContext extends ParserRuleContext { + public TerminalNode ASSERT() { return getToken(Java1_4Parser.ASSERT, 0); } + public List expression() { + return getRuleContexts(ExpressionContext.class); + } + public ExpressionContext expression(int i) { + return getRuleContext(ExpressionContext.class,i); + } + public TerminalNode SEMICOLON() { return getToken(Java1_4Parser.SEMICOLON, 0); } + public TerminalNode COLON() { return getToken(Java1_4Parser.COLON, 0); } + public AssertStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_assertStatement; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitAssertStatement(this); + else return visitor.visitChildren(this); + } + } + + public final AssertStatementContext assertStatement() throws RecognitionException { + AssertStatementContext _localctx = new AssertStatementContext(_ctx, getState()); + enterRule(_localctx, 92, RULE_assertStatement); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(544); + match(ASSERT); + setState(545); + expression(); + setState(548); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==COLON) { + { + setState(546); + match(COLON); + setState(547); + expression(); + } + } + + setState(550); + match(SEMICOLON); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class LabeledStatementContext extends ParserRuleContext { + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public TerminalNode COLON() { return getToken(Java1_4Parser.COLON, 0); } + public StatementContext statement() { + return getRuleContext(StatementContext.class,0); + } + public LabeledStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_labeledStatement; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitLabeledStatement(this); + else return visitor.visitChildren(this); + } + } + + public final LabeledStatementContext labeledStatement() throws RecognitionException { + LabeledStatementContext _localctx = new LabeledStatementContext(_ctx, getState()); + enterRule(_localctx, 94, RULE_labeledStatement); + try { + enterOuterAlt(_localctx, 1); + { + setState(552); + identifier(); + setState(553); + match(COLON); + setState(554); + statement(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class StatementExpressionContext extends ParserRuleContext { + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public StatementExpressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_statementExpression; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitStatementExpression(this); + else return visitor.visitChildren(this); + } + } + + public final StatementExpressionContext statementExpression() throws RecognitionException { + StatementExpressionContext _localctx = new StatementExpressionContext(_ctx, getState()); + enterRule(_localctx, 96, RULE_statementExpression); + try { + enterOuterAlt(_localctx, 1); + { + setState(556); + expression(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ConstantExpressionContext extends ParserRuleContext { + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public ConstantExpressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_constantExpression; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitConstantExpression(this); + else return visitor.visitChildren(this); + } + } + + public final ConstantExpressionContext constantExpression() throws RecognitionException { + ConstantExpressionContext _localctx = new ConstantExpressionContext(_ctx, getState()); + enterRule(_localctx, 98, RULE_constantExpression); + try { + enterOuterAlt(_localctx, 1); + { + setState(558); + expression(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class CatchesContext extends ParserRuleContext { + public List catchClause() { + return getRuleContexts(CatchClauseContext.class); + } + public CatchClauseContext catchClause(int i) { + return getRuleContext(CatchClauseContext.class,i); + } + public CatchesContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_catches; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitCatches(this); + else return visitor.visitChildren(this); + } + } + + public final CatchesContext catches() throws RecognitionException { + CatchesContext _localctx = new CatchesContext(_ctx, getState()); + enterRule(_localctx, 100, RULE_catches); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(561); + _errHandler.sync(this); + _la = _input.LA(1); + do { + { + { + setState(560); + catchClause(); + } + } + setState(563); + _errHandler.sync(this); + _la = _input.LA(1); + } while ( _la==CATCH ); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class CatchClauseContext extends ParserRuleContext { + public TerminalNode CATCH() { return getToken(Java1_4Parser.CATCH, 0); } + public TerminalNode OPEN_PARENTHESIS() { return getToken(Java1_4Parser.OPEN_PARENTHESIS, 0); } + public FormalParameterContext formalParameter() { + return getRuleContext(FormalParameterContext.class,0); + } + public TerminalNode CLOSE_PARENTHESIS() { return getToken(Java1_4Parser.CLOSE_PARENTHESIS, 0); } + public BlockContext block() { + return getRuleContext(BlockContext.class,0); + } + public CatchClauseContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_catchClause; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitCatchClause(this); + else return visitor.visitChildren(this); + } + } + + public final CatchClauseContext catchClause() throws RecognitionException { + CatchClauseContext _localctx = new CatchClauseContext(_ctx, getState()); + enterRule(_localctx, 102, RULE_catchClause); + try { + enterOuterAlt(_localctx, 1); + { + setState(565); + match(CATCH); + setState(566); + match(OPEN_PARENTHESIS); + setState(567); + formalParameter(); + setState(568); + match(CLOSE_PARENTHESIS); + setState(569); + block(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class FinallyClauseContext extends ParserRuleContext { + public TerminalNode FINALLY() { return getToken(Java1_4Parser.FINALLY, 0); } + public BlockContext block() { + return getRuleContext(BlockContext.class,0); + } + public FinallyClauseContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_finallyClause; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitFinallyClause(this); + else return visitor.visitChildren(this); + } + } + + public final FinallyClauseContext finallyClause() throws RecognitionException { + FinallyClauseContext _localctx = new FinallyClauseContext(_ctx, getState()); + enterRule(_localctx, 104, RULE_finallyClause); + try { + enterOuterAlt(_localctx, 1); + { + setState(571); + match(FINALLY); + setState(572); + block(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class SwitchBlockStatementGroupContext extends ParserRuleContext { + public List switchLabel() { + return getRuleContexts(SwitchLabelContext.class); + } + public SwitchLabelContext switchLabel(int i) { + return getRuleContext(SwitchLabelContext.class,i); + } + public List blockStatement() { + return getRuleContexts(BlockStatementContext.class); + } + public BlockStatementContext blockStatement(int i) { + return getRuleContext(BlockStatementContext.class,i); + } + public SwitchBlockStatementGroupContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_switchBlockStatementGroup; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitSwitchBlockStatementGroup(this); + else return visitor.visitChildren(this); + } + } + + public final SwitchBlockStatementGroupContext switchBlockStatementGroup() throws RecognitionException { + SwitchBlockStatementGroupContext _localctx = new SwitchBlockStatementGroupContext(_ctx, getState()); + enterRule(_localctx, 106, RULE_switchBlockStatementGroup); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(575); + _errHandler.sync(this); + _la = _input.LA(1); + do { + { + { + setState(574); + switchLabel(); + } + } + setState(577); + _errHandler.sync(this); + _la = _input.LA(1); + } while ( _la==CASE || _la==DEFAULT ); + setState(580); + _errHandler.sync(this); + _la = _input.LA(1); + do { + { + { + setState(579); + blockStatement(); + } + } + setState(582); + _errHandler.sync(this); + _la = _input.LA(1); + } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & 3470582064244143934L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 68182605839L) != 0) ); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class SwitchLabelContext extends ParserRuleContext { + public TerminalNode CASE() { return getToken(Java1_4Parser.CASE, 0); } + public ConstantExpressionContext constantExpression() { + return getRuleContext(ConstantExpressionContext.class,0); + } + public TerminalNode COLON() { return getToken(Java1_4Parser.COLON, 0); } + public TerminalNode DEFAULT() { return getToken(Java1_4Parser.DEFAULT, 0); } + public SwitchLabelContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_switchLabel; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitSwitchLabel(this); + else return visitor.visitChildren(this); + } + } + + public final SwitchLabelContext switchLabel() throws RecognitionException { + SwitchLabelContext _localctx = new SwitchLabelContext(_ctx, getState()); + enterRule(_localctx, 108, RULE_switchLabel); + try { + setState(590); + _errHandler.sync(this); + switch (_input.LA(1)) { + case CASE: + enterOuterAlt(_localctx, 1); + { + setState(584); + match(CASE); + setState(585); + constantExpression(); + setState(586); + match(COLON); + } + break; + case DEFAULT: + enterOuterAlt(_localctx, 2); + { + setState(588); + match(DEFAULT); + setState(589); + match(COLON); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ForInitContext extends ParserRuleContext { + public List statementExpression() { + return getRuleContexts(StatementExpressionContext.class); + } + public StatementExpressionContext statementExpression(int i) { + return getRuleContext(StatementExpressionContext.class,i); + } + public List COMMA() { return getTokens(Java1_4Parser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(Java1_4Parser.COMMA, i); + } + public TypeContext type() { + return getRuleContext(TypeContext.class,0); + } + public VariableDeclaratorsContext variableDeclarators() { + return getRuleContext(VariableDeclaratorsContext.class,0); + } + public TerminalNode FINAL() { return getToken(Java1_4Parser.FINAL, 0); } + public ForInitContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_forInit; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitForInit(this); + else return visitor.visitChildren(this); + } + } + + public final ForInitContext forInit() throws RecognitionException { + ForInitContext _localctx = new ForInitContext(_ctx, getState()); + enterRule(_localctx, 110, RULE_forInit); + int _la; + try { + setState(606); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,56,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(592); + statementExpression(); + setState(597); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(593); + match(COMMA); + setState(594); + statementExpression(); + } + } + setState(599); + _errHandler.sync(this); + _la = _input.LA(1); + } + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(601); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==FINAL) { + { + setState(600); + match(FINAL); + } + } + + setState(603); + type(); + setState(604); + variableDeclarators(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ForUpdateContext extends ParserRuleContext { + public List statementExpression() { + return getRuleContexts(StatementExpressionContext.class); + } + public StatementExpressionContext statementExpression(int i) { + return getRuleContext(StatementExpressionContext.class,i); + } + public List COMMA() { return getTokens(Java1_4Parser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(Java1_4Parser.COMMA, i); + } + public ForUpdateContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_forUpdate; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitForUpdate(this); + else return visitor.visitChildren(this); + } + } + + public final ForUpdateContext forUpdate() throws RecognitionException { + ForUpdateContext _localctx = new ForUpdateContext(_ctx, getState()); + enterRule(_localctx, 112, RULE_forUpdate); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(608); + statementExpression(); + setState(613); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(609); + match(COMMA); + setState(610); + statementExpression(); + } + } + setState(615); + _errHandler.sync(this); + _la = _input.LA(1); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ModifierContext extends ParserRuleContext { + public TerminalNode PUBLIC() { return getToken(Java1_4Parser.PUBLIC, 0); } + public TerminalNode PROTECTED() { return getToken(Java1_4Parser.PROTECTED, 0); } + public TerminalNode PRIVATE() { return getToken(Java1_4Parser.PRIVATE, 0); } + public TerminalNode STATIC() { return getToken(Java1_4Parser.STATIC, 0); } + public TerminalNode ABSTRACT() { return getToken(Java1_4Parser.ABSTRACT, 0); } + public TerminalNode FINAL() { return getToken(Java1_4Parser.FINAL, 0); } + public TerminalNode NATIVE() { return getToken(Java1_4Parser.NATIVE, 0); } + public TerminalNode SYNCHRONIZED() { return getToken(Java1_4Parser.SYNCHRONIZED, 0); } + public TerminalNode TRANSIENT() { return getToken(Java1_4Parser.TRANSIENT, 0); } + public TerminalNode VOLATILE() { return getToken(Java1_4Parser.VOLATILE, 0); } + public TerminalNode STRICTFP() { return getToken(Java1_4Parser.STRICTFP, 0); } + public ModifierContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_modifier; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitModifier(this); + else return visitor.visitChildren(this); + } + } + + public final ModifierContext modifier() throws RecognitionException { + ModifierContext _localctx = new ModifierContext(_ctx, getState()); + enterRule(_localctx, 114, RULE_modifier); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(616); + _la = _input.LA(1); + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 79825322704898L) != 0)) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class VariableDeclaratorsContext extends ParserRuleContext { + public List variableDeclarator() { + return getRuleContexts(VariableDeclaratorContext.class); + } + public VariableDeclaratorContext variableDeclarator(int i) { + return getRuleContext(VariableDeclaratorContext.class,i); + } + public List COMMA() { return getTokens(Java1_4Parser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(Java1_4Parser.COMMA, i); + } + public VariableDeclaratorsContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_variableDeclarators; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitVariableDeclarators(this); + else return visitor.visitChildren(this); + } + } + + public final VariableDeclaratorsContext variableDeclarators() throws RecognitionException { + VariableDeclaratorsContext _localctx = new VariableDeclaratorsContext(_ctx, getState()); + enterRule(_localctx, 116, RULE_variableDeclarators); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(618); + variableDeclarator(); + setState(623); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(619); + match(COMMA); + setState(620); + variableDeclarator(); + } + } + setState(625); + _errHandler.sync(this); + _la = _input.LA(1); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class VariableDeclaratorContext extends ParserRuleContext { + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public DimsContext dims() { + return getRuleContext(DimsContext.class,0); + } + public TerminalNode EQUALS() { return getToken(Java1_4Parser.EQUALS, 0); } + public VariableInitializerContext variableInitializer() { + return getRuleContext(VariableInitializerContext.class,0); + } + public VariableDeclaratorContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_variableDeclarator; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitVariableDeclarator(this); + else return visitor.visitChildren(this); + } + } + + public final VariableDeclaratorContext variableDeclarator() throws RecognitionException { + VariableDeclaratorContext _localctx = new VariableDeclaratorContext(_ctx, getState()); + enterRule(_localctx, 118, RULE_variableDeclarator); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(626); + identifier(); + setState(628); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==OPEN_BRACKET) { + { + setState(627); + dims(); + } + } + + setState(632); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==EQUALS) { + { + setState(630); + match(EQUALS); + setState(631); + variableInitializer(); + } + } + + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class VariableDeclaratorIdContext extends ParserRuleContext { + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public DimsContext dims() { + return getRuleContext(DimsContext.class,0); + } + public VariableDeclaratorIdContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_variableDeclaratorId; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitVariableDeclaratorId(this); + else return visitor.visitChildren(this); + } + } + + public final VariableDeclaratorIdContext variableDeclaratorId() throws RecognitionException { + VariableDeclaratorIdContext _localctx = new VariableDeclaratorIdContext(_ctx, getState()); + enterRule(_localctx, 120, RULE_variableDeclaratorId); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(634); + identifier(); + setState(636); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==OPEN_BRACKET) { + { + setState(635); + dims(); + } + } + + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ConstantDeclaratorContext extends ParserRuleContext { + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public TerminalNode EQUALS() { return getToken(Java1_4Parser.EQUALS, 0); } + public VariableInitializerContext variableInitializer() { + return getRuleContext(VariableInitializerContext.class,0); + } + public DimsContext dims() { + return getRuleContext(DimsContext.class,0); + } + public ConstantDeclaratorContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_constantDeclarator; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitConstantDeclarator(this); + else return visitor.visitChildren(this); + } + } + + public final ConstantDeclaratorContext constantDeclarator() throws RecognitionException { + ConstantDeclaratorContext _localctx = new ConstantDeclaratorContext(_ctx, getState()); + enterRule(_localctx, 122, RULE_constantDeclarator); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(638); + identifier(); + setState(640); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==OPEN_BRACKET) { + { + setState(639); + dims(); + } + } + + setState(642); + match(EQUALS); + setState(643); + variableInitializer(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class CompilationUnitContext extends ParserRuleContext { + public TerminalNode EOF() { return getToken(Java1_4Parser.EOF, 0); } + public TerminalNode PACKAGE() { return getToken(Java1_4Parser.PACKAGE, 0); } + public QualifiedIdentifierContext qualifiedIdentifier() { + return getRuleContext(QualifiedIdentifierContext.class,0); + } + public TerminalNode SEMICOLON() { return getToken(Java1_4Parser.SEMICOLON, 0); } + public List importDeclaration() { + return getRuleContexts(ImportDeclarationContext.class); + } + public ImportDeclarationContext importDeclaration(int i) { + return getRuleContext(ImportDeclarationContext.class,i); + } + public List typeDeclaration() { + return getRuleContexts(TypeDeclarationContext.class); + } + public TypeDeclarationContext typeDeclaration(int i) { + return getRuleContext(TypeDeclarationContext.class,i); + } + public CompilationUnitContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_compilationUnit; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitCompilationUnit(this); + else return visitor.visitChildren(this); + } + } + + public final CompilationUnitContext compilationUnit() throws RecognitionException { + CompilationUnitContext _localctx = new CompilationUnitContext(_ctx, getState()); + enterRule(_localctx, 124, RULE_compilationUnit); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(649); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==PACKAGE) { + { + setState(645); + match(PACKAGE); + setState(646); + qualifiedIdentifier(); + setState(647); + match(SEMICOLON); + } + } + + setState(654); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==IMPORT) { + { + { + setState(651); + importDeclaration(); + } + } + setState(656); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(660); + _errHandler.sync(this); + _la = _input.LA(1); + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 79825356259842L) != 0)) { + { + { + setState(657); + typeDeclaration(); + } + } + setState(662); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(663); + match(EOF); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ImportDeclarationContext extends ParserRuleContext { + public TerminalNode IMPORT() { return getToken(Java1_4Parser.IMPORT, 0); } + public List identifier() { + return getRuleContexts(IdentifierContext.class); + } + public IdentifierContext identifier(int i) { + return getRuleContext(IdentifierContext.class,i); + } + public TerminalNode SEMICOLON() { return getToken(Java1_4Parser.SEMICOLON, 0); } + public List PERIOD() { return getTokens(Java1_4Parser.PERIOD); } + public TerminalNode PERIOD(int i) { + return getToken(Java1_4Parser.PERIOD, i); + } + public TerminalNode ASTERISK() { return getToken(Java1_4Parser.ASTERISK, 0); } + public ImportDeclarationContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_importDeclaration; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitImportDeclaration(this); + else return visitor.visitChildren(this); + } + } + + public final ImportDeclarationContext importDeclaration() throws RecognitionException { + ImportDeclarationContext _localctx = new ImportDeclarationContext(_ctx, getState()); + enterRule(_localctx, 126, RULE_importDeclaration); + int _la; + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(665); + match(IMPORT); + setState(666); + identifier(); + setState(671); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,66,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(667); + match(PERIOD); + setState(668); + identifier(); + } + } + } + setState(673); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,66,_ctx); + } + setState(676); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==PERIOD) { + { + setState(674); + match(PERIOD); + setState(675); + match(ASTERISK); + } + } + + setState(678); + match(SEMICOLON); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class TypeDeclarationContext extends ParserRuleContext { + public ClassOrInterfaceDeclarationContext classOrInterfaceDeclaration() { + return getRuleContext(ClassOrInterfaceDeclarationContext.class,0); + } + public TypeDeclarationContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_typeDeclaration; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitTypeDeclaration(this); + else return visitor.visitChildren(this); + } + } + + public final TypeDeclarationContext typeDeclaration() throws RecognitionException { + TypeDeclarationContext _localctx = new TypeDeclarationContext(_ctx, getState()); + enterRule(_localctx, 128, RULE_typeDeclaration); + try { + enterOuterAlt(_localctx, 1); + { + setState(680); + classOrInterfaceDeclaration(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ClassOrInterfaceDeclarationContext extends ParserRuleContext { + public ClassDeclarationContext classDeclaration() { + return getRuleContext(ClassDeclarationContext.class,0); + } + public InterfaceDeclarationContext interfaceDeclaration() { + return getRuleContext(InterfaceDeclarationContext.class,0); + } + public List modifier() { + return getRuleContexts(ModifierContext.class); + } + public ModifierContext modifier(int i) { + return getRuleContext(ModifierContext.class,i); + } + public ClassOrInterfaceDeclarationContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_classOrInterfaceDeclaration; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitClassOrInterfaceDeclaration(this); + else return visitor.visitChildren(this); + } + } + + public final ClassOrInterfaceDeclarationContext classOrInterfaceDeclaration() throws RecognitionException { + ClassOrInterfaceDeclarationContext _localctx = new ClassOrInterfaceDeclarationContext(_ctx, getState()); + enterRule(_localctx, 130, RULE_classOrInterfaceDeclaration); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(685); + _errHandler.sync(this); + _la = _input.LA(1); + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 79825322704898L) != 0)) { + { + { + setState(682); + modifier(); + } + } + setState(687); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(690); + _errHandler.sync(this); + switch (_input.LA(1)) { + case CLASS: + { + setState(688); + classDeclaration(); + } + break; + case INTERFACE: + { + setState(689); + interfaceDeclaration(); + } + break; + default: + throw new NoViableAltException(this); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ClassDeclarationContext extends ParserRuleContext { + public TerminalNode CLASS() { return getToken(Java1_4Parser.CLASS, 0); } + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public ClassBodyContext classBody() { + return getRuleContext(ClassBodyContext.class,0); + } + public SuperclassContext superclass() { + return getRuleContext(SuperclassContext.class,0); + } + public SuperinterfacesContext superinterfaces() { + return getRuleContext(SuperinterfacesContext.class,0); + } + public ClassDeclarationContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_classDeclaration; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitClassDeclaration(this); + else return visitor.visitChildren(this); + } + } + + public final ClassDeclarationContext classDeclaration() throws RecognitionException { + ClassDeclarationContext _localctx = new ClassDeclarationContext(_ctx, getState()); + enterRule(_localctx, 132, RULE_classDeclaration); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(692); + match(CLASS); + setState(693); + identifier(); + setState(695); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==EXTENDS) { + { + setState(694); + superclass(); + } + } + + setState(698); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==IMPLEMENTS) { + { + setState(697); + superinterfaces(); + } + } + + setState(700); + classBody(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class SuperclassContext extends ParserRuleContext { + public TerminalNode EXTENDS() { return getToken(Java1_4Parser.EXTENDS, 0); } + public TypeContext type() { + return getRuleContext(TypeContext.class,0); + } + public SuperclassContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_superclass; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitSuperclass(this); + else return visitor.visitChildren(this); + } + } + + public final SuperclassContext superclass() throws RecognitionException { + SuperclassContext _localctx = new SuperclassContext(_ctx, getState()); + enterRule(_localctx, 134, RULE_superclass); + try { + enterOuterAlt(_localctx, 1); + { + setState(702); + match(EXTENDS); + setState(703); + type(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class SuperinterfacesContext extends ParserRuleContext { + public TerminalNode IMPLEMENTS() { return getToken(Java1_4Parser.IMPLEMENTS, 0); } + public TypeListContext typeList() { + return getRuleContext(TypeListContext.class,0); + } + public SuperinterfacesContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_superinterfaces; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitSuperinterfaces(this); + else return visitor.visitChildren(this); + } + } + + public final SuperinterfacesContext superinterfaces() throws RecognitionException { + SuperinterfacesContext _localctx = new SuperinterfacesContext(_ctx, getState()); + enterRule(_localctx, 136, RULE_superinterfaces); + try { + enterOuterAlt(_localctx, 1); + { + setState(705); + match(IMPLEMENTS); + setState(706); + typeList(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class InterfaceDeclarationContext extends ParserRuleContext { + public TerminalNode INTERFACE() { return getToken(Java1_4Parser.INTERFACE, 0); } + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public InterfaceBodyContext interfaceBody() { + return getRuleContext(InterfaceBodyContext.class,0); + } + public ExtendsInterfacesContext extendsInterfaces() { + return getRuleContext(ExtendsInterfacesContext.class,0); + } + public InterfaceDeclarationContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_interfaceDeclaration; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitInterfaceDeclaration(this); + else return visitor.visitChildren(this); + } + } + + public final InterfaceDeclarationContext interfaceDeclaration() throws RecognitionException { + InterfaceDeclarationContext _localctx = new InterfaceDeclarationContext(_ctx, getState()); + enterRule(_localctx, 138, RULE_interfaceDeclaration); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(708); + match(INTERFACE); + setState(709); + identifier(); + setState(711); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==EXTENDS) { + { + setState(710); + extendsInterfaces(); + } + } + + setState(713); + interfaceBody(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ExtendsInterfacesContext extends ParserRuleContext { + public TerminalNode EXTENDS() { return getToken(Java1_4Parser.EXTENDS, 0); } + public TypeListContext typeList() { + return getRuleContext(TypeListContext.class,0); + } + public ExtendsInterfacesContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_extendsInterfaces; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitExtendsInterfaces(this); + else return visitor.visitChildren(this); + } + } + + public final ExtendsInterfacesContext extendsInterfaces() throws RecognitionException { + ExtendsInterfacesContext _localctx = new ExtendsInterfacesContext(_ctx, getState()); + enterRule(_localctx, 140, RULE_extendsInterfaces); + try { + enterOuterAlt(_localctx, 1); + { + setState(715); + match(EXTENDS); + setState(716); + typeList(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class TypeListContext extends ParserRuleContext { + public List type() { + return getRuleContexts(TypeContext.class); + } + public TypeContext type(int i) { + return getRuleContext(TypeContext.class,i); + } + public List COMMA() { return getTokens(Java1_4Parser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(Java1_4Parser.COMMA, i); + } + public TypeListContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_typeList; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitTypeList(this); + else return visitor.visitChildren(this); + } + } + + public final TypeListContext typeList() throws RecognitionException { + TypeListContext _localctx = new TypeListContext(_ctx, getState()); + enterRule(_localctx, 142, RULE_typeList); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(718); + type(); + setState(723); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(719); + match(COMMA); + setState(720); + type(); + } + } + setState(725); + _errHandler.sync(this); + _la = _input.LA(1); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ClassBodyContext extends ParserRuleContext { + public TerminalNode OPEN_BRACE() { return getToken(Java1_4Parser.OPEN_BRACE, 0); } + public TerminalNode CLOSE_BRACE() { return getToken(Java1_4Parser.CLOSE_BRACE, 0); } + public List classBodyDeclaration() { + return getRuleContexts(ClassBodyDeclarationContext.class); + } + public ClassBodyDeclarationContext classBodyDeclaration(int i) { + return getRuleContext(ClassBodyDeclarationContext.class,i); + } + public ClassBodyContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_classBody; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitClassBody(this); + else return visitor.visitChildren(this); + } + } + + public final ClassBodyContext classBody() throws RecognitionException { + ClassBodyContext _localctx = new ClassBodyContext(_ctx, getState()); + enterRule(_localctx, 144, RULE_classBody); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(726); + match(OPEN_BRACE); + setState(730); + _errHandler.sync(this); + _la = _input.LA(1); + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 9403701223826218L) != 0) || _la==Identifier) { + { + { + setState(727); + classBodyDeclaration(); + } + } + setState(732); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(733); + match(CLOSE_BRACE); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class InterfaceBodyContext extends ParserRuleContext { + public TerminalNode OPEN_BRACE() { return getToken(Java1_4Parser.OPEN_BRACE, 0); } + public TerminalNode CLOSE_BRACE() { return getToken(Java1_4Parser.CLOSE_BRACE, 0); } + public List interfaceBodyDeclaration() { + return getRuleContexts(InterfaceBodyDeclarationContext.class); + } + public InterfaceBodyDeclarationContext interfaceBodyDeclaration(int i) { + return getRuleContext(InterfaceBodyDeclarationContext.class,i); + } + public InterfaceBodyContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_interfaceBody; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitInterfaceBody(this); + else return visitor.visitChildren(this); + } + } + + public final InterfaceBodyContext interfaceBody() throws RecognitionException { + InterfaceBodyContext _localctx = new InterfaceBodyContext(_ctx, getState()); + enterRule(_localctx, 146, RULE_interfaceBody); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(735); + match(OPEN_BRACE); + setState(739); + _errHandler.sync(this); + _la = _input.LA(1); + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 361317596996394L) != 0) || _la==Identifier) { + { + { + setState(736); + interfaceBodyDeclaration(); + } + } + setState(741); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(742); + match(CLOSE_BRACE); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ClassBodyDeclarationContext extends ParserRuleContext { + public EmptyDeclarationContext emptyDeclaration() { + return getRuleContext(EmptyDeclarationContext.class,0); + } + public InitializerContext initializer() { + return getRuleContext(InitializerContext.class,0); + } + public StaticInitializerContext staticInitializer() { + return getRuleContext(StaticInitializerContext.class,0); + } + public MemberDeclarationContext memberDeclaration() { + return getRuleContext(MemberDeclarationContext.class,0); + } + public ClassBodyDeclarationContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_classBodyDeclaration; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitClassBodyDeclaration(this); + else return visitor.visitChildren(this); + } + } + + public final ClassBodyDeclarationContext classBodyDeclaration() throws RecognitionException { + ClassBodyDeclarationContext _localctx = new ClassBodyDeclarationContext(_ctx, getState()); + enterRule(_localctx, 148, RULE_classBodyDeclaration); + try { + setState(748); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,76,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(744); + emptyDeclaration(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(745); + initializer(); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(746); + staticInitializer(); + } + break; + case 4: + enterOuterAlt(_localctx, 4); + { + setState(747); + memberDeclaration(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class EmptyDeclarationContext extends ParserRuleContext { + public TerminalNode SEMICOLON() { return getToken(Java1_4Parser.SEMICOLON, 0); } + public EmptyDeclarationContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_emptyDeclaration; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitEmptyDeclaration(this); + else return visitor.visitChildren(this); + } + } + + public final EmptyDeclarationContext emptyDeclaration() throws RecognitionException { + EmptyDeclarationContext _localctx = new EmptyDeclarationContext(_ctx, getState()); + enterRule(_localctx, 150, RULE_emptyDeclaration); + try { + enterOuterAlt(_localctx, 1); + { + setState(750); + match(SEMICOLON); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class InitializerContext extends ParserRuleContext { + public BlockContext block() { + return getRuleContext(BlockContext.class,0); + } + public InitializerContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_initializer; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitInitializer(this); + else return visitor.visitChildren(this); + } + } + + public final InitializerContext initializer() throws RecognitionException { + InitializerContext _localctx = new InitializerContext(_ctx, getState()); + enterRule(_localctx, 152, RULE_initializer); + try { + enterOuterAlt(_localctx, 1); + { + setState(752); + block(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class StaticInitializerContext extends ParserRuleContext { + public TerminalNode STATIC() { return getToken(Java1_4Parser.STATIC, 0); } + public BlockContext block() { + return getRuleContext(BlockContext.class,0); + } + public StaticInitializerContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_staticInitializer; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitStaticInitializer(this); + else return visitor.visitChildren(this); + } + } + + public final StaticInitializerContext staticInitializer() throws RecognitionException { + StaticInitializerContext _localctx = new StaticInitializerContext(_ctx, getState()); + enterRule(_localctx, 154, RULE_staticInitializer); + try { + enterOuterAlt(_localctx, 1); + { + setState(754); + match(STATIC); + setState(755); + block(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class MemberDeclarationContext extends ParserRuleContext { + public MethodDeclarationContext methodDeclaration() { + return getRuleContext(MethodDeclarationContext.class,0); + } + public FieldDeclarationContext fieldDeclaration() { + return getRuleContext(FieldDeclarationContext.class,0); + } + public ConstructorDeclarationContext constructorDeclaration() { + return getRuleContext(ConstructorDeclarationContext.class,0); + } + public ClassOrInterfaceDeclarationContext classOrInterfaceDeclaration() { + return getRuleContext(ClassOrInterfaceDeclarationContext.class,0); + } + public MemberDeclarationContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_memberDeclaration; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitMemberDeclaration(this); + else return visitor.visitChildren(this); + } + } + + public final MemberDeclarationContext memberDeclaration() throws RecognitionException { + MemberDeclarationContext _localctx = new MemberDeclarationContext(_ctx, getState()); + enterRule(_localctx, 156, RULE_memberDeclaration); + try { + setState(761); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,77,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(757); + methodDeclaration(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(758); + fieldDeclaration(); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(759); + constructorDeclaration(); + } + break; + case 4: + enterOuterAlt(_localctx, 4); + { + setState(760); + classOrInterfaceDeclaration(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class MethodDeclarationContext extends ParserRuleContext { + public ResultContext result() { + return getRuleContext(ResultContext.class,0); + } + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public FormalParametersContext formalParameters() { + return getRuleContext(FormalParametersContext.class,0); + } + public BlockContext block() { + return getRuleContext(BlockContext.class,0); + } + public TerminalNode SEMICOLON() { return getToken(Java1_4Parser.SEMICOLON, 0); } + public List modifier() { + return getRuleContexts(ModifierContext.class); + } + public ModifierContext modifier(int i) { + return getRuleContext(ModifierContext.class,i); + } + public DimsContext dims() { + return getRuleContext(DimsContext.class,0); + } + public Throws_Context throws_() { + return getRuleContext(Throws_Context.class,0); + } + public MethodDeclarationContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_methodDeclaration; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitMethodDeclaration(this); + else return visitor.visitChildren(this); + } + } + + public final MethodDeclarationContext methodDeclaration() throws RecognitionException { + MethodDeclarationContext _localctx = new MethodDeclarationContext(_ctx, getState()); + enterRule(_localctx, 158, RULE_methodDeclaration); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(766); + _errHandler.sync(this); + _la = _input.LA(1); + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 79825322704898L) != 0)) { + { + { + setState(763); + modifier(); + } + } + setState(768); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(769); + result(); + setState(770); + identifier(); + setState(771); + formalParameters(); + setState(773); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==OPEN_BRACKET) { + { + setState(772); + dims(); + } + } + + setState(776); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==THROWS) { + { + setState(775); + throws_(); + } + } + + setState(780); + _errHandler.sync(this); + switch (_input.LA(1)) { + case OPEN_BRACE: + { + setState(778); + block(); + } + break; + case SEMICOLON: + { + setState(779); + match(SEMICOLON); + } + break; + default: + throw new NoViableAltException(this); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ResultContext extends ParserRuleContext { + public TypeContext type() { + return getRuleContext(TypeContext.class,0); + } + public TerminalNode VOID() { return getToken(Java1_4Parser.VOID, 0); } + public ResultContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_result; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitResult(this); + else return visitor.visitChildren(this); + } + } + + public final ResultContext result() throws RecognitionException { + ResultContext _localctx = new ResultContext(_ctx, getState()); + enterRule(_localctx, 160, RULE_result); + try { + setState(784); + _errHandler.sync(this); + switch (_input.LA(1)) { + case BOOLEAN: + case BYTE: + case CHAR: + case DOUBLE: + case FLOAT: + case INT: + case LONG: + case SHORT: + case Identifier: + enterOuterAlt(_localctx, 1); + { + setState(782); + type(); + } + break; + case VOID: + enterOuterAlt(_localctx, 2); + { + setState(783); + match(VOID); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class Throws_Context extends ParserRuleContext { + public TerminalNode THROWS() { return getToken(Java1_4Parser.THROWS, 0); } + public QualifiedIdentifiersContext qualifiedIdentifiers() { + return getRuleContext(QualifiedIdentifiersContext.class,0); + } + public Throws_Context(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_throws_; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitThrows_(this); + else return visitor.visitChildren(this); + } + } + + public final Throws_Context throws_() throws RecognitionException { + Throws_Context _localctx = new Throws_Context(_ctx, getState()); + enterRule(_localctx, 162, RULE_throws_); + try { + enterOuterAlt(_localctx, 1); + { + setState(786); + match(THROWS); + setState(787); + qualifiedIdentifiers(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class FieldDeclarationContext extends ParserRuleContext { + public TypeContext type() { + return getRuleContext(TypeContext.class,0); + } + public VariableDeclaratorsContext variableDeclarators() { + return getRuleContext(VariableDeclaratorsContext.class,0); + } + public TerminalNode SEMICOLON() { return getToken(Java1_4Parser.SEMICOLON, 0); } + public List modifier() { + return getRuleContexts(ModifierContext.class); + } + public ModifierContext modifier(int i) { + return getRuleContext(ModifierContext.class,i); + } + public FieldDeclarationContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_fieldDeclaration; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitFieldDeclaration(this); + else return visitor.visitChildren(this); + } + } + + public final FieldDeclarationContext fieldDeclaration() throws RecognitionException { + FieldDeclarationContext _localctx = new FieldDeclarationContext(_ctx, getState()); + enterRule(_localctx, 164, RULE_fieldDeclaration); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(792); + _errHandler.sync(this); + _la = _input.LA(1); + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 79825322704898L) != 0)) { + { + { + setState(789); + modifier(); + } + } + setState(794); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(795); + type(); + setState(796); + variableDeclarators(); + setState(797); + match(SEMICOLON); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ConstructorDeclarationContext extends ParserRuleContext { + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public FormalParametersContext formalParameters() { + return getRuleContext(FormalParametersContext.class,0); + } + public ConstructorBodyContext constructorBody() { + return getRuleContext(ConstructorBodyContext.class,0); + } + public List modifier() { + return getRuleContexts(ModifierContext.class); + } + public ModifierContext modifier(int i) { + return getRuleContext(ModifierContext.class,i); + } + public Throws_Context throws_() { + return getRuleContext(Throws_Context.class,0); + } + public ConstructorDeclarationContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_constructorDeclaration; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitConstructorDeclaration(this); + else return visitor.visitChildren(this); + } + } + + public final ConstructorDeclarationContext constructorDeclaration() throws RecognitionException { + ConstructorDeclarationContext _localctx = new ConstructorDeclarationContext(_ctx, getState()); + enterRule(_localctx, 166, RULE_constructorDeclaration); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(802); + _errHandler.sync(this); + _la = _input.LA(1); + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 79825322704898L) != 0)) { + { + { + setState(799); + modifier(); + } + } + setState(804); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(805); + identifier(); + setState(806); + formalParameters(); + setState(808); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==THROWS) { + { + setState(807); + throws_(); + } + } + + setState(810); + constructorBody(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ConstructorBodyContext extends ParserRuleContext { + public TerminalNode OPEN_BRACE() { return getToken(Java1_4Parser.OPEN_BRACE, 0); } + public TerminalNode CLOSE_BRACE() { return getToken(Java1_4Parser.CLOSE_BRACE, 0); } + public ExplicitConstructorInvocationContext explicitConstructorInvocation() { + return getRuleContext(ExplicitConstructorInvocationContext.class,0); + } + public List blockStatement() { + return getRuleContexts(BlockStatementContext.class); + } + public BlockStatementContext blockStatement(int i) { + return getRuleContext(BlockStatementContext.class,i); + } + public ConstructorBodyContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_constructorBody; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitConstructorBody(this); + else return visitor.visitChildren(this); + } + } + + public final ConstructorBodyContext constructorBody() throws RecognitionException { + ConstructorBodyContext _localctx = new ConstructorBodyContext(_ctx, getState()); + enterRule(_localctx, 168, RULE_constructorBody); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(812); + match(OPEN_BRACE); + setState(814); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,86,_ctx) ) { + case 1: + { + setState(813); + explicitConstructorInvocation(); + } + break; + } + setState(819); + _errHandler.sync(this); + _la = _input.LA(1); + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 3470582064244143934L) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & 68182605839L) != 0)) { + { + { + setState(816); + blockStatement(); + } + } + setState(821); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(822); + match(CLOSE_BRACE); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ExplicitConstructorInvocationContext extends ParserRuleContext { + public ArgumentsContext arguments() { + return getRuleContext(ArgumentsContext.class,0); + } + public TerminalNode SEMICOLON() { return getToken(Java1_4Parser.SEMICOLON, 0); } + public TerminalNode THIS() { return getToken(Java1_4Parser.THIS, 0); } + public TerminalNode SUPER() { return getToken(Java1_4Parser.SUPER, 0); } + public ExplicitConstructorInvocationContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_explicitConstructorInvocation; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitExplicitConstructorInvocation(this); + else return visitor.visitChildren(this); + } + } + + public final ExplicitConstructorInvocationContext explicitConstructorInvocation() throws RecognitionException { + ExplicitConstructorInvocationContext _localctx = new ExplicitConstructorInvocationContext(_ctx, getState()); + enterRule(_localctx, 170, RULE_explicitConstructorInvocation); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(824); + _la = _input.LA(1); + if ( !(_la==SUPER || _la==THIS) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(825); + arguments(); + setState(826); + match(SEMICOLON); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class InterfaceBodyDeclarationContext extends ParserRuleContext { + public EmptyDeclarationContext emptyDeclaration() { + return getRuleContext(EmptyDeclarationContext.class,0); + } + public InterfaceMemberDeclarationContext interfaceMemberDeclaration() { + return getRuleContext(InterfaceMemberDeclarationContext.class,0); + } + public InterfaceBodyDeclarationContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_interfaceBodyDeclaration; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitInterfaceBodyDeclaration(this); + else return visitor.visitChildren(this); + } + } + + public final InterfaceBodyDeclarationContext interfaceBodyDeclaration() throws RecognitionException { + InterfaceBodyDeclarationContext _localctx = new InterfaceBodyDeclarationContext(_ctx, getState()); + enterRule(_localctx, 172, RULE_interfaceBodyDeclaration); + try { + setState(830); + _errHandler.sync(this); + switch (_input.LA(1)) { + case SEMICOLON: + enterOuterAlt(_localctx, 1); + { + setState(828); + emptyDeclaration(); + } + break; + case ABSTRACT: + case BOOLEAN: + case BYTE: + case CHAR: + case CLASS: + case DOUBLE: + case FINAL: + case FLOAT: + case INT: + case INTERFACE: + case LONG: + case NATIVE: + case PRIVATE: + case PROTECTED: + case PUBLIC: + case SHORT: + case STATIC: + case STRICTFP: + case SYNCHRONIZED: + case TRANSIENT: + case VOLATILE: + case Identifier: + enterOuterAlt(_localctx, 2); + { + setState(829); + interfaceMemberDeclaration(); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class InterfaceMemberDeclarationContext extends ParserRuleContext { + public InterfaceMethodDeclarationContext interfaceMethodDeclaration() { + return getRuleContext(InterfaceMethodDeclarationContext.class,0); + } + public ConstantDeclarationContext constantDeclaration() { + return getRuleContext(ConstantDeclarationContext.class,0); + } + public ClassOrInterfaceDeclarationContext classOrInterfaceDeclaration() { + return getRuleContext(ClassOrInterfaceDeclarationContext.class,0); + } + public InterfaceMemberDeclarationContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_interfaceMemberDeclaration; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitInterfaceMemberDeclaration(this); + else return visitor.visitChildren(this); + } + } + + public final InterfaceMemberDeclarationContext interfaceMemberDeclaration() throws RecognitionException { + InterfaceMemberDeclarationContext _localctx = new InterfaceMemberDeclarationContext(_ctx, getState()); + enterRule(_localctx, 174, RULE_interfaceMemberDeclaration); + try { + setState(835); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,89,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(832); + interfaceMethodDeclaration(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(833); + constantDeclaration(); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(834); + classOrInterfaceDeclaration(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class InterfaceMethodDeclarationContext extends ParserRuleContext { + public TypeContext type() { + return getRuleContext(TypeContext.class,0); + } + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public FormalParametersContext formalParameters() { + return getRuleContext(FormalParametersContext.class,0); + } + public TerminalNode SEMICOLON() { return getToken(Java1_4Parser.SEMICOLON, 0); } + public List modifier() { + return getRuleContexts(ModifierContext.class); + } + public ModifierContext modifier(int i) { + return getRuleContext(ModifierContext.class,i); + } + public DimsContext dims() { + return getRuleContext(DimsContext.class,0); + } + public Throws_Context throws_() { + return getRuleContext(Throws_Context.class,0); + } + public InterfaceMethodDeclarationContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_interfaceMethodDeclaration; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitInterfaceMethodDeclaration(this); + else return visitor.visitChildren(this); + } + } + + public final InterfaceMethodDeclarationContext interfaceMethodDeclaration() throws RecognitionException { + InterfaceMethodDeclarationContext _localctx = new InterfaceMethodDeclarationContext(_ctx, getState()); + enterRule(_localctx, 176, RULE_interfaceMethodDeclaration); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(840); + _errHandler.sync(this); + _la = _input.LA(1); + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 79825322704898L) != 0)) { + { + { + setState(837); + modifier(); + } + } + setState(842); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(843); + type(); + setState(844); + identifier(); + setState(845); + formalParameters(); + setState(847); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==OPEN_BRACKET) { + { + setState(846); + dims(); + } + } + + setState(850); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==THROWS) { + { + setState(849); + throws_(); + } + } + + setState(852); + match(SEMICOLON); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ConstantDeclarationContext extends ParserRuleContext { + public TypeContext type() { + return getRuleContext(TypeContext.class,0); + } + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public VariableDeclaratorsContext variableDeclarators() { + return getRuleContext(VariableDeclaratorsContext.class,0); + } + public TerminalNode SEMICOLON() { return getToken(Java1_4Parser.SEMICOLON, 0); } + public List modifier() { + return getRuleContexts(ModifierContext.class); + } + public ModifierContext modifier(int i) { + return getRuleContext(ModifierContext.class,i); + } + public ConstantDeclarationContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_constantDeclaration; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitConstantDeclaration(this); + else return visitor.visitChildren(this); + } + } + + public final ConstantDeclarationContext constantDeclaration() throws RecognitionException { + ConstantDeclarationContext _localctx = new ConstantDeclarationContext(_ctx, getState()); + enterRule(_localctx, 178, RULE_constantDeclaration); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(857); + _errHandler.sync(this); + _la = _input.LA(1); + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 79825322704898L) != 0)) { + { + { + setState(854); + modifier(); + } + } + setState(859); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(860); + type(); + setState(861); + identifier(); + setState(862); + variableDeclarators(); + setState(863); + match(SEMICOLON); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class QualifiedIdentifiersContext extends ParserRuleContext { + public List qualifiedIdentifier() { + return getRuleContexts(QualifiedIdentifierContext.class); + } + public QualifiedIdentifierContext qualifiedIdentifier(int i) { + return getRuleContext(QualifiedIdentifierContext.class,i); + } + public List COMMA() { return getTokens(Java1_4Parser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(Java1_4Parser.COMMA, i); + } + public QualifiedIdentifiersContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_qualifiedIdentifiers; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitQualifiedIdentifiers(this); + else return visitor.visitChildren(this); + } + } + + public final QualifiedIdentifiersContext qualifiedIdentifiers() throws RecognitionException { + QualifiedIdentifiersContext _localctx = new QualifiedIdentifiersContext(_ctx, getState()); + enterRule(_localctx, 180, RULE_qualifiedIdentifiers); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(865); + qualifiedIdentifier(); + setState(870); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(866); + match(COMMA); + setState(867); + qualifiedIdentifier(); + } + } + setState(872); + _errHandler.sync(this); + _la = _input.LA(1); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class FormalParametersContext extends ParserRuleContext { + public TerminalNode OPEN_PARENTHESIS() { return getToken(Java1_4Parser.OPEN_PARENTHESIS, 0); } + public TerminalNode CLOSE_PARENTHESIS() { return getToken(Java1_4Parser.CLOSE_PARENTHESIS, 0); } + public List formalParameter() { + return getRuleContexts(FormalParameterContext.class); + } + public FormalParameterContext formalParameter(int i) { + return getRuleContext(FormalParameterContext.class,i); + } + public List COMMA() { return getTokens(Java1_4Parser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(Java1_4Parser.COMMA, i); + } + public FormalParametersContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_formalParameters; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitFormalParameters(this); + else return visitor.visitChildren(this); + } + } + + public final FormalParametersContext formalParameters() throws RecognitionException { + FormalParametersContext _localctx = new FormalParametersContext(_ctx, getState()); + enterRule(_localctx, 182, RULE_formalParameters); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(873); + match(OPEN_PARENTHESIS); + setState(882); + _errHandler.sync(this); + _la = _input.LA(1); + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 17264091432L) != 0) || _la==Identifier) { + { + setState(874); + formalParameter(); + setState(879); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(875); + match(COMMA); + setState(876); + formalParameter(); + } + } + setState(881); + _errHandler.sync(this); + _la = _input.LA(1); + } + } + } + + setState(884); + match(CLOSE_PARENTHESIS); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class FormalParameterContext extends ParserRuleContext { + public TypeContext type() { + return getRuleContext(TypeContext.class,0); + } + public VariableDeclaratorIdContext variableDeclaratorId() { + return getRuleContext(VariableDeclaratorIdContext.class,0); + } + public TerminalNode FINAL() { return getToken(Java1_4Parser.FINAL, 0); } + public FormalParameterContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_formalParameter; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof Java1_4ParserVisitor ) return ((Java1_4ParserVisitor)visitor).visitFormalParameter(this); + else return visitor.visitChildren(this); + } + } + + public final FormalParameterContext formalParameter() throws RecognitionException { + FormalParameterContext _localctx = new FormalParameterContext(_ctx, getState()); + enterRule(_localctx, 184, RULE_formalParameter); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(887); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==FINAL) { + { + setState(886); + match(FINAL); + } + } + + setState(889); + type(); + setState(890); + variableDeclaratorId(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static final String _serializedATN = + "\u0004\u0001g\u037d\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001\u0002"+ + "\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004\u0007\u0004\u0002"+ + "\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007\u0007\u0007\u0002"+ + "\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b\u0007\u000b\u0002"+ + "\f\u0007\f\u0002\r\u0007\r\u0002\u000e\u0007\u000e\u0002\u000f\u0007\u000f"+ + "\u0002\u0010\u0007\u0010\u0002\u0011\u0007\u0011\u0002\u0012\u0007\u0012"+ + "\u0002\u0013\u0007\u0013\u0002\u0014\u0007\u0014\u0002\u0015\u0007\u0015"+ + "\u0002\u0016\u0007\u0016\u0002\u0017\u0007\u0017\u0002\u0018\u0007\u0018"+ + "\u0002\u0019\u0007\u0019\u0002\u001a\u0007\u001a\u0002\u001b\u0007\u001b"+ + "\u0002\u001c\u0007\u001c\u0002\u001d\u0007\u001d\u0002\u001e\u0007\u001e"+ + "\u0002\u001f\u0007\u001f\u0002 \u0007 \u0002!\u0007!\u0002\"\u0007\"\u0002"+ + "#\u0007#\u0002$\u0007$\u0002%\u0007%\u0002&\u0007&\u0002\'\u0007\'\u0002"+ + "(\u0007(\u0002)\u0007)\u0002*\u0007*\u0002+\u0007+\u0002,\u0007,\u0002"+ + "-\u0007-\u0002.\u0007.\u0002/\u0007/\u00020\u00070\u00021\u00071\u0002"+ + "2\u00072\u00023\u00073\u00024\u00074\u00025\u00075\u00026\u00076\u0002"+ + "7\u00077\u00028\u00078\u00029\u00079\u0002:\u0007:\u0002;\u0007;\u0002"+ + "<\u0007<\u0002=\u0007=\u0002>\u0007>\u0002?\u0007?\u0002@\u0007@\u0002"+ + "A\u0007A\u0002B\u0007B\u0002C\u0007C\u0002D\u0007D\u0002E\u0007E\u0002"+ + "F\u0007F\u0002G\u0007G\u0002H\u0007H\u0002I\u0007I\u0002J\u0007J\u0002"+ + "K\u0007K\u0002L\u0007L\u0002M\u0007M\u0002N\u0007N\u0002O\u0007O\u0002"+ + "P\u0007P\u0002Q\u0007Q\u0002R\u0007R\u0002S\u0007S\u0002T\u0007T\u0002"+ + "U\u0007U\u0002V\u0007V\u0002W\u0007W\u0002X\u0007X\u0002Y\u0007Y\u0002"+ + "Z\u0007Z\u0002[\u0007[\u0002\\\u0007\\\u0001\u0000\u0001\u0000\u0001\u0001"+ + "\u0001\u0001\u0001\u0001\u0005\u0001\u00c0\b\u0001\n\u0001\f\u0001\u00c3"+ + "\t\u0001\u0001\u0002\u0001\u0002\u0001\u0003\u0001\u0003\u0003\u0003\u00c9"+ + "\b\u0003\u0001\u0003\u0003\u0003\u00cc\b\u0003\u0001\u0004\u0001\u0004"+ + "\u0001\u0005\u0001\u0005\u0004\u0005\u00d2\b\u0005\u000b\u0005\f\u0005"+ + "\u00d3\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0003\u0006\u00da"+ + "\b\u0006\u0001\u0007\u0001\u0007\u0001\b\u0001\b\u0003\b\u00e0\b\b\u0001"+ + "\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\n\u0001\n\u0001\n\u0001\u000b"+ + "\u0001\u000b\u0001\u000b\u0005\u000b\u00ed\b\u000b\n\u000b\f\u000b\u00f0"+ + "\t\u000b\u0001\u000b\u0001\u000b\u0003\u000b\u00f4\b\u000b\u0001\f\u0001"+ + "\f\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0003\r\u00fe\b\r\u0001"+ + "\r\u0001\r\u0001\r\u0001\r\u0001\r\u0005\r\u0105\b\r\n\r\f\r\u0108\t\r"+ + "\u0001\r\u0005\r\u010b\b\r\n\r\f\r\u010e\t\r\u0003\r\u0110\b\r\u0001\u000e"+ + "\u0001\u000e\u0001\u000f\u0001\u000f\u0001\u0010\u0001\u0010\u0001\u0010"+ + "\u0003\u0010\u0119\b\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010"+ + "\u0001\u0010\u0001\u0010\u0001\u0010\u0003\u0010\u0122\b\u0010\u0001\u0010"+ + "\u0001\u0010\u0003\u0010\u0126\b\u0010\u0001\u0010\u0001\u0010\u0001\u0010"+ + "\u0001\u0010\u0001\u0010\u0001\u0010\u0003\u0010\u012e\b\u0010\u0001\u0011"+ + "\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011"+ + "\u0001\u0011\u0003\u0011\u0138\b\u0011\u0003\u0011\u013a\b\u0011\u0001"+ + "\u0012\u0001\u0012\u0001\u0012\u0003\u0012\u013f\b\u0012\u0001\u0012\u0001"+ + "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001"+ + "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0003\u0012\u014d"+ + "\b\u0012\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0003\u0013\u0153"+ + "\b\u0013\u0003\u0013\u0155\b\u0013\u0001\u0014\u0001\u0014\u0001\u0014"+ + "\u0001\u0014\u0005\u0014\u015b\b\u0014\n\u0014\f\u0014\u015e\t\u0014\u0003"+ + "\u0014\u0160\b\u0014\u0001\u0014\u0001\u0014\u0001\u0015\u0001\u0015\u0001"+ + "\u0015\u0003\u0015\u0167\b\u0015\u0001\u0016\u0001\u0016\u0001\u0016\u0001"+ + "\u0017\u0001\u0017\u0001\u0017\u0003\u0017\u016f\b\u0017\u0001\u0017\u0001"+ + "\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0005"+ + "\u0017\u0178\b\u0017\n\u0017\f\u0017\u017b\t\u0017\u0001\u0017\u0003\u0017"+ + "\u017e\b\u0017\u0003\u0017\u0180\b\u0017\u0001\u0018\u0001\u0018\u0003"+ + "\u0018\u0184\b\u0018\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0005"+ + "\u0019\u018a\b\u0019\n\u0019\f\u0019\u018d\t\u0019\u0003\u0019\u018f\b"+ + "\u0019\u0001\u0019\u0003\u0019\u0192\b\u0019\u0001\u0019\u0001\u0019\u0001"+ + "\u001a\u0001\u001a\u0003\u001a\u0198\b\u001a\u0001\u001b\u0001\u001b\u0001"+ + "\u001b\u0001\u001b\u0001\u001c\u0001\u001c\u0005\u001c\u01a0\b\u001c\n"+ + "\u001c\f\u001c\u01a3\t\u001c\u0001\u001c\u0001\u001c\u0001\u001d\u0001"+ + "\u001d\u0001\u001d\u0003\u001d\u01aa\b\u001d\u0001\u001e\u0003\u001e\u01ad"+ + "\b\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001f\u0001"+ + "\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001"+ + "\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001"+ + "\u001f\u0001\u001f\u0001\u001f\u0003\u001f\u01c3\b\u001f\u0001 \u0001"+ + " \u0001 \u0001 \u0003 \u01c9\b \u0001!\u0001!\u0001!\u0001\"\u0001\"\u0001"+ + "\"\u0003\"\u01d1\b\"\u0001\"\u0001\"\u0003\"\u01d5\b\"\u0001\"\u0001\""+ + "\u0003\"\u01d9\b\"\u0001\"\u0001\"\u0001\"\u0001#\u0001#\u0001#\u0001"+ + "#\u0001$\u0001$\u0001$\u0001$\u0001$\u0001$\u0001%\u0001%\u0001%\u0001"+ + "%\u0003%\u01ec\b%\u0001%\u0003%\u01ef\b%\u0001&\u0001&\u0001&\u0001&\u0005"+ + "&\u01f5\b&\n&\f&\u01f8\t&\u0001&\u0005&\u01fb\b&\n&\f&\u01fe\t&\u0001"+ + "&\u0001&\u0001\'\u0001\'\u0001\'\u0001\'\u0001(\u0001(\u0003(\u0208\b"+ + "(\u0001(\u0001(\u0001)\u0001)\u0001)\u0001)\u0001*\u0001*\u0003*\u0212"+ + "\b*\u0001*\u0001*\u0001+\u0001+\u0003+\u0218\b+\u0001+\u0001+\u0001,\u0001"+ + ",\u0001-\u0001-\u0001-\u0001.\u0001.\u0001.\u0001.\u0003.\u0225\b.\u0001"+ + ".\u0001.\u0001/\u0001/\u0001/\u0001/\u00010\u00010\u00011\u00011\u0001"+ + "2\u00042\u0232\b2\u000b2\f2\u0233\u00013\u00013\u00013\u00013\u00013\u0001"+ + "3\u00014\u00014\u00014\u00015\u00045\u0240\b5\u000b5\f5\u0241\u00015\u0004"+ + "5\u0245\b5\u000b5\f5\u0246\u00016\u00016\u00016\u00016\u00016\u00016\u0003"+ + "6\u024f\b6\u00017\u00017\u00017\u00057\u0254\b7\n7\f7\u0257\t7\u00017"+ + "\u00037\u025a\b7\u00017\u00017\u00017\u00037\u025f\b7\u00018\u00018\u0001"+ + "8\u00058\u0264\b8\n8\f8\u0267\t8\u00019\u00019\u0001:\u0001:\u0001:\u0005"+ + ":\u026e\b:\n:\f:\u0271\t:\u0001;\u0001;\u0003;\u0275\b;\u0001;\u0001;"+ + "\u0003;\u0279\b;\u0001<\u0001<\u0003<\u027d\b<\u0001=\u0001=\u0003=\u0281"+ + "\b=\u0001=\u0001=\u0001=\u0001>\u0001>\u0001>\u0001>\u0003>\u028a\b>\u0001"+ + ">\u0005>\u028d\b>\n>\f>\u0290\t>\u0001>\u0005>\u0293\b>\n>\f>\u0296\t"+ + ">\u0001>\u0001>\u0001?\u0001?\u0001?\u0001?\u0005?\u029e\b?\n?\f?\u02a1"+ + "\t?\u0001?\u0001?\u0003?\u02a5\b?\u0001?\u0001?\u0001@\u0001@\u0001A\u0005"+ + "A\u02ac\bA\nA\fA\u02af\tA\u0001A\u0001A\u0003A\u02b3\bA\u0001B\u0001B"+ + "\u0001B\u0003B\u02b8\bB\u0001B\u0003B\u02bb\bB\u0001B\u0001B\u0001C\u0001"+ + "C\u0001C\u0001D\u0001D\u0001D\u0001E\u0001E\u0001E\u0003E\u02c8\bE\u0001"+ + "E\u0001E\u0001F\u0001F\u0001F\u0001G\u0001G\u0001G\u0005G\u02d2\bG\nG"+ + "\fG\u02d5\tG\u0001H\u0001H\u0005H\u02d9\bH\nH\fH\u02dc\tH\u0001H\u0001"+ + "H\u0001I\u0001I\u0005I\u02e2\bI\nI\fI\u02e5\tI\u0001I\u0001I\u0001J\u0001"+ + "J\u0001J\u0001J\u0003J\u02ed\bJ\u0001K\u0001K\u0001L\u0001L\u0001M\u0001"+ + "M\u0001M\u0001N\u0001N\u0001N\u0001N\u0003N\u02fa\bN\u0001O\u0005O\u02fd"+ + "\bO\nO\fO\u0300\tO\u0001O\u0001O\u0001O\u0001O\u0003O\u0306\bO\u0001O"+ + "\u0003O\u0309\bO\u0001O\u0001O\u0003O\u030d\bO\u0001P\u0001P\u0003P\u0311"+ + "\bP\u0001Q\u0001Q\u0001Q\u0001R\u0005R\u0317\bR\nR\fR\u031a\tR\u0001R"+ + "\u0001R\u0001R\u0001R\u0001S\u0005S\u0321\bS\nS\fS\u0324\tS\u0001S\u0001"+ + "S\u0001S\u0003S\u0329\bS\u0001S\u0001S\u0001T\u0001T\u0003T\u032f\bT\u0001"+ + "T\u0005T\u0332\bT\nT\fT\u0335\tT\u0001T\u0001T\u0001U\u0001U\u0001U\u0001"+ + "U\u0001V\u0001V\u0003V\u033f\bV\u0001W\u0001W\u0001W\u0003W\u0344\bW\u0001"+ + "X\u0005X\u0347\bX\nX\fX\u034a\tX\u0001X\u0001X\u0001X\u0001X\u0003X\u0350"+ + "\bX\u0001X\u0003X\u0353\bX\u0001X\u0001X\u0001Y\u0005Y\u0358\bY\nY\fY"+ + "\u035b\tY\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Z\u0001Z\u0001Z\u0005"+ + "Z\u0365\bZ\nZ\fZ\u0368\tZ\u0001[\u0001[\u0001[\u0001[\u0005[\u036e\b["+ + "\n[\f[\u0371\t[\u0003[\u0373\b[\u0001[\u0001[\u0001\\\u0003\\\u0378\b"+ + "\\\u0001\\\u0001\\\u0001\\\u0001\\\u0000\u0000]\u0000\u0002\u0004\u0006"+ + "\b\n\f\u000e\u0010\u0012\u0014\u0016\u0018\u001a\u001c\u001e \"$&(*,."+ + "02468:<>@BDFHJLNPRTVXZ\\^`bdfhjlnprtvxz|~\u0080\u0082\u0084\u0086\u0088"+ + "\u008a\u008c\u008e\u0090\u0092\u0094\u0096\u0098\u009a\u009c\u009e\u00a0"+ + "\u00a2\u00a4\u00a6\u00a8\u00aa\u00ac\u00ae\u00b0\u00b2\u00b4\u00b6\u00b8"+ + "\u0000\b\u0001\u0000_d\b\u0000\u0003\u0003\u0005\u0005\b\b\r\r\u0012\u0012"+ + "\u0018\u0018\u001a\u001a\"\"\u0002\u0000;;S]\u0002\u0000<@ER\u0002\u0000"+ + "<=AD\u0001\u0000AB\b\u0000\u0001\u0001\u0010\u0010\u001b\u001b\u001e "+ + "#$\'\'++..\u0002\u0000%%((\u03a1\u0000\u00ba\u0001\u0000\u0000\u0000\u0002"+ + "\u00bc\u0001\u0000\u0000\u0000\u0004\u00c4\u0001\u0000\u0000\u0000\u0006"+ + "\u00cb\u0001\u0000\u0000\u0000\b\u00cd\u0001\u0000\u0000\u0000\n\u00d1"+ + "\u0001\u0000\u0000\u0000\f\u00d5\u0001\u0000\u0000\u0000\u000e\u00db\u0001"+ + "\u0000\u0000\u0000\u0010\u00dd\u0001\u0000\u0000\u0000\u0012\u00e1\u0001"+ + "\u0000\u0000\u0000\u0014\u00e6\u0001\u0000\u0000\u0000\u0016\u00ee\u0001"+ + "\u0000\u0000\u0000\u0018\u00f5\u0001\u0000\u0000\u0000\u001a\u010f\u0001"+ + "\u0000\u0000\u0000\u001c\u0111\u0001\u0000\u0000\u0000\u001e\u0113\u0001"+ + "\u0000\u0000\u0000 \u012d\u0001\u0000\u0000\u0000\"\u0139\u0001\u0000"+ + "\u0000\u0000$\u014c\u0001\u0000\u0000\u0000&\u0154\u0001\u0000\u0000\u0000"+ + "(\u0156\u0001\u0000\u0000\u0000*\u0163\u0001\u0000\u0000\u0000,\u0168"+ + "\u0001\u0000\u0000\u0000.\u016b\u0001\u0000\u0000\u00000\u0181\u0001\u0000"+ + "\u0000\u00002\u0185\u0001\u0000\u0000\u00004\u0197\u0001\u0000\u0000\u0000"+ + "6\u0199\u0001\u0000\u0000\u00008\u019d\u0001\u0000\u0000\u0000:\u01a9"+ + "\u0001\u0000\u0000\u0000<\u01ac\u0001\u0000\u0000\u0000>\u01c2\u0001\u0000"+ + "\u0000\u0000@\u01c4\u0001\u0000\u0000\u0000B\u01ca\u0001\u0000\u0000\u0000"+ + "D\u01cd\u0001\u0000\u0000\u0000F\u01dd\u0001\u0000\u0000\u0000H\u01e1"+ + "\u0001\u0000\u0000\u0000J\u01e7\u0001\u0000\u0000\u0000L\u01f0\u0001\u0000"+ + "\u0000\u0000N\u0201\u0001\u0000\u0000\u0000P\u0205\u0001\u0000\u0000\u0000"+ + "R\u020b\u0001\u0000\u0000\u0000T\u020f\u0001\u0000\u0000\u0000V\u0215"+ + "\u0001\u0000\u0000\u0000X\u021b\u0001\u0000\u0000\u0000Z\u021d\u0001\u0000"+ + "\u0000\u0000\\\u0220\u0001\u0000\u0000\u0000^\u0228\u0001\u0000\u0000"+ + "\u0000`\u022c\u0001\u0000\u0000\u0000b\u022e\u0001\u0000\u0000\u0000d"+ + "\u0231\u0001\u0000\u0000\u0000f\u0235\u0001\u0000\u0000\u0000h\u023b\u0001"+ + "\u0000\u0000\u0000j\u023f\u0001\u0000\u0000\u0000l\u024e\u0001\u0000\u0000"+ + "\u0000n\u025e\u0001\u0000\u0000\u0000p\u0260\u0001\u0000\u0000\u0000r"+ + "\u0268\u0001\u0000\u0000\u0000t\u026a\u0001\u0000\u0000\u0000v\u0272\u0001"+ + "\u0000\u0000\u0000x\u027a\u0001\u0000\u0000\u0000z\u027e\u0001\u0000\u0000"+ + "\u0000|\u0289\u0001\u0000\u0000\u0000~\u0299\u0001\u0000\u0000\u0000\u0080"+ + "\u02a8\u0001\u0000\u0000\u0000\u0082\u02ad\u0001\u0000\u0000\u0000\u0084"+ + "\u02b4\u0001\u0000\u0000\u0000\u0086\u02be\u0001\u0000\u0000\u0000\u0088"+ + "\u02c1\u0001\u0000\u0000\u0000\u008a\u02c4\u0001\u0000\u0000\u0000\u008c"+ + "\u02cb\u0001\u0000\u0000\u0000\u008e\u02ce\u0001\u0000\u0000\u0000\u0090"+ + "\u02d6\u0001\u0000\u0000\u0000\u0092\u02df\u0001\u0000\u0000\u0000\u0094"+ + "\u02ec\u0001\u0000\u0000\u0000\u0096\u02ee\u0001\u0000\u0000\u0000\u0098"+ + "\u02f0\u0001\u0000\u0000\u0000\u009a\u02f2\u0001\u0000\u0000\u0000\u009c"+ + "\u02f9\u0001\u0000\u0000\u0000\u009e\u02fe\u0001\u0000\u0000\u0000\u00a0"+ + "\u0310\u0001\u0000\u0000\u0000\u00a2\u0312\u0001\u0000\u0000\u0000\u00a4"+ + "\u0318\u0001\u0000\u0000\u0000\u00a6\u0322\u0001\u0000\u0000\u0000\u00a8"+ + "\u032c\u0001\u0000\u0000\u0000\u00aa\u0338\u0001\u0000\u0000\u0000\u00ac"+ + "\u033e\u0001\u0000\u0000\u0000\u00ae\u0343\u0001\u0000\u0000\u0000\u00b0"+ + "\u0348\u0001\u0000\u0000\u0000\u00b2\u0359\u0001\u0000\u0000\u0000\u00b4"+ + "\u0361\u0001\u0000\u0000\u0000\u00b6\u0369\u0001\u0000\u0000\u0000\u00b8"+ + "\u0377\u0001\u0000\u0000\u0000\u00ba\u00bb\u0005^\u0000\u0000\u00bb\u0001"+ + "\u0001\u0000\u0000\u0000\u00bc\u00c1\u0003\u0000\u0000\u0000\u00bd\u00be"+ + "\u00052\u0000\u0000\u00be\u00c0\u0003\u0000\u0000\u0000\u00bf\u00bd\u0001"+ + "\u0000\u0000\u0000\u00c0\u00c3\u0001\u0000\u0000\u0000\u00c1\u00bf\u0001"+ + "\u0000\u0000\u0000\u00c1\u00c2\u0001\u0000\u0000\u0000\u00c2\u0003\u0001"+ + "\u0000\u0000\u0000\u00c3\u00c1\u0001\u0000\u0000\u0000\u00c4\u00c5\u0007"+ + "\u0000\u0000\u0000\u00c5\u0005\u0001\u0000\u0000\u0000\u00c6\u00c8\u0003"+ + "\u0002\u0001\u0000\u00c7\u00c9\u0003\n\u0005\u0000\u00c8\u00c7\u0001\u0000"+ + "\u0000\u0000\u00c8\u00c9\u0001\u0000\u0000\u0000\u00c9\u00cc\u0001\u0000"+ + "\u0000\u0000\u00ca\u00cc\u0003\b\u0004\u0000\u00cb\u00c6\u0001\u0000\u0000"+ + "\u0000\u00cb\u00ca\u0001\u0000\u0000\u0000\u00cc\u0007\u0001\u0000\u0000"+ + "\u0000\u00cd\u00ce\u0007\u0001\u0000\u0000\u00ce\t\u0001\u0000\u0000\u0000"+ + "\u00cf\u00d0\u00057\u0000\u0000\u00d0\u00d2\u00058\u0000\u0000\u00d1\u00cf"+ + "\u0001\u0000\u0000\u0000\u00d2\u00d3\u0001\u0000\u0000\u0000\u00d3\u00d1"+ + "\u0001\u0000\u0000\u0000\u00d3\u00d4\u0001\u0000\u0000\u0000\u00d4\u000b"+ + "\u0001\u0000\u0000\u0000\u00d5\u00d9\u0003\u0010\b\u0000\u00d6\u00d7\u0003"+ + "\u000e\u0007\u0000\u00d7\u00d8\u0003\u0010\b\u0000\u00d8\u00da\u0001\u0000"+ + "\u0000\u0000\u00d9\u00d6\u0001\u0000\u0000\u0000\u00d9\u00da\u0001\u0000"+ + "\u0000\u0000\u00da\r\u0001\u0000\u0000\u0000\u00db\u00dc\u0007\u0002\u0000"+ + "\u0000\u00dc\u000f\u0001\u0000\u0000\u0000\u00dd\u00df\u0003\u0014\n\u0000"+ + "\u00de\u00e0\u0003\u0012\t\u0000\u00df\u00de\u0001\u0000\u0000\u0000\u00df"+ + "\u00e0\u0001\u0000\u0000\u0000\u00e0\u0011\u0001\u0000\u0000\u0000\u00e1"+ + "\u00e2\u0005:\u0000\u0000\u00e2\u00e3\u0003\f\u0006\u0000\u00e3\u00e4"+ + "\u00059\u0000\u0000\u00e4\u00e5\u0003\u0010\b\u0000\u00e5\u0013\u0001"+ + "\u0000\u0000\u0000\u00e6\u00e7\u0003\u001a\r\u0000\u00e7\u00e8\u0003\u0016"+ + "\u000b\u0000\u00e8\u0015\u0001\u0000\u0000\u0000\u00e9\u00ea\u0003\u0018"+ + "\f\u0000\u00ea\u00eb\u0003\u001a\r\u0000\u00eb\u00ed\u0001\u0000\u0000"+ + "\u0000\u00ec\u00e9\u0001\u0000\u0000\u0000\u00ed\u00f0\u0001\u0000\u0000"+ + "\u0000\u00ee\u00ec\u0001\u0000\u0000\u0000\u00ee\u00ef\u0001\u0000\u0000"+ + "\u0000\u00ef\u00f3\u0001\u0000\u0000\u0000\u00f0\u00ee\u0001\u0000\u0000"+ + "\u0000\u00f1\u00f2\u0005\u0017\u0000\u0000\u00f2\u00f4\u0003\u0006\u0003"+ + "\u0000\u00f3\u00f1\u0001\u0000\u0000\u0000\u00f3\u00f4\u0001\u0000\u0000"+ + "\u0000\u00f4\u0017\u0001\u0000\u0000\u0000\u00f5\u00f6\u0007\u0003\u0000"+ + "\u0000\u00f6\u0019\u0001\u0000\u0000\u0000\u00f7\u00f8\u0003\u001c\u000e"+ + "\u0000\u00f8\u00f9\u0003\u001a\r\u0000\u00f9\u0110\u0001\u0000\u0000\u0000"+ + "\u00fa\u00fd\u00053\u0000\u0000\u00fb\u00fe\u0003\f\u0006\u0000\u00fc"+ + "\u00fe\u0003\u0006\u0003\u0000\u00fd\u00fb\u0001\u0000\u0000\u0000\u00fd"+ + "\u00fc\u0001\u0000\u0000\u0000\u00fe\u00ff\u0001\u0000\u0000\u0000\u00ff"+ + "\u0100\u00054\u0000\u0000\u0100\u0101\u0003\u001a\r\u0000\u0101\u0110"+ + "\u0001\u0000\u0000\u0000\u0102\u0106\u0003 \u0010\u0000\u0103\u0105\u0003"+ + "$\u0012\u0000\u0104\u0103\u0001\u0000\u0000\u0000\u0105\u0108\u0001\u0000"+ + "\u0000\u0000\u0106\u0104\u0001\u0000\u0000\u0000\u0106\u0107\u0001\u0000"+ + "\u0000\u0000\u0107\u010c\u0001\u0000\u0000\u0000\u0108\u0106\u0001\u0000"+ + "\u0000\u0000\u0109\u010b\u0003\u001e\u000f\u0000\u010a\u0109\u0001\u0000"+ + "\u0000\u0000\u010b\u010e\u0001\u0000\u0000\u0000\u010c\u010a\u0001\u0000"+ + "\u0000\u0000\u010c\u010d\u0001\u0000\u0000\u0000\u010d\u0110\u0001\u0000"+ + "\u0000\u0000\u010e\u010c\u0001\u0000\u0000\u0000\u010f\u00f7\u0001\u0000"+ + "\u0000\u0000\u010f\u00fa\u0001\u0000\u0000\u0000\u010f\u0102\u0001\u0000"+ + "\u0000\u0000\u0110\u001b\u0001\u0000\u0000\u0000\u0111\u0112\u0007\u0004"+ + "\u0000\u0000\u0112\u001d\u0001\u0000\u0000\u0000\u0113\u0114\u0007\u0005"+ + "\u0000\u0000\u0114\u001f\u0001\u0000\u0000\u0000\u0115\u012e\u00036\u001b"+ + "\u0000\u0116\u0118\u0005(\u0000\u0000\u0117\u0119\u0003(\u0014\u0000\u0118"+ + "\u0117\u0001\u0000\u0000\u0000\u0118\u0119\u0001\u0000\u0000\u0000\u0119"+ + "\u012e\u0001\u0000\u0000\u0000\u011a\u011b\u0005%\u0000\u0000\u011b\u012e"+ + "\u0003&\u0013\u0000\u011c\u012e\u0003\u0004\u0002\u0000\u011d\u011e\u0005"+ + "\u001c\u0000\u0000\u011e\u012e\u0003*\u0015\u0000\u011f\u0121\u0003\u0002"+ + "\u0001\u0000\u0120\u0122\u0003\"\u0011\u0000\u0121\u0120\u0001\u0000\u0000"+ + "\u0000\u0121\u0122\u0001\u0000\u0000\u0000\u0122\u012e\u0001\u0000\u0000"+ + "\u0000\u0123\u0125\u0003\b\u0004\u0000\u0124\u0126\u0003\n\u0005\u0000"+ + "\u0125\u0124\u0001\u0000\u0000\u0000\u0125\u0126\u0001\u0000\u0000\u0000"+ + "\u0126\u0127\u0001\u0000\u0000\u0000\u0127\u0128\u00052\u0000\u0000\u0128"+ + "\u0129\u0005\t\u0000\u0000\u0129\u012e\u0001\u0000\u0000\u0000\u012a\u012b"+ + "\u0005-\u0000\u0000\u012b\u012c\u00052\u0000\u0000\u012c\u012e\u0005\t"+ + "\u0000\u0000\u012d\u0115\u0001\u0000\u0000\u0000\u012d\u0116\u0001\u0000"+ + "\u0000\u0000\u012d\u011a\u0001\u0000\u0000\u0000\u012d\u011c\u0001\u0000"+ + "\u0000\u0000\u012d\u011d\u0001\u0000\u0000\u0000\u012d\u011f\u0001\u0000"+ + "\u0000\u0000\u012d\u0123\u0001\u0000\u0000\u0000\u012d\u012a\u0001\u0000"+ + "\u0000\u0000\u012e!\u0001\u0000\u0000\u0000\u012f\u013a\u0003(\u0014\u0000"+ + "\u0130\u0137\u00052\u0000\u0000\u0131\u0138\u0005\t\u0000\u0000\u0132"+ + "\u0138\u0005(\u0000\u0000\u0133\u0134\u0005%\u0000\u0000\u0134\u0138\u0003"+ + "&\u0013\u0000\u0135\u0136\u0005\u001c\u0000\u0000\u0136\u0138\u0003,\u0016"+ + "\u0000\u0137\u0131\u0001\u0000\u0000\u0000\u0137\u0132\u0001\u0000\u0000"+ + "\u0000\u0137\u0133\u0001\u0000\u0000\u0000\u0137\u0135\u0001\u0000\u0000"+ + "\u0000\u0138\u013a\u0001\u0000\u0000\u0000\u0139\u012f\u0001\u0000\u0000"+ + "\u0000\u0139\u0130\u0001\u0000\u0000\u0000\u013a#\u0001\u0000\u0000\u0000"+ + "\u013b\u013c\u00052\u0000\u0000\u013c\u013e\u0003\u0000\u0000\u0000\u013d"+ + "\u013f\u0003(\u0014\u0000\u013e\u013d\u0001\u0000\u0000\u0000\u013e\u013f"+ + "\u0001\u0000\u0000\u0000\u013f\u014d\u0001\u0000\u0000\u0000\u0140\u0141"+ + "\u00052\u0000\u0000\u0141\u014d\u0005(\u0000\u0000\u0142\u0143\u00052"+ + "\u0000\u0000\u0143\u0144\u0005%\u0000\u0000\u0144\u014d\u0003&\u0013\u0000"+ + "\u0145\u0146\u00052\u0000\u0000\u0146\u0147\u0005\u001c\u0000\u0000\u0147"+ + "\u014d\u0003,\u0016\u0000\u0148\u0149\u00057\u0000\u0000\u0149\u014a\u0003"+ + "\f\u0006\u0000\u014a\u014b\u00058\u0000\u0000\u014b\u014d\u0001\u0000"+ + "\u0000\u0000\u014c\u013b\u0001\u0000\u0000\u0000\u014c\u0140\u0001\u0000"+ + "\u0000\u0000\u014c\u0142\u0001\u0000\u0000\u0000\u014c\u0145\u0001\u0000"+ + "\u0000\u0000\u014c\u0148\u0001\u0000\u0000\u0000\u014d%\u0001\u0000\u0000"+ + "\u0000\u014e\u0155\u0003(\u0014\u0000\u014f\u0150\u00052\u0000\u0000\u0150"+ + "\u0152\u0003\u0000\u0000\u0000\u0151\u0153\u0003(\u0014\u0000\u0152\u0151"+ + "\u0001\u0000\u0000\u0000\u0152\u0153\u0001\u0000\u0000\u0000\u0153\u0155"+ + "\u0001\u0000\u0000\u0000\u0154\u014e\u0001\u0000\u0000\u0000\u0154\u014f"+ + "\u0001\u0000\u0000\u0000\u0155\'\u0001\u0000\u0000\u0000\u0156\u015f\u0005"+ + "3\u0000\u0000\u0157\u015c\u0003\f\u0006\u0000\u0158\u0159\u00051\u0000"+ + "\u0000\u0159\u015b\u0003\f\u0006\u0000\u015a\u0158\u0001\u0000\u0000\u0000"+ + "\u015b\u015e\u0001\u0000\u0000\u0000\u015c\u015a\u0001\u0000\u0000\u0000"+ + "\u015c\u015d\u0001\u0000\u0000\u0000\u015d\u0160\u0001\u0000\u0000\u0000"+ + "\u015e\u015c\u0001\u0000\u0000\u0000\u015f\u0157\u0001\u0000\u0000\u0000"+ + "\u015f\u0160\u0001\u0000\u0000\u0000\u0160\u0161\u0001\u0000\u0000\u0000"+ + "\u0161\u0162\u00054\u0000\u0000\u0162)\u0001\u0000\u0000\u0000\u0163\u0166"+ + "\u0003\u0002\u0001\u0000\u0164\u0167\u0003.\u0017\u0000\u0165\u0167\u0003"+ + "0\u0018\u0000\u0166\u0164\u0001\u0000\u0000\u0000\u0166\u0165\u0001\u0000"+ + "\u0000\u0000\u0167+\u0001\u0000\u0000\u0000\u0168\u0169\u0003\u0000\u0000"+ + "\u0000\u0169\u016a\u00030\u0018\u0000\u016a-\u0001\u0000\u0000\u0000\u016b"+ + "\u017f\u00057\u0000\u0000\u016c\u016e\u00058\u0000\u0000\u016d\u016f\u0003"+ + "\n\u0005\u0000\u016e\u016d\u0001\u0000\u0000\u0000\u016e\u016f\u0001\u0000"+ + "\u0000\u0000\u016f\u0170\u0001\u0000\u0000\u0000\u0170\u0180\u00032\u0019"+ + "\u0000\u0171\u0172\u0003\f\u0006\u0000\u0172\u0179\u00058\u0000\u0000"+ + "\u0173\u0174\u00057\u0000\u0000\u0174\u0175\u0003\f\u0006\u0000\u0175"+ + "\u0176\u00058\u0000\u0000\u0176\u0178\u0001\u0000\u0000\u0000\u0177\u0173"+ + "\u0001\u0000\u0000\u0000\u0178\u017b\u0001\u0000\u0000\u0000\u0179\u0177"+ + "\u0001\u0000\u0000\u0000\u0179\u017a\u0001\u0000\u0000\u0000\u017a\u017d"+ + "\u0001\u0000\u0000\u0000\u017b\u0179\u0001\u0000\u0000\u0000\u017c\u017e"+ + "\u0003\n\u0005\u0000\u017d\u017c\u0001\u0000\u0000\u0000\u017d\u017e\u0001"+ + "\u0000\u0000\u0000\u017e\u0180\u0001\u0000\u0000\u0000\u017f\u016c\u0001"+ + "\u0000\u0000\u0000\u017f\u0171\u0001\u0000\u0000\u0000\u0180/\u0001\u0000"+ + "\u0000\u0000\u0181\u0183\u0003(\u0014\u0000\u0182\u0184\u0003\u0090H\u0000"+ + "\u0183\u0182\u0001\u0000\u0000\u0000\u0183\u0184\u0001\u0000\u0000\u0000"+ + "\u01841\u0001\u0000\u0000\u0000\u0185\u018e\u00055\u0000\u0000\u0186\u018b"+ + "\u00034\u001a\u0000\u0187\u0188\u00051\u0000\u0000\u0188\u018a\u00034"+ + "\u001a\u0000\u0189\u0187\u0001\u0000\u0000\u0000\u018a\u018d\u0001\u0000"+ + "\u0000\u0000\u018b\u0189\u0001\u0000\u0000\u0000\u018b\u018c\u0001\u0000"+ + "\u0000\u0000\u018c\u018f\u0001\u0000\u0000\u0000\u018d\u018b\u0001\u0000"+ + "\u0000\u0000\u018e\u0186\u0001\u0000\u0000\u0000\u018e\u018f\u0001\u0000"+ + "\u0000\u0000\u018f\u0191\u0001\u0000\u0000\u0000\u0190\u0192\u00051\u0000"+ + "\u0000\u0191\u0190\u0001\u0000\u0000\u0000\u0191\u0192\u0001\u0000\u0000"+ + "\u0000\u0192\u0193\u0001\u0000\u0000\u0000\u0193\u0194\u00056\u0000\u0000"+ + "\u01943\u0001\u0000\u0000\u0000\u0195\u0198\u00032\u0019\u0000\u0196\u0198"+ + "\u0003\f\u0006\u0000\u0197\u0195\u0001\u0000\u0000\u0000\u0197\u0196\u0001"+ + "\u0000\u0000\u0000\u01985\u0001\u0000\u0000\u0000\u0199\u019a\u00053\u0000"+ + "\u0000\u019a\u019b\u0003\f\u0006\u0000\u019b\u019c\u00054\u0000\u0000"+ + "\u019c7\u0001\u0000\u0000\u0000\u019d\u01a1\u00055\u0000\u0000\u019e\u01a0"+ + "\u0003:\u001d\u0000\u019f\u019e\u0001\u0000\u0000\u0000\u01a0\u01a3\u0001"+ + "\u0000\u0000\u0000\u01a1\u019f\u0001\u0000\u0000\u0000\u01a1\u01a2\u0001"+ + "\u0000\u0000\u0000\u01a2\u01a4\u0001\u0000\u0000\u0000\u01a3\u01a1\u0001"+ + "\u0000\u0000\u0000\u01a4\u01a5\u00056\u0000\u0000\u01a59\u0001\u0000\u0000"+ + "\u0000\u01a6\u01aa\u0003<\u001e\u0000\u01a7\u01aa\u0003\u0082A\u0000\u01a8"+ + "\u01aa\u0003>\u001f\u0000\u01a9\u01a6\u0001\u0000\u0000\u0000\u01a9\u01a7"+ + "\u0001\u0000\u0000\u0000\u01a9\u01a8\u0001\u0000\u0000\u0000\u01aa;\u0001"+ + "\u0000\u0000\u0000\u01ab\u01ad\u0005\u0010\u0000\u0000\u01ac\u01ab\u0001"+ + "\u0000\u0000\u0000\u01ac\u01ad\u0001\u0000\u0000\u0000\u01ad\u01ae\u0001"+ + "\u0000\u0000\u0000\u01ae\u01af\u0003\u0006\u0003\u0000\u01af\u01b0\u0003"+ + "t:\u0000\u01b0\u01b1\u00050\u0000\u0000\u01b1=\u0001\u0000\u0000\u0000"+ + "\u01b2\u01c3\u00038\u001c\u0000\u01b3\u01c3\u0003^/\u0000\u01b4\u01c3"+ + "\u0003@ \u0000\u01b5\u01c3\u0003D\"\u0000\u01b6\u01c3\u0003F#\u0000\u01b7"+ + "\u01c3\u0003H$\u0000\u01b8\u01c3\u0003J%\u0000\u01b9\u01c3\u0003L&\u0000"+ + "\u01ba\u01c3\u0003N\'\u0000\u01bb\u01c3\u0003P(\u0000\u01bc\u01c3\u0003"+ + "R)\u0000\u01bd\u01c3\u0003T*\u0000\u01be\u01c3\u0003V+\u0000\u01bf\u01c3"+ + "\u0003X,\u0000\u01c0\u01c3\u0003Z-\u0000\u01c1\u01c3\u0003\\.\u0000\u01c2"+ + "\u01b2\u0001\u0000\u0000\u0000\u01c2\u01b3\u0001\u0000\u0000\u0000\u01c2"+ + "\u01b4\u0001\u0000\u0000\u0000\u01c2\u01b5\u0001\u0000\u0000\u0000\u01c2"+ + "\u01b6\u0001\u0000\u0000\u0000\u01c2\u01b7\u0001\u0000\u0000\u0000\u01c2"+ + "\u01b8\u0001\u0000\u0000\u0000\u01c2\u01b9\u0001\u0000\u0000\u0000\u01c2"+ + "\u01ba\u0001\u0000\u0000\u0000\u01c2\u01bb\u0001\u0000\u0000\u0000\u01c2"+ + "\u01bc\u0001\u0000\u0000\u0000\u01c2\u01bd\u0001\u0000\u0000\u0000\u01c2"+ + "\u01be\u0001\u0000\u0000\u0000\u01c2\u01bf\u0001\u0000\u0000\u0000\u01c2"+ + "\u01c0\u0001\u0000\u0000\u0000\u01c2\u01c1\u0001\u0000\u0000\u0000\u01c3"+ + "?\u0001\u0000\u0000\u0000\u01c4\u01c5\u0005\u0014\u0000\u0000\u01c5\u01c6"+ + "\u00036\u001b\u0000\u01c6\u01c8\u0003>\u001f\u0000\u01c7\u01c9\u0003B"+ + "!\u0000\u01c8\u01c7\u0001\u0000\u0000\u0000\u01c8\u01c9\u0001\u0000\u0000"+ + "\u0000\u01c9A\u0001\u0000\u0000\u0000\u01ca\u01cb\u0005\u000e\u0000\u0000"+ + "\u01cb\u01cc\u0003>\u001f\u0000\u01ccC\u0001\u0000\u0000\u0000\u01cd\u01ce"+ + "\u0005\u0013\u0000\u0000\u01ce\u01d0\u00053\u0000\u0000\u01cf\u01d1\u0003"+ + "n7\u0000\u01d0\u01cf\u0001\u0000\u0000\u0000\u01d0\u01d1\u0001\u0000\u0000"+ + "\u0000\u01d1\u01d2\u0001\u0000\u0000\u0000\u01d2\u01d4\u00050\u0000\u0000"+ + "\u01d3\u01d5\u0003\f\u0006\u0000\u01d4\u01d3\u0001\u0000\u0000\u0000\u01d4"+ + "\u01d5\u0001\u0000\u0000\u0000\u01d5\u01d6\u0001\u0000\u0000\u0000\u01d6"+ + "\u01d8\u00050\u0000\u0000\u01d7\u01d9\u0003p8\u0000\u01d8\u01d7\u0001"+ + "\u0000\u0000\u0000\u01d8\u01d9\u0001\u0000\u0000\u0000\u01d9\u01da\u0001"+ + "\u0000\u0000\u0000\u01da\u01db\u00054\u0000\u0000\u01db\u01dc\u0003>\u001f"+ + "\u0000\u01dcE\u0001\u0000\u0000\u0000\u01dd\u01de\u0005/\u0000\u0000\u01de"+ + "\u01df\u00036\u001b\u0000\u01df\u01e0\u0003>\u001f\u0000\u01e0G\u0001"+ + "\u0000\u0000\u0000\u01e1\u01e2\u0005\f\u0000\u0000\u01e2\u01e3\u0003>"+ + "\u001f\u0000\u01e3\u01e4\u0005/\u0000\u0000\u01e4\u01e5\u00036\u001b\u0000"+ + "\u01e5\u01e6\u00050\u0000\u0000\u01e6I\u0001\u0000\u0000\u0000\u01e7\u01e8"+ + "\u0005,\u0000\u0000\u01e8\u01ee\u00038\u001c\u0000\u01e9\u01ef\u0003d"+ + "2\u0000\u01ea\u01ec\u0003d2\u0000\u01eb\u01ea\u0001\u0000\u0000\u0000"+ + "\u01eb\u01ec\u0001\u0000\u0000\u0000\u01ec\u01ed\u0001\u0000\u0000\u0000"+ + "\u01ed\u01ef\u0003h4\u0000\u01ee\u01e9\u0001\u0000\u0000\u0000\u01ee\u01eb"+ + "\u0001\u0000\u0000\u0000\u01efK\u0001\u0000\u0000\u0000\u01f0\u01f1\u0005"+ + "&\u0000\u0000\u01f1\u01f2\u00036\u001b\u0000\u01f2\u01f6\u00055\u0000"+ + "\u0000\u01f3\u01f5\u0003j5\u0000\u01f4\u01f3\u0001\u0000\u0000\u0000\u01f5"+ + "\u01f8\u0001\u0000\u0000\u0000\u01f6\u01f4\u0001\u0000\u0000\u0000\u01f6"+ + "\u01f7\u0001\u0000\u0000\u0000\u01f7\u01fc\u0001\u0000\u0000\u0000\u01f8"+ + "\u01f6\u0001\u0000\u0000\u0000\u01f9\u01fb\u0003l6\u0000\u01fa\u01f9\u0001"+ + "\u0000\u0000\u0000\u01fb\u01fe\u0001\u0000\u0000\u0000\u01fc\u01fa\u0001"+ + "\u0000\u0000\u0000\u01fc\u01fd\u0001\u0000\u0000\u0000\u01fd\u01ff\u0001"+ + "\u0000\u0000\u0000\u01fe\u01fc\u0001\u0000\u0000\u0000\u01ff\u0200\u0005"+ + "6\u0000\u0000\u0200M\u0001\u0000\u0000\u0000\u0201\u0202\u0005\'\u0000"+ + "\u0000\u0202\u0203\u00036\u001b\u0000\u0203\u0204\u00038\u001c\u0000\u0204"+ + "O\u0001\u0000\u0000\u0000\u0205\u0207\u0005!\u0000\u0000\u0206\u0208\u0003"+ + "\f\u0006\u0000\u0207\u0206\u0001\u0000\u0000\u0000\u0207\u0208\u0001\u0000"+ + "\u0000\u0000\u0208\u0209\u0001\u0000\u0000\u0000\u0209\u020a\u00050\u0000"+ + "\u0000\u020aQ\u0001\u0000\u0000\u0000\u020b\u020c\u0005)\u0000\u0000\u020c"+ + "\u020d\u0003\f\u0006\u0000\u020d\u020e\u00050\u0000\u0000\u020eS\u0001"+ + "\u0000\u0000\u0000\u020f\u0211\u0005\u0004\u0000\u0000\u0210\u0212\u0003"+ + "\u0000\u0000\u0000\u0211\u0210\u0001\u0000\u0000\u0000\u0211\u0212\u0001"+ + "\u0000\u0000\u0000\u0212\u0213\u0001\u0000\u0000\u0000\u0213\u0214\u0005"+ + "0\u0000\u0000\u0214U\u0001\u0000\u0000\u0000\u0215\u0217\u0005\n\u0000"+ + "\u0000\u0216\u0218\u0003\u0000\u0000\u0000\u0217\u0216\u0001\u0000\u0000"+ + "\u0000\u0217\u0218\u0001\u0000\u0000\u0000\u0218\u0219\u0001\u0000\u0000"+ + "\u0000\u0219\u021a\u00050\u0000\u0000\u021aW\u0001\u0000\u0000\u0000\u021b"+ + "\u021c\u00050\u0000\u0000\u021cY\u0001\u0000\u0000\u0000\u021d\u021e\u0003"+ + "`0\u0000\u021e\u021f\u00050\u0000\u0000\u021f[\u0001\u0000\u0000\u0000"+ + "\u0220\u0221\u0005\u0002\u0000\u0000\u0221\u0224\u0003\f\u0006\u0000\u0222"+ + "\u0223\u00059\u0000\u0000\u0223\u0225\u0003\f\u0006\u0000\u0224\u0222"+ + "\u0001\u0000\u0000\u0000\u0224\u0225\u0001\u0000\u0000\u0000\u0225\u0226"+ + "\u0001\u0000\u0000\u0000\u0226\u0227\u00050\u0000\u0000\u0227]\u0001\u0000"+ + "\u0000\u0000\u0228\u0229\u0003\u0000\u0000\u0000\u0229\u022a\u00059\u0000"+ + "\u0000\u022a\u022b\u0003>\u001f\u0000\u022b_\u0001\u0000\u0000\u0000\u022c"+ + "\u022d\u0003\f\u0006\u0000\u022da\u0001\u0000\u0000\u0000\u022e\u022f"+ + "\u0003\f\u0006\u0000\u022fc\u0001\u0000\u0000\u0000\u0230\u0232\u0003"+ + "f3\u0000\u0231\u0230\u0001\u0000\u0000\u0000\u0232\u0233\u0001\u0000\u0000"+ + "\u0000\u0233\u0231\u0001\u0000\u0000\u0000\u0233\u0234\u0001\u0000\u0000"+ + "\u0000\u0234e\u0001\u0000\u0000\u0000\u0235\u0236\u0005\u0007\u0000\u0000"+ + "\u0236\u0237\u00053\u0000\u0000\u0237\u0238\u0003\u00b8\\\u0000\u0238"+ + "\u0239\u00054\u0000\u0000\u0239\u023a\u00038\u001c\u0000\u023ag\u0001"+ + "\u0000\u0000\u0000\u023b\u023c\u0005\u0011\u0000\u0000\u023c\u023d\u0003"+ + "8\u001c\u0000\u023di\u0001\u0000\u0000\u0000\u023e\u0240\u0003l6\u0000"+ + "\u023f\u023e\u0001\u0000\u0000\u0000\u0240\u0241\u0001\u0000\u0000\u0000"+ + "\u0241\u023f\u0001\u0000\u0000\u0000\u0241\u0242\u0001\u0000\u0000\u0000"+ + "\u0242\u0244\u0001\u0000\u0000\u0000\u0243\u0245\u0003:\u001d\u0000\u0244"+ + "\u0243\u0001\u0000\u0000\u0000\u0245\u0246\u0001\u0000\u0000\u0000\u0246"+ + "\u0244\u0001\u0000\u0000\u0000\u0246\u0247\u0001\u0000\u0000\u0000\u0247"+ + "k\u0001\u0000\u0000\u0000\u0248\u0249\u0005\u0006\u0000\u0000\u0249\u024a"+ + "\u0003b1\u0000\u024a\u024b\u00059\u0000\u0000\u024b\u024f\u0001\u0000"+ + "\u0000\u0000\u024c\u024d\u0005\u000b\u0000\u0000\u024d\u024f\u00059\u0000"+ + "\u0000\u024e\u0248\u0001\u0000\u0000\u0000\u024e\u024c\u0001\u0000\u0000"+ + "\u0000\u024fm\u0001\u0000\u0000\u0000\u0250\u0255\u0003`0\u0000\u0251"+ + "\u0252\u00051\u0000\u0000\u0252\u0254\u0003`0\u0000\u0253\u0251\u0001"+ + "\u0000\u0000\u0000\u0254\u0257\u0001\u0000\u0000\u0000\u0255\u0253\u0001"+ + "\u0000\u0000\u0000\u0255\u0256\u0001\u0000\u0000\u0000\u0256\u025f\u0001"+ + "\u0000\u0000\u0000\u0257\u0255\u0001\u0000\u0000\u0000\u0258\u025a\u0005"+ + "\u0010\u0000\u0000\u0259\u0258\u0001\u0000\u0000\u0000\u0259\u025a\u0001"+ + "\u0000\u0000\u0000\u025a\u025b\u0001\u0000\u0000\u0000\u025b\u025c\u0003"+ + "\u0006\u0003\u0000\u025c\u025d\u0003t:\u0000\u025d\u025f\u0001\u0000\u0000"+ + "\u0000\u025e\u0250\u0001\u0000\u0000\u0000\u025e\u0259\u0001\u0000\u0000"+ + "\u0000\u025fo\u0001\u0000\u0000\u0000\u0260\u0265\u0003`0\u0000\u0261"+ + "\u0262\u00051\u0000\u0000\u0262\u0264\u0003`0\u0000\u0263\u0261\u0001"+ + "\u0000\u0000\u0000\u0264\u0267\u0001\u0000\u0000\u0000\u0265\u0263\u0001"+ + "\u0000\u0000\u0000\u0265\u0266\u0001\u0000\u0000\u0000\u0266q\u0001\u0000"+ + "\u0000\u0000\u0267\u0265\u0001\u0000\u0000\u0000\u0268\u0269\u0007\u0006"+ + "\u0000\u0000\u0269s\u0001\u0000\u0000\u0000\u026a\u026f\u0003v;\u0000"+ + "\u026b\u026c\u00051\u0000\u0000\u026c\u026e\u0003v;\u0000\u026d\u026b"+ + "\u0001\u0000\u0000\u0000\u026e\u0271\u0001\u0000\u0000\u0000\u026f\u026d"+ + "\u0001\u0000\u0000\u0000\u026f\u0270\u0001\u0000\u0000\u0000\u0270u\u0001"+ + "\u0000\u0000\u0000\u0271\u026f\u0001\u0000\u0000\u0000\u0272\u0274\u0003"+ + "\u0000\u0000\u0000\u0273\u0275\u0003\n\u0005\u0000\u0274\u0273\u0001\u0000"+ + "\u0000\u0000\u0274\u0275\u0001\u0000\u0000\u0000\u0275\u0278\u0001\u0000"+ + "\u0000\u0000\u0276\u0277\u0005;\u0000\u0000\u0277\u0279\u00034\u001a\u0000"+ + "\u0278\u0276\u0001\u0000\u0000\u0000\u0278\u0279\u0001\u0000\u0000\u0000"+ + "\u0279w\u0001\u0000\u0000\u0000\u027a\u027c\u0003\u0000\u0000\u0000\u027b"+ + "\u027d\u0003\n\u0005\u0000\u027c\u027b\u0001\u0000\u0000\u0000\u027c\u027d"+ + "\u0001\u0000\u0000\u0000\u027dy\u0001\u0000\u0000\u0000\u027e\u0280\u0003"+ + "\u0000\u0000\u0000\u027f\u0281\u0003\n\u0005\u0000\u0280\u027f\u0001\u0000"+ + "\u0000\u0000\u0280\u0281\u0001\u0000\u0000\u0000\u0281\u0282\u0001\u0000"+ + "\u0000\u0000\u0282\u0283\u0005;\u0000\u0000\u0283\u0284\u00034\u001a\u0000"+ + "\u0284{\u0001\u0000\u0000\u0000\u0285\u0286\u0005\u001d\u0000\u0000\u0286"+ + "\u0287\u0003\u0002\u0001\u0000\u0287\u0288\u00050\u0000\u0000\u0288\u028a"+ + "\u0001\u0000\u0000\u0000\u0289\u0285\u0001\u0000\u0000\u0000\u0289\u028a"+ + "\u0001\u0000\u0000\u0000\u028a\u028e\u0001\u0000\u0000\u0000\u028b\u028d"+ + "\u0003~?\u0000\u028c\u028b\u0001\u0000\u0000\u0000\u028d\u0290\u0001\u0000"+ + "\u0000\u0000\u028e\u028c\u0001\u0000\u0000\u0000\u028e\u028f\u0001\u0000"+ + "\u0000\u0000\u028f\u0294\u0001\u0000\u0000\u0000\u0290\u028e\u0001\u0000"+ + "\u0000\u0000\u0291\u0293\u0003\u0080@\u0000\u0292\u0291\u0001\u0000\u0000"+ + "\u0000\u0293\u0296\u0001\u0000\u0000\u0000\u0294\u0292\u0001\u0000\u0000"+ + "\u0000\u0294\u0295\u0001\u0000\u0000\u0000\u0295\u0297\u0001\u0000\u0000"+ + "\u0000\u0296\u0294\u0001\u0000\u0000\u0000\u0297\u0298\u0005\u0000\u0000"+ + "\u0001\u0298}\u0001\u0000\u0000\u0000\u0299\u029a\u0005\u0016\u0000\u0000"+ + "\u029a\u029f\u0003\u0000\u0000\u0000\u029b\u029c\u00052\u0000\u0000\u029c"+ + "\u029e\u0003\u0000\u0000\u0000\u029d\u029b\u0001\u0000\u0000\u0000\u029e"+ + "\u02a1\u0001\u0000\u0000\u0000\u029f\u029d\u0001\u0000\u0000\u0000\u029f"+ + "\u02a0\u0001\u0000\u0000\u0000\u02a0\u02a4\u0001\u0000\u0000\u0000\u02a1"+ + "\u029f\u0001\u0000\u0000\u0000\u02a2\u02a3\u00052\u0000\u0000\u02a3\u02a5"+ + "\u0005>\u0000\u0000\u02a4\u02a2\u0001\u0000\u0000\u0000\u02a4\u02a5\u0001"+ + "\u0000\u0000\u0000\u02a5\u02a6\u0001\u0000\u0000\u0000\u02a6\u02a7\u0005"+ + "0\u0000\u0000\u02a7\u007f\u0001\u0000\u0000\u0000\u02a8\u02a9\u0003\u0082"+ + "A\u0000\u02a9\u0081\u0001\u0000\u0000\u0000\u02aa\u02ac\u0003r9\u0000"+ + "\u02ab\u02aa\u0001\u0000\u0000\u0000\u02ac\u02af\u0001\u0000\u0000\u0000"+ + "\u02ad\u02ab\u0001\u0000\u0000\u0000\u02ad\u02ae\u0001\u0000\u0000\u0000"+ + "\u02ae\u02b2\u0001\u0000\u0000\u0000\u02af\u02ad\u0001\u0000\u0000\u0000"+ + "\u02b0\u02b3\u0003\u0084B\u0000\u02b1\u02b3\u0003\u008aE\u0000\u02b2\u02b0"+ + "\u0001\u0000\u0000\u0000\u02b2\u02b1\u0001\u0000\u0000\u0000\u02b3\u0083"+ + "\u0001\u0000\u0000\u0000\u02b4\u02b5\u0005\t\u0000\u0000\u02b5\u02b7\u0003"+ + "\u0000\u0000\u0000\u02b6\u02b8\u0003\u0086C\u0000\u02b7\u02b6\u0001\u0000"+ + "\u0000\u0000\u02b7\u02b8\u0001\u0000\u0000\u0000\u02b8\u02ba\u0001\u0000"+ + "\u0000\u0000\u02b9\u02bb\u0003\u0088D\u0000\u02ba\u02b9\u0001\u0000\u0000"+ + "\u0000\u02ba\u02bb\u0001\u0000\u0000\u0000\u02bb\u02bc\u0001\u0000\u0000"+ + "\u0000\u02bc\u02bd\u0003\u0090H\u0000\u02bd\u0085\u0001\u0000\u0000\u0000"+ + "\u02be\u02bf\u0005\u000f\u0000\u0000\u02bf\u02c0\u0003\u0006\u0003\u0000"+ + "\u02c0\u0087\u0001\u0000\u0000\u0000\u02c1\u02c2\u0005\u0015\u0000\u0000"+ + "\u02c2\u02c3\u0003\u008eG\u0000\u02c3\u0089\u0001\u0000\u0000\u0000\u02c4"+ + "\u02c5\u0005\u0019\u0000\u0000\u02c5\u02c7\u0003\u0000\u0000\u0000\u02c6"+ + "\u02c8\u0003\u008cF\u0000\u02c7\u02c6\u0001\u0000\u0000\u0000\u02c7\u02c8"+ + "\u0001\u0000\u0000\u0000\u02c8\u02c9\u0001\u0000\u0000\u0000\u02c9\u02ca"+ + "\u0003\u0092I\u0000\u02ca\u008b\u0001\u0000\u0000\u0000\u02cb\u02cc\u0005"+ + "\u000f\u0000\u0000\u02cc\u02cd\u0003\u008eG\u0000\u02cd\u008d\u0001\u0000"+ + "\u0000\u0000\u02ce\u02d3\u0003\u0006\u0003\u0000\u02cf\u02d0\u00051\u0000"+ + "\u0000\u02d0\u02d2\u0003\u0006\u0003\u0000\u02d1\u02cf\u0001\u0000\u0000"+ + "\u0000\u02d2\u02d5\u0001\u0000\u0000\u0000\u02d3\u02d1\u0001\u0000\u0000"+ + "\u0000\u02d3\u02d4\u0001\u0000\u0000\u0000\u02d4\u008f\u0001\u0000\u0000"+ + "\u0000\u02d5\u02d3\u0001\u0000\u0000\u0000\u02d6\u02da\u00055\u0000\u0000"+ + "\u02d7\u02d9\u0003\u0094J\u0000\u02d8\u02d7\u0001\u0000\u0000\u0000\u02d9"+ + "\u02dc\u0001\u0000\u0000\u0000\u02da\u02d8\u0001\u0000\u0000\u0000\u02da"+ + "\u02db\u0001\u0000\u0000\u0000\u02db\u02dd\u0001\u0000\u0000\u0000\u02dc"+ + "\u02da\u0001\u0000\u0000\u0000\u02dd\u02de\u00056\u0000\u0000\u02de\u0091"+ + "\u0001\u0000\u0000\u0000\u02df\u02e3\u00055\u0000\u0000\u02e0\u02e2\u0003"+ + "\u00acV\u0000\u02e1\u02e0\u0001\u0000\u0000\u0000\u02e2\u02e5\u0001\u0000"+ + "\u0000\u0000\u02e3\u02e1\u0001\u0000\u0000\u0000\u02e3\u02e4\u0001\u0000"+ + "\u0000\u0000\u02e4\u02e6\u0001\u0000\u0000\u0000\u02e5\u02e3\u0001\u0000"+ + "\u0000\u0000\u02e6\u02e7\u00056\u0000\u0000\u02e7\u0093\u0001\u0000\u0000"+ + "\u0000\u02e8\u02ed\u0003\u0096K\u0000\u02e9\u02ed\u0003\u0098L\u0000\u02ea"+ + "\u02ed\u0003\u009aM\u0000\u02eb\u02ed\u0003\u009cN\u0000\u02ec\u02e8\u0001"+ + "\u0000\u0000\u0000\u02ec\u02e9\u0001\u0000\u0000\u0000\u02ec\u02ea\u0001"+ + "\u0000\u0000\u0000\u02ec\u02eb\u0001\u0000\u0000\u0000\u02ed\u0095\u0001"+ + "\u0000\u0000\u0000\u02ee\u02ef\u00050\u0000\u0000\u02ef\u0097\u0001\u0000"+ + "\u0000\u0000\u02f0\u02f1\u00038\u001c\u0000\u02f1\u0099\u0001\u0000\u0000"+ + "\u0000\u02f2\u02f3\u0005#\u0000\u0000\u02f3\u02f4\u00038\u001c\u0000\u02f4"+ + "\u009b\u0001\u0000\u0000\u0000\u02f5\u02fa\u0003\u009eO\u0000\u02f6\u02fa"+ + "\u0003\u00a4R\u0000\u02f7\u02fa\u0003\u00a6S\u0000\u02f8\u02fa\u0003\u0082"+ + "A\u0000\u02f9\u02f5\u0001\u0000\u0000\u0000\u02f9\u02f6\u0001\u0000\u0000"+ + "\u0000\u02f9\u02f7\u0001\u0000\u0000\u0000\u02f9\u02f8\u0001\u0000\u0000"+ + "\u0000\u02fa\u009d\u0001\u0000\u0000\u0000\u02fb\u02fd\u0003r9\u0000\u02fc"+ + "\u02fb\u0001\u0000\u0000\u0000\u02fd\u0300\u0001\u0000\u0000\u0000\u02fe"+ + "\u02fc\u0001\u0000\u0000\u0000\u02fe\u02ff\u0001\u0000\u0000\u0000\u02ff"+ + "\u0301\u0001\u0000\u0000\u0000\u0300\u02fe\u0001\u0000\u0000\u0000\u0301"+ + "\u0302\u0003\u00a0P\u0000\u0302\u0303\u0003\u0000\u0000\u0000\u0303\u0305"+ + "\u0003\u00b6[\u0000\u0304\u0306\u0003\n\u0005\u0000\u0305\u0304\u0001"+ + "\u0000\u0000\u0000\u0305\u0306\u0001\u0000\u0000\u0000\u0306\u0308\u0001"+ + "\u0000\u0000\u0000\u0307\u0309\u0003\u00a2Q\u0000\u0308\u0307\u0001\u0000"+ + "\u0000\u0000\u0308\u0309\u0001\u0000\u0000\u0000\u0309\u030c\u0001\u0000"+ + "\u0000\u0000\u030a\u030d\u00038\u001c\u0000\u030b\u030d\u00050\u0000\u0000"+ + "\u030c\u030a\u0001\u0000\u0000\u0000\u030c\u030b\u0001\u0000\u0000\u0000"+ + "\u030d\u009f\u0001\u0000\u0000\u0000\u030e\u0311\u0003\u0006\u0003\u0000"+ + "\u030f\u0311\u0005-\u0000\u0000\u0310\u030e\u0001\u0000\u0000\u0000\u0310"+ + "\u030f\u0001\u0000\u0000\u0000\u0311\u00a1\u0001\u0000\u0000\u0000\u0312"+ + "\u0313\u0005*\u0000\u0000\u0313\u0314\u0003\u00b4Z\u0000\u0314\u00a3\u0001"+ + "\u0000\u0000\u0000\u0315\u0317\u0003r9\u0000\u0316\u0315\u0001\u0000\u0000"+ + "\u0000\u0317\u031a\u0001\u0000\u0000\u0000\u0318\u0316\u0001\u0000\u0000"+ + "\u0000\u0318\u0319\u0001\u0000\u0000\u0000\u0319\u031b\u0001\u0000\u0000"+ + "\u0000\u031a\u0318\u0001\u0000\u0000\u0000\u031b\u031c\u0003\u0006\u0003"+ + "\u0000\u031c\u031d\u0003t:\u0000\u031d\u031e\u00050\u0000\u0000\u031e"+ + "\u00a5\u0001\u0000\u0000\u0000\u031f\u0321\u0003r9\u0000\u0320\u031f\u0001"+ + "\u0000\u0000\u0000\u0321\u0324\u0001\u0000\u0000\u0000\u0322\u0320\u0001"+ + "\u0000\u0000\u0000\u0322\u0323\u0001\u0000\u0000\u0000\u0323\u0325\u0001"+ + "\u0000\u0000\u0000\u0324\u0322\u0001\u0000\u0000\u0000\u0325\u0326\u0003"+ + "\u0000\u0000\u0000\u0326\u0328\u0003\u00b6[\u0000\u0327\u0329\u0003\u00a2"+ + "Q\u0000\u0328\u0327\u0001\u0000\u0000\u0000\u0328\u0329\u0001\u0000\u0000"+ + "\u0000\u0329\u032a\u0001\u0000\u0000\u0000\u032a\u032b\u0003\u00a8T\u0000"+ + "\u032b\u00a7\u0001\u0000\u0000\u0000\u032c\u032e\u00055\u0000\u0000\u032d"+ + "\u032f\u0003\u00aaU\u0000\u032e\u032d\u0001\u0000\u0000\u0000\u032e\u032f"+ + "\u0001\u0000\u0000\u0000\u032f\u0333\u0001\u0000\u0000\u0000\u0330\u0332"+ + "\u0003:\u001d\u0000\u0331\u0330\u0001\u0000\u0000\u0000\u0332\u0335\u0001"+ + "\u0000\u0000\u0000\u0333\u0331\u0001\u0000\u0000\u0000\u0333\u0334\u0001"+ + "\u0000\u0000\u0000\u0334\u0336\u0001\u0000\u0000\u0000\u0335\u0333\u0001"+ + "\u0000\u0000\u0000\u0336\u0337\u00056\u0000\u0000\u0337\u00a9\u0001\u0000"+ + "\u0000\u0000\u0338\u0339\u0007\u0007\u0000\u0000\u0339\u033a\u0003(\u0014"+ + "\u0000\u033a\u033b\u00050\u0000\u0000\u033b\u00ab\u0001\u0000\u0000\u0000"+ + "\u033c\u033f\u0003\u0096K\u0000\u033d\u033f\u0003\u00aeW\u0000\u033e\u033c"+ + "\u0001\u0000\u0000\u0000\u033e\u033d\u0001\u0000\u0000\u0000\u033f\u00ad"+ + "\u0001\u0000\u0000\u0000\u0340\u0344\u0003\u00b0X\u0000\u0341\u0344\u0003"+ + "\u00b2Y\u0000\u0342\u0344\u0003\u0082A\u0000\u0343\u0340\u0001\u0000\u0000"+ + "\u0000\u0343\u0341\u0001\u0000\u0000\u0000\u0343\u0342\u0001\u0000\u0000"+ + "\u0000\u0344\u00af\u0001\u0000\u0000\u0000\u0345\u0347\u0003r9\u0000\u0346"+ + "\u0345\u0001\u0000\u0000\u0000\u0347\u034a\u0001\u0000\u0000\u0000\u0348"+ + "\u0346\u0001\u0000\u0000\u0000\u0348\u0349\u0001\u0000\u0000\u0000\u0349"+ + "\u034b\u0001\u0000\u0000\u0000\u034a\u0348\u0001\u0000\u0000\u0000\u034b"+ + "\u034c\u0003\u0006\u0003\u0000\u034c\u034d\u0003\u0000\u0000\u0000\u034d"+ + "\u034f\u0003\u00b6[\u0000\u034e\u0350\u0003\n\u0005\u0000\u034f\u034e"+ + "\u0001\u0000\u0000\u0000\u034f\u0350\u0001\u0000\u0000\u0000\u0350\u0352"+ + "\u0001\u0000\u0000\u0000\u0351\u0353\u0003\u00a2Q\u0000\u0352\u0351\u0001"+ + "\u0000\u0000\u0000\u0352\u0353\u0001\u0000\u0000\u0000\u0353\u0354\u0001"+ + "\u0000\u0000\u0000\u0354\u0355\u00050\u0000\u0000\u0355\u00b1\u0001\u0000"+ + "\u0000\u0000\u0356\u0358\u0003r9\u0000\u0357\u0356\u0001\u0000\u0000\u0000"+ + "\u0358\u035b\u0001\u0000\u0000\u0000\u0359\u0357\u0001\u0000\u0000\u0000"+ + "\u0359\u035a\u0001\u0000\u0000\u0000\u035a\u035c\u0001\u0000\u0000\u0000"+ + "\u035b\u0359\u0001\u0000\u0000\u0000\u035c\u035d\u0003\u0006\u0003\u0000"+ + "\u035d\u035e\u0003\u0000\u0000\u0000\u035e\u035f\u0003t:\u0000\u035f\u0360"+ + "\u00050\u0000\u0000\u0360\u00b3\u0001\u0000\u0000\u0000\u0361\u0366\u0003"+ + "\u0002\u0001\u0000\u0362\u0363\u00051\u0000\u0000\u0363\u0365\u0003\u0002"+ + "\u0001\u0000\u0364\u0362\u0001\u0000\u0000\u0000\u0365\u0368\u0001\u0000"+ + "\u0000\u0000\u0366\u0364\u0001\u0000\u0000\u0000\u0366\u0367\u0001\u0000"+ + "\u0000\u0000\u0367\u00b5\u0001\u0000\u0000\u0000\u0368\u0366\u0001\u0000"+ + "\u0000\u0000\u0369\u0372\u00053\u0000\u0000\u036a\u036f\u0003\u00b8\\"+ + "\u0000\u036b\u036c\u00051\u0000\u0000\u036c\u036e\u0003\u00b8\\\u0000"+ + "\u036d\u036b\u0001\u0000\u0000\u0000\u036e\u0371\u0001\u0000\u0000\u0000"+ + "\u036f\u036d\u0001\u0000\u0000\u0000\u036f\u0370\u0001\u0000\u0000\u0000"+ + "\u0370\u0373\u0001\u0000\u0000\u0000\u0371\u036f\u0001\u0000\u0000\u0000"+ + "\u0372\u036a\u0001\u0000\u0000\u0000\u0372\u0373\u0001\u0000\u0000\u0000"+ + "\u0373\u0374\u0001\u0000\u0000\u0000\u0374\u0375\u00054\u0000\u0000\u0375"+ + "\u00b7\u0001\u0000\u0000\u0000\u0376\u0378\u0005\u0010\u0000\u0000\u0377"+ + "\u0376\u0001\u0000\u0000\u0000\u0377\u0378\u0001\u0000\u0000\u0000\u0378"+ + "\u0379\u0001\u0000\u0000\u0000\u0379\u037a\u0003\u0006\u0003\u0000\u037a"+ + "\u037b\u0003x<\u0000\u037b\u00b9\u0001\u0000\u0000\u0000b\u00c1\u00c8"+ + "\u00cb\u00d3\u00d9\u00df\u00ee\u00f3\u00fd\u0106\u010c\u010f\u0118\u0121"+ + "\u0125\u012d\u0137\u0139\u013e\u014c\u0152\u0154\u015c\u015f\u0166\u016e"+ + "\u0179\u017d\u017f\u0183\u018b\u018e\u0191\u0197\u01a1\u01a9\u01ac\u01c2"+ + "\u01c8\u01d0\u01d4\u01d8\u01eb\u01ee\u01f6\u01fc\u0207\u0211\u0217\u0224"+ + "\u0233\u0241\u0246\u024e\u0255\u0259\u025e\u0265\u026f\u0274\u0278\u027c"+ + "\u0280\u0289\u028e\u0294\u029f\u02a4\u02ad\u02b2\u02b7\u02ba\u02c7\u02d3"+ + "\u02da\u02e3\u02ec\u02f9\u02fe\u0305\u0308\u030c\u0310\u0318\u0322\u0328"+ + "\u032e\u0333\u033e\u0343\u0348\u034f\u0352\u0359\u0366\u036f\u0372\u0377"; + public static final ATN _ATN = + new ATNDeserializer().deserialize(_serializedATN.toCharArray()); + static { + _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()]; + for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) { + _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i); + } + } +} \ No newline at end of file diff --git a/src/org/lsmr/cfg/Java1_4ParserBaseVisitor.java b/src/org/lsmr/cfg/Java1_4ParserBaseVisitor.java new file mode 100644 index 0000000..f55f07f --- /dev/null +++ b/src/org/lsmr/cfg/Java1_4ParserBaseVisitor.java @@ -0,0 +1,668 @@ +// Generated from Java1_4Parser.g4 by ANTLR 4.13.2 + + package org.lsmr.cfg; + +import org.antlr.v4.runtime.tree.AbstractParseTreeVisitor; + +/** + * This class provides an empty implementation of {@link Java1_4ParserVisitor}, + * which can be extended to create a visitor which only needs to handle a subset + * of the available methods. + * + * @param The return type of the visit operation. Use {@link Void} for + * operations with no return type. + */ +@SuppressWarnings("CheckReturnValue") +public class Java1_4ParserBaseVisitor extends AbstractParseTreeVisitor implements Java1_4ParserVisitor { + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitIdentifier(Java1_4Parser.IdentifierContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitQualifiedIdentifier(Java1_4Parser.QualifiedIdentifierContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitLiteral(Java1_4Parser.LiteralContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitType(Java1_4Parser.TypeContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitBasicType(Java1_4Parser.BasicTypeContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitDims(Java1_4Parser.DimsContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitExpression(Java1_4Parser.ExpressionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitAssignmentOperator(Java1_4Parser.AssignmentOperatorContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitExpression1(Java1_4Parser.Expression1Context ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitExpression1Rest(Java1_4Parser.Expression1RestContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitExpression2(Java1_4Parser.Expression2Context ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitExpression2Rest(Java1_4Parser.Expression2RestContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitInfixOp(Java1_4Parser.InfixOpContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitExpression3(Java1_4Parser.Expression3Context ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitPrefixOp(Java1_4Parser.PrefixOpContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitPostfixOp(Java1_4Parser.PostfixOpContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitPrimary(Java1_4Parser.PrimaryContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitIdentifierSuffix(Java1_4Parser.IdentifierSuffixContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitSelector(Java1_4Parser.SelectorContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitSuperSuffix(Java1_4Parser.SuperSuffixContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitArguments(Java1_4Parser.ArgumentsContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitCreator(Java1_4Parser.CreatorContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitInnerCreator(Java1_4Parser.InnerCreatorContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitArrayCreatorRest(Java1_4Parser.ArrayCreatorRestContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitClassCreatorRest(Java1_4Parser.ClassCreatorRestContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitArrayInitializer(Java1_4Parser.ArrayInitializerContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitVariableInitializer(Java1_4Parser.VariableInitializerContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitParenthesizedExpression(Java1_4Parser.ParenthesizedExpressionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitBlock(Java1_4Parser.BlockContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitBlockStatement(Java1_4Parser.BlockStatementContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitLocalVariableDeclarationStatement(Java1_4Parser.LocalVariableDeclarationStatementContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitStatement(Java1_4Parser.StatementContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitIfStatement(Java1_4Parser.IfStatementContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitElseClause(Java1_4Parser.ElseClauseContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitForStatement(Java1_4Parser.ForStatementContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitWhileStatement(Java1_4Parser.WhileStatementContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitDoStatement(Java1_4Parser.DoStatementContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitTryStatement(Java1_4Parser.TryStatementContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitSwitchStatement(Java1_4Parser.SwitchStatementContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitSynchronizedStatement(Java1_4Parser.SynchronizedStatementContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitReturnStatement(Java1_4Parser.ReturnStatementContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitThrowStatement(Java1_4Parser.ThrowStatementContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitBreakStatement(Java1_4Parser.BreakStatementContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitContinueStatement(Java1_4Parser.ContinueStatementContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitEmptyStatement(Java1_4Parser.EmptyStatementContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitExpressionStatement(Java1_4Parser.ExpressionStatementContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitAssertStatement(Java1_4Parser.AssertStatementContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitLabeledStatement(Java1_4Parser.LabeledStatementContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitStatementExpression(Java1_4Parser.StatementExpressionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitConstantExpression(Java1_4Parser.ConstantExpressionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitCatches(Java1_4Parser.CatchesContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitCatchClause(Java1_4Parser.CatchClauseContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitFinallyClause(Java1_4Parser.FinallyClauseContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitSwitchBlockStatementGroup(Java1_4Parser.SwitchBlockStatementGroupContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitSwitchLabel(Java1_4Parser.SwitchLabelContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitForInit(Java1_4Parser.ForInitContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitForUpdate(Java1_4Parser.ForUpdateContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitModifier(Java1_4Parser.ModifierContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitVariableDeclarators(Java1_4Parser.VariableDeclaratorsContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitVariableDeclarator(Java1_4Parser.VariableDeclaratorContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitVariableDeclaratorId(Java1_4Parser.VariableDeclaratorIdContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitConstantDeclarator(Java1_4Parser.ConstantDeclaratorContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitCompilationUnit(Java1_4Parser.CompilationUnitContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitImportDeclaration(Java1_4Parser.ImportDeclarationContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitTypeDeclaration(Java1_4Parser.TypeDeclarationContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitClassOrInterfaceDeclaration(Java1_4Parser.ClassOrInterfaceDeclarationContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitClassDeclaration(Java1_4Parser.ClassDeclarationContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitSuperclass(Java1_4Parser.SuperclassContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitSuperinterfaces(Java1_4Parser.SuperinterfacesContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitInterfaceDeclaration(Java1_4Parser.InterfaceDeclarationContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitExtendsInterfaces(Java1_4Parser.ExtendsInterfacesContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitTypeList(Java1_4Parser.TypeListContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitClassBody(Java1_4Parser.ClassBodyContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitInterfaceBody(Java1_4Parser.InterfaceBodyContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitClassBodyDeclaration(Java1_4Parser.ClassBodyDeclarationContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitEmptyDeclaration(Java1_4Parser.EmptyDeclarationContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitInitializer(Java1_4Parser.InitializerContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitStaticInitializer(Java1_4Parser.StaticInitializerContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitMemberDeclaration(Java1_4Parser.MemberDeclarationContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitMethodDeclaration(Java1_4Parser.MethodDeclarationContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitResult(Java1_4Parser.ResultContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitThrows_(Java1_4Parser.Throws_Context ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitFieldDeclaration(Java1_4Parser.FieldDeclarationContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitConstructorDeclaration(Java1_4Parser.ConstructorDeclarationContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitConstructorBody(Java1_4Parser.ConstructorBodyContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitExplicitConstructorInvocation(Java1_4Parser.ExplicitConstructorInvocationContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitInterfaceBodyDeclaration(Java1_4Parser.InterfaceBodyDeclarationContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitInterfaceMemberDeclaration(Java1_4Parser.InterfaceMemberDeclarationContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitInterfaceMethodDeclaration(Java1_4Parser.InterfaceMethodDeclarationContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitConstantDeclaration(Java1_4Parser.ConstantDeclarationContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitQualifiedIdentifiers(Java1_4Parser.QualifiedIdentifiersContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitFormalParameters(Java1_4Parser.FormalParametersContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitFormalParameter(Java1_4Parser.FormalParameterContext ctx) { return visitChildren(ctx); } +} \ No newline at end of file diff --git a/src/org/lsmr/cfg/Java1_4ParserVisitor.java b/src/org/lsmr/cfg/Java1_4ParserVisitor.java new file mode 100644 index 0000000..5b79eda --- /dev/null +++ b/src/org/lsmr/cfg/Java1_4ParserVisitor.java @@ -0,0 +1,573 @@ +// Generated from Java1_4Parser.g4 by ANTLR 4.13.2 + + package org.lsmr.cfg; + +import org.antlr.v4.runtime.tree.ParseTreeVisitor; + +/** + * This interface defines a complete generic visitor for a parse tree produced + * by {@link Java1_4Parser}. + * + * @param The return type of the visit operation. Use {@link Void} for + * operations with no return type. + */ +public interface Java1_4ParserVisitor extends ParseTreeVisitor { + /** + * Visit a parse tree produced by {@link Java1_4Parser#identifier}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitIdentifier(Java1_4Parser.IdentifierContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#qualifiedIdentifier}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitQualifiedIdentifier(Java1_4Parser.QualifiedIdentifierContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#literal}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitLiteral(Java1_4Parser.LiteralContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#type}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitType(Java1_4Parser.TypeContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#basicType}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitBasicType(Java1_4Parser.BasicTypeContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#dims}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitDims(Java1_4Parser.DimsContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#expression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitExpression(Java1_4Parser.ExpressionContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#assignmentOperator}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitAssignmentOperator(Java1_4Parser.AssignmentOperatorContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#expression1}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitExpression1(Java1_4Parser.Expression1Context ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#expression1Rest}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitExpression1Rest(Java1_4Parser.Expression1RestContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#expression2}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitExpression2(Java1_4Parser.Expression2Context ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#expression2Rest}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitExpression2Rest(Java1_4Parser.Expression2RestContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#infixOp}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitInfixOp(Java1_4Parser.InfixOpContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#expression3}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitExpression3(Java1_4Parser.Expression3Context ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#prefixOp}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitPrefixOp(Java1_4Parser.PrefixOpContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#postfixOp}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitPostfixOp(Java1_4Parser.PostfixOpContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#primary}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitPrimary(Java1_4Parser.PrimaryContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#identifierSuffix}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitIdentifierSuffix(Java1_4Parser.IdentifierSuffixContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#selector}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitSelector(Java1_4Parser.SelectorContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#superSuffix}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitSuperSuffix(Java1_4Parser.SuperSuffixContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#arguments}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitArguments(Java1_4Parser.ArgumentsContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#creator}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitCreator(Java1_4Parser.CreatorContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#innerCreator}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitInnerCreator(Java1_4Parser.InnerCreatorContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#arrayCreatorRest}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitArrayCreatorRest(Java1_4Parser.ArrayCreatorRestContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#classCreatorRest}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitClassCreatorRest(Java1_4Parser.ClassCreatorRestContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#arrayInitializer}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitArrayInitializer(Java1_4Parser.ArrayInitializerContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#variableInitializer}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitVariableInitializer(Java1_4Parser.VariableInitializerContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#parenthesizedExpression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitParenthesizedExpression(Java1_4Parser.ParenthesizedExpressionContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#block}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitBlock(Java1_4Parser.BlockContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#blockStatement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitBlockStatement(Java1_4Parser.BlockStatementContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#localVariableDeclarationStatement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitLocalVariableDeclarationStatement(Java1_4Parser.LocalVariableDeclarationStatementContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#statement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitStatement(Java1_4Parser.StatementContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#ifStatement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitIfStatement(Java1_4Parser.IfStatementContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#elseClause}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitElseClause(Java1_4Parser.ElseClauseContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#forStatement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitForStatement(Java1_4Parser.ForStatementContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#whileStatement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitWhileStatement(Java1_4Parser.WhileStatementContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#doStatement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitDoStatement(Java1_4Parser.DoStatementContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#tryStatement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitTryStatement(Java1_4Parser.TryStatementContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#switchStatement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitSwitchStatement(Java1_4Parser.SwitchStatementContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#synchronizedStatement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitSynchronizedStatement(Java1_4Parser.SynchronizedStatementContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#returnStatement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitReturnStatement(Java1_4Parser.ReturnStatementContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#throwStatement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitThrowStatement(Java1_4Parser.ThrowStatementContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#breakStatement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitBreakStatement(Java1_4Parser.BreakStatementContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#continueStatement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitContinueStatement(Java1_4Parser.ContinueStatementContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#emptyStatement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitEmptyStatement(Java1_4Parser.EmptyStatementContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#expressionStatement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitExpressionStatement(Java1_4Parser.ExpressionStatementContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#assertStatement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitAssertStatement(Java1_4Parser.AssertStatementContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#labeledStatement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitLabeledStatement(Java1_4Parser.LabeledStatementContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#statementExpression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitStatementExpression(Java1_4Parser.StatementExpressionContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#constantExpression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitConstantExpression(Java1_4Parser.ConstantExpressionContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#catches}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitCatches(Java1_4Parser.CatchesContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#catchClause}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitCatchClause(Java1_4Parser.CatchClauseContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#finallyClause}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitFinallyClause(Java1_4Parser.FinallyClauseContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#switchBlockStatementGroup}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitSwitchBlockStatementGroup(Java1_4Parser.SwitchBlockStatementGroupContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#switchLabel}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitSwitchLabel(Java1_4Parser.SwitchLabelContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#forInit}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitForInit(Java1_4Parser.ForInitContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#forUpdate}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitForUpdate(Java1_4Parser.ForUpdateContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#modifier}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitModifier(Java1_4Parser.ModifierContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#variableDeclarators}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitVariableDeclarators(Java1_4Parser.VariableDeclaratorsContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#variableDeclarator}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitVariableDeclarator(Java1_4Parser.VariableDeclaratorContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#variableDeclaratorId}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitVariableDeclaratorId(Java1_4Parser.VariableDeclaratorIdContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#constantDeclarator}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitConstantDeclarator(Java1_4Parser.ConstantDeclaratorContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#compilationUnit}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitCompilationUnit(Java1_4Parser.CompilationUnitContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#importDeclaration}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitImportDeclaration(Java1_4Parser.ImportDeclarationContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#typeDeclaration}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitTypeDeclaration(Java1_4Parser.TypeDeclarationContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#classOrInterfaceDeclaration}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitClassOrInterfaceDeclaration(Java1_4Parser.ClassOrInterfaceDeclarationContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#classDeclaration}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitClassDeclaration(Java1_4Parser.ClassDeclarationContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#superclass}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitSuperclass(Java1_4Parser.SuperclassContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#superinterfaces}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitSuperinterfaces(Java1_4Parser.SuperinterfacesContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#interfaceDeclaration}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitInterfaceDeclaration(Java1_4Parser.InterfaceDeclarationContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#extendsInterfaces}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitExtendsInterfaces(Java1_4Parser.ExtendsInterfacesContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#typeList}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitTypeList(Java1_4Parser.TypeListContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#classBody}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitClassBody(Java1_4Parser.ClassBodyContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#interfaceBody}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitInterfaceBody(Java1_4Parser.InterfaceBodyContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#classBodyDeclaration}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitClassBodyDeclaration(Java1_4Parser.ClassBodyDeclarationContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#emptyDeclaration}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitEmptyDeclaration(Java1_4Parser.EmptyDeclarationContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#initializer}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitInitializer(Java1_4Parser.InitializerContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#staticInitializer}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitStaticInitializer(Java1_4Parser.StaticInitializerContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#memberDeclaration}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitMemberDeclaration(Java1_4Parser.MemberDeclarationContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#methodDeclaration}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitMethodDeclaration(Java1_4Parser.MethodDeclarationContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#result}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitResult(Java1_4Parser.ResultContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#throws_}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitThrows_(Java1_4Parser.Throws_Context ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#fieldDeclaration}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitFieldDeclaration(Java1_4Parser.FieldDeclarationContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#constructorDeclaration}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitConstructorDeclaration(Java1_4Parser.ConstructorDeclarationContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#constructorBody}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitConstructorBody(Java1_4Parser.ConstructorBodyContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#explicitConstructorInvocation}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitExplicitConstructorInvocation(Java1_4Parser.ExplicitConstructorInvocationContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#interfaceBodyDeclaration}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitInterfaceBodyDeclaration(Java1_4Parser.InterfaceBodyDeclarationContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#interfaceMemberDeclaration}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitInterfaceMemberDeclaration(Java1_4Parser.InterfaceMemberDeclarationContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#interfaceMethodDeclaration}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitInterfaceMethodDeclaration(Java1_4Parser.InterfaceMethodDeclarationContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#constantDeclaration}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitConstantDeclaration(Java1_4Parser.ConstantDeclarationContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#qualifiedIdentifiers}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitQualifiedIdentifiers(Java1_4Parser.QualifiedIdentifiersContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#formalParameters}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitFormalParameters(Java1_4Parser.FormalParametersContext ctx); + /** + * Visit a parse tree produced by {@link Java1_4Parser#formalParameter}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitFormalParameter(Java1_4Parser.FormalParameterContext ctx); +} \ No newline at end of file diff --git a/src/org/lsmr/cfg/Node.java b/src/org/lsmr/cfg/Node.java new file mode 100644 index 0000000..859f5b3 --- /dev/null +++ b/src/org/lsmr/cfg/Node.java @@ -0,0 +1,171 @@ +package org.lsmr.cfg; + +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; + +/** + * Represents nodes in a CFG. Each node is expected to have a non-null, + * non-empty label. A node is tightly connected to a specific graph, so the + * creation of nodes is permitted only via + * {@link ControlFlowGraph#buildNode(String)}. + */ +public class Node { + private ControlFlowGraph graph; + private Set inEdges = new HashSet<>(); + private Set outEdges = new HashSet<>(); + private String label; + + Node(String label) { + if(label == null || label.length() < 1) + throw new IllegalArgumentException(); + + this.label = label; + } + + /** + * Accesses the label for this node. + * + * @return The label for this node. Should not be null; should not be empty. + */ + public String label() { + return label; + } + + /** + * Accesses the parent graph for this node. + * + * @return The parent graph for this node. Should not be null. + */ + public ControlFlowGraph graph() { + return graph; + } + + /** + * Accesses the out-edges of this node as an unmodifiable set. + * + * @return An unmodifiable set of the out-edges of this node. + */ + public Set outEdges() { + return Collections.unmodifiableSet(outEdges); + } + + /** + * Accesses the in-edges of this node as an unmodifiable set. + * + * @return An unmodifiable set of the in-edges of this node. + */ + public Set inEdges() { + return Collections.unmodifiableSet(inEdges); + } + + /** + * Adds the indicated edge to this node as an in-edge. + * + * @param edge + * The edge to be added as an in-edge + * @throws IllegalArgumentException + * If the edge is null. + * @throws IllegalStateException + * If the target node of the edge is not identical to this node. + */ + public void addInEdge(Edge edge) { + if(edge == null) + throw new IllegalArgumentException(); + + if(edge.target() != this) + throw new IllegalStateException(); + + if(edge.source().graph() == null || edge.target().graph() == null) + throw new IllegalStateException(); + + inEdges.add(edge); + } + + /** + * Adds the indicated edge to this node as an out-edge. + * + * @param edge + * The edge to be added as an out-edge + * @throws IllegalArgumentException + * If the edge is null. + * @throws IllegalStateException + * If the source node of the edge is not identical to this node. + */ + public void addOutEdge(Edge edge) { + if(edge == null) + throw new IllegalArgumentException(); + + if(edge.source() != this) + throw new IllegalStateException(); + + if(edge.source().graph() == null || (edge.target() != null && edge.target().graph() == null)) + throw new IllegalStateException(); + + outEdges.add(edge); + } + + void setGraph(ControlFlowGraph graph) { + if(this.graph != null) { + if(graph == null) + this.graph = null; + } + else if(graph == null) + throw new IllegalArgumentException(); + else + this.graph = graph; + } + + @Override + public int hashCode() { + return label.hashCode(); + } + + @Override + public boolean equals(Object obj) { + if(obj instanceof Node) { + Node other = (Node)obj; + + return label.equals(other.label); + } + + return false; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + + sb.append("node "); + sb.append(label); + sb.append(": in-edges ["); + + boolean start = true; + + for(Edge edge : inEdges) { + if(start) + start = false; + else + sb.append(", "); + + sb.append(edge.toString()); + } + + sb.append("]; out-edges ["); + + start = true; + + for(Edge edge : outEdges) { + if(start) + start = false; + else + sb.append(", "); + + sb.append(edge.toString()); + } + + sb.append("]"); + + return sb.toString(); + } +} diff --git a/src/org/lsmr/cfg/NodeBuilder.java b/src/org/lsmr/cfg/NodeBuilder.java new file mode 100644 index 0000000..76127da --- /dev/null +++ b/src/org/lsmr/cfg/NodeBuilder.java @@ -0,0 +1,1361 @@ +package org.lsmr.cfg; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Stack; +import java.util.concurrent.ForkJoinWorkerThread; + +import org.antlr.v4.runtime.RuleContext; +import org.antlr.v4.runtime.tree.ErrorNode; +import org.antlr.v4.runtime.tree.ParseTree; +import org.antlr.v4.runtime.tree.RuleNode; +import org.antlr.v4.runtime.tree.TerminalNode; +import org.lsmr.cfg.Edge.EdgeLabel; +import org.lsmr.cfg.Java1_4Parser.ArgumentsContext; +import org.lsmr.cfg.Java1_4Parser.ArrayCreatorRestContext; +import org.lsmr.cfg.Java1_4Parser.ArrayInitializerContext; +import org.lsmr.cfg.Java1_4Parser.AssertStatementContext; +import org.lsmr.cfg.Java1_4Parser.AssignmentOperatorContext; +import org.lsmr.cfg.Java1_4Parser.BasicTypeContext; +import org.lsmr.cfg.Java1_4Parser.BlockContext; +import org.lsmr.cfg.Java1_4Parser.BlockStatementContext; +import org.lsmr.cfg.Java1_4Parser.BreakStatementContext; +import org.lsmr.cfg.Java1_4Parser.CatchClauseContext; +import org.lsmr.cfg.Java1_4Parser.CatchesContext; +import org.lsmr.cfg.Java1_4Parser.ClassBodyContext; +import org.lsmr.cfg.Java1_4Parser.ClassBodyDeclarationContext; +import org.lsmr.cfg.Java1_4Parser.ClassCreatorRestContext; +import org.lsmr.cfg.Java1_4Parser.ClassDeclarationContext; +import org.lsmr.cfg.Java1_4Parser.ClassOrInterfaceDeclarationContext; +import org.lsmr.cfg.Java1_4Parser.CompilationUnitContext; +import org.lsmr.cfg.Java1_4Parser.ConstantDeclarationContext; +import org.lsmr.cfg.Java1_4Parser.ConstantDeclaratorContext; +import org.lsmr.cfg.Java1_4Parser.ConstantExpressionContext; +import org.lsmr.cfg.Java1_4Parser.ConstructorBodyContext; +import org.lsmr.cfg.Java1_4Parser.ConstructorDeclarationContext; +import org.lsmr.cfg.Java1_4Parser.ContinueStatementContext; +import org.lsmr.cfg.Java1_4Parser.CreatorContext; +import org.lsmr.cfg.Java1_4Parser.DimsContext; +import org.lsmr.cfg.Java1_4Parser.DoStatementContext; +import org.lsmr.cfg.Java1_4Parser.ElseClauseContext; +import org.lsmr.cfg.Java1_4Parser.EmptyDeclarationContext; +import org.lsmr.cfg.Java1_4Parser.EmptyStatementContext; +import org.lsmr.cfg.Java1_4Parser.ExplicitConstructorInvocationContext; +import org.lsmr.cfg.Java1_4Parser.Expression1Context; +import org.lsmr.cfg.Java1_4Parser.Expression1RestContext; +import org.lsmr.cfg.Java1_4Parser.Expression2Context; +import org.lsmr.cfg.Java1_4Parser.Expression2RestContext; +import org.lsmr.cfg.Java1_4Parser.Expression3Context; +import org.lsmr.cfg.Java1_4Parser.ExpressionContext; +import org.lsmr.cfg.Java1_4Parser.ExpressionStatementContext; +import org.lsmr.cfg.Java1_4Parser.ExtendsInterfacesContext; +import org.lsmr.cfg.Java1_4Parser.FieldDeclarationContext; +import org.lsmr.cfg.Java1_4Parser.FinallyClauseContext; +import org.lsmr.cfg.Java1_4Parser.ForInitContext; +import org.lsmr.cfg.Java1_4Parser.ForStatementContext; +import org.lsmr.cfg.Java1_4Parser.ForUpdateContext; +import org.lsmr.cfg.Java1_4Parser.FormalParameterContext; +import org.lsmr.cfg.Java1_4Parser.FormalParametersContext; +import org.lsmr.cfg.Java1_4Parser.IdentifierContext; +import org.lsmr.cfg.Java1_4Parser.IdentifierSuffixContext; +import org.lsmr.cfg.Java1_4Parser.IfStatementContext; +import org.lsmr.cfg.Java1_4Parser.ImportDeclarationContext; +import org.lsmr.cfg.Java1_4Parser.InfixOpContext; +import org.lsmr.cfg.Java1_4Parser.InitializerContext; +import org.lsmr.cfg.Java1_4Parser.InnerCreatorContext; +import org.lsmr.cfg.Java1_4Parser.InterfaceBodyContext; +import org.lsmr.cfg.Java1_4Parser.InterfaceBodyDeclarationContext; +import org.lsmr.cfg.Java1_4Parser.InterfaceDeclarationContext; +import org.lsmr.cfg.Java1_4Parser.InterfaceMemberDeclarationContext; +import org.lsmr.cfg.Java1_4Parser.InterfaceMethodDeclarationContext; +import org.lsmr.cfg.Java1_4Parser.LabeledStatementContext; +import org.lsmr.cfg.Java1_4Parser.LiteralContext; +import org.lsmr.cfg.Java1_4Parser.LocalVariableDeclarationStatementContext; +import org.lsmr.cfg.Java1_4Parser.MemberDeclarationContext; +import org.lsmr.cfg.Java1_4Parser.MethodDeclarationContext; +import org.lsmr.cfg.Java1_4Parser.ModifierContext; +import org.lsmr.cfg.Java1_4Parser.ParenthesizedExpressionContext; +import org.lsmr.cfg.Java1_4Parser.PostfixOpContext; +import org.lsmr.cfg.Java1_4Parser.PrefixOpContext; +import org.lsmr.cfg.Java1_4Parser.PrimaryContext; +import org.lsmr.cfg.Java1_4Parser.QualifiedIdentifierContext; +import org.lsmr.cfg.Java1_4Parser.QualifiedIdentifiersContext; +import org.lsmr.cfg.Java1_4Parser.ResultContext; +import org.lsmr.cfg.Java1_4Parser.ReturnStatementContext; +import org.lsmr.cfg.Java1_4Parser.SelectorContext; +import org.lsmr.cfg.Java1_4Parser.StatementContext; +import org.lsmr.cfg.Java1_4Parser.StatementExpressionContext; +import org.lsmr.cfg.Java1_4Parser.StaticInitializerContext; +import org.lsmr.cfg.Java1_4Parser.SuperSuffixContext; +import org.lsmr.cfg.Java1_4Parser.SuperclassContext; +import org.lsmr.cfg.Java1_4Parser.SuperinterfacesContext; +import org.lsmr.cfg.Java1_4Parser.SwitchBlockStatementGroupContext; +import org.lsmr.cfg.Java1_4Parser.SwitchLabelContext; +import org.lsmr.cfg.Java1_4Parser.SwitchStatementContext; +import org.lsmr.cfg.Java1_4Parser.SynchronizedStatementContext; +import org.lsmr.cfg.Java1_4Parser.ThrowStatementContext; +import org.lsmr.cfg.Java1_4Parser.Throws_Context; +import org.lsmr.cfg.Java1_4Parser.TryStatementContext; +import org.lsmr.cfg.Java1_4Parser.TypeContext; +import org.lsmr.cfg.Java1_4Parser.TypeDeclarationContext; +import org.lsmr.cfg.Java1_4Parser.TypeListContext; +import org.lsmr.cfg.Java1_4Parser.VariableDeclaratorContext; +import org.lsmr.cfg.Java1_4Parser.VariableDeclaratorIdContext; +import org.lsmr.cfg.Java1_4Parser.VariableDeclaratorsContext; +import org.lsmr.cfg.Java1_4Parser.VariableInitializerContext; +import org.lsmr.cfg.Java1_4Parser.WhileStatementContext; + +/** + * This class will visit the nodes in a parse tree to: (1) find individual + * methods to process, (2) process each method to construct the CFG nodes for + * it, (3) determine the edge locations for each node, and (4) add the edges to + * each graph. + *

+ * Given the root of an AST and an instance of this class, call + * {@code root.accept(instance}} to visit the pertinent nodes therein to + * construct a set of CFGs. + *

+ * At the end of the complete visit, use the {@link #getCFGs() getCFGs()} method + * to obtain the constructed CFGs. + *

+ * The resulting CFG will be based on statements, ignoring finer-grained + * considerations. + */ +public class NodeBuilder implements Java1_4ParserVisitor { + private Map graphMap = new HashMap<>(); + private Stack nameStack = new Stack<>(); + private int nodeCounter = 0; + + private String getCurrentName() { + StringBuilder sb = new StringBuilder(); + + for(String name : nameStack) { + if(sb.length() == 0) + sb.append(name); + else { + sb.append('.'); + sb.append(name); + } + } + + return sb.toString(); + } + + /** + * Obtains a list of the CFGs that have been constructed from the visit. It + * makes most sense to call this method once the visit has been completed. + * + * @return An unmodifiable list of the constructed CFGs for the visited AST. + */ + public List getCFGs() { + return Collections.unmodifiableList(new ArrayList<>(graphMap.values())); + } + + @Override + public WorkingGraph visit(ParseTree arg0) { + return arg0.accept(this); + } + + @Override + public WorkingGraph visitChildren(RuleNode arg0) { + int childCount = arg0.getChildCount(); + WorkingGraph result = null; + + for(int i = 0; i < childCount; i++) + result = visit(arg0.getChild(i)); + + return result; + } + + @Override + public WorkingGraph visitErrorNode(ErrorNode arg0) { + // Ignore + return null; + } + + @Override + public WorkingGraph visitTerminal(TerminalNode arg0) { + // Ignore + return null; + } + + @Override + public WorkingGraph visitIdentifier(IdentifierContext ctx) { + // Ignore + return null; + } + + @Override + public WorkingGraph visitQualifiedIdentifier(QualifiedIdentifierContext ctx) { + // Ignore + return null; + } + + @Override + public WorkingGraph visitLiteral(LiteralContext ctx) { + // Ignore + return null; + } + + @Override + public WorkingGraph visitType(TypeContext ctx) { + // Ignore + return null; + } + + @Override + public WorkingGraph visitBasicType(BasicTypeContext ctx) { + // Ignore + return null; + } + + @Override + public WorkingGraph visitExpression(ExpressionContext ctx) { + // Ignore + return null; + } + + @Override + public WorkingGraph visitAssignmentOperator(AssignmentOperatorContext ctx) { + // Ignore + return null; + } + + @Override + public WorkingGraph visitExpression1(Expression1Context ctx) { + // Ignore + return null; + } + + @Override + public WorkingGraph visitExpression1Rest(Expression1RestContext ctx) { + // Ignore + return null; + } + + @Override + public WorkingGraph visitExpression2(Expression2Context ctx) { + // Ignore + return null; + } + + @Override + public WorkingGraph visitExpression2Rest(Expression2RestContext ctx) { + // Ignore + return null; + } + + @Override + public WorkingGraph visitInfixOp(InfixOpContext ctx) { + // Ignore + return null; + } + + @Override + public WorkingGraph visitExpression3(Expression3Context ctx) { + // Ignore + return null; + } + + @Override + public WorkingGraph visitPrefixOp(PrefixOpContext ctx) { + // Ignore + return null; + } + + @Override + public WorkingGraph visitPostfixOp(PostfixOpContext ctx) { + // Ignore + return null; + } + + @Override + public WorkingGraph visitPrimary(PrimaryContext ctx) { + // Ignore + return null; + } + + @Override + public WorkingGraph visitIdentifierSuffix(IdentifierSuffixContext ctx) { + // Ignore + return null; + } + + @Override + public WorkingGraph visitSelector(SelectorContext ctx) { + // Ignore + return null; + } + + @Override + public WorkingGraph visitSuperSuffix(SuperSuffixContext ctx) { + // Ignore + return null; + } + + @Override + public WorkingGraph visitArguments(ArgumentsContext ctx) { + // Ignore + return null; + } + + @Override + public WorkingGraph visitCreator(CreatorContext ctx) { + // Ignore + return null; + } + + @Override + public WorkingGraph visitInnerCreator(InnerCreatorContext ctx) { + // Ignore + return null; + } + + @Override + public WorkingGraph visitArrayCreatorRest(ArrayCreatorRestContext ctx) { + // Ignore + return null; + } + + @Override + public WorkingGraph visitClassCreatorRest(ClassCreatorRestContext ctx) { + // Ignore + return null; + } + + @Override + public WorkingGraph visitArrayInitializer(ArrayInitializerContext ctx) { + // Ignore + return null; + } + + @Override + public WorkingGraph visitVariableInitializer(VariableInitializerContext ctx) { + // Ignore + return null; + } + + @Override + public WorkingGraph visitBlock(BlockContext ctx) { + ControlFlowGraph g = getGraph(ctx); + WorkingGraph s = new WorkingGraph(); + + s.node = g.buildNode(nodeCounter++ + ": block"); + s.edges.add(g.buildEdge(s.node, null, EdgeLabel.BLANK)); + + List statements = ctx.blockStatement(); + + for(int i = 0, size = statements.size(); i < size; i++) + s.connect(visitBlockStatement(statements.get(i))); + + return s; + } + + @SuppressWarnings("javadoc") + public WorkingGraph visitTryBlock(BlockContext ctx) { + ControlFlowGraph g = getGraph(ctx); + WorkingGraph s = new WorkingGraph(); + + s.node = g.buildNode(nodeCounter++ + ": block"); + s.edges.add(g.buildEdge(s.node, null, EdgeLabel.BLANK)); + + List statements = ctx.blockStatement(); + + for(int i = 0, size = statements.size(); i < size; i++) { + WorkingGraph bs = visitBlockStatement(statements.get(i)); + + bs.edges.add(g.buildEdge(bs.node, null, EdgeLabel.THROWN)); + s.connect(bs); + } + + return s; + } + + @SuppressWarnings("javadoc") + public WorkingGraph visitFinallyBlock(BlockContext ctx, boolean delayedThrown) { + ControlFlowGraph g = getGraph(ctx); + WorkingGraph s = new WorkingGraph(); + + s.node = g.buildNode(nodeCounter++ + ": block"); + s.edges.add(g.buildEdge(s.node, null, EdgeLabel.BLANK)); + + if(delayedThrown) + s.edges.add(g.buildEdge(s.node, null, EdgeLabel.THROWN_DELAYED)); + + List statements = ctx.blockStatement(); + + for(int i = 0, size = statements.size(); i < size; i++) { + WorkingGraph bs = visitBlockStatement(statements.get(i)); + + if(delayedThrown) + if(i == size - 1) + bs.edges.add(g.buildEdge(bs.node, null, EdgeLabel.THROWN)); + else + bs.edges.add(g.buildEdge(bs.node, null, EdgeLabel.THROWN_DELAYED)); + + s.connect(bs); + } + + return s; + } + + @Override + public WorkingGraph visitBlockStatement(BlockStatementContext ctx) { + return visitChildren(ctx); + } + + ControlFlowGraph getGraph(RuleContext ctx) { + RuleContext current = ctx; + + while(current != null && !(current instanceof MemberDeclarationContext) + && !(current instanceof ClassBodyDeclarationContext) && !(current instanceof InterfaceBodyContext)) + current = current.getParent(); + + if(current != null) + return graphMap.get(current); + + return null; + } + + @Override + public WorkingGraph visitLocalVariableDeclarationStatement(LocalVariableDeclarationStatementContext ctx) { + ControlFlowGraph g = getGraph(ctx); + WorkingGraph s = new WorkingGraph(); + + s.node = g.buildNode(nodeCounter++ + ": " + ctx.accept(new TreePrinter())); + s.edges.add(g.buildEdge(s.node, null, EdgeLabel.BLANK)); + + return s; + } + + WorkingGraph visitLinearStatement(RuleContext ctx) { + ControlFlowGraph g = getGraph(ctx); + WorkingGraph s = new WorkingGraph(); + + s.node = g.buildNode(nodeCounter++ + ": " + ctx.accept(new TreePrinter())); + s.edges.add(g.buildEdge(s.node, null, EdgeLabel.BLANK)); + + return s; + } + + @Override + public WorkingGraph visitAssertStatement(AssertStatementContext ctx) { + return visitLinearStatement(ctx); + } + + @Override + public WorkingGraph visitBreakStatement(BreakStatementContext ctx) { + ControlFlowGraph g = getGraph(ctx); + WorkingGraph s = new WorkingGraph(); + + s.node = g.buildNode(nodeCounter++ + ": " + ctx.accept(new TreePrinter())); + + IdentifierContext ic = ctx.identifier(); + String label = ""; + + if(ic != null) + label = ic.getText().intern(); + + List list = s.breakEdges.get(label); + + if(list == null) { + list = new ArrayList<>(); + s.breakEdges.put(label, list); + } + + list.add(g.buildEdge(s.node, null, EdgeLabel.BLANK)); + + return s; + } + + @Override + public WorkingGraph visitContinueStatement(ContinueStatementContext ctx) { + ControlFlowGraph g = getGraph(ctx); + WorkingGraph s = new WorkingGraph(); + + s.node = g.buildNode(nodeCounter++ + ": " + ctx.accept(new TreePrinter())); + + IdentifierContext ic = ctx.identifier(); + String label = ""; + + if(ic != null) + label = ic.getText(); + + List list = s.continueEdges.get(label); + + if(list == null) { + list = new ArrayList<>(); + s.continueEdges.put(label, list); + } + + list.add(g.buildEdge(s.node, null, EdgeLabel.BLANK)); + + return s; + } + + @Override + public WorkingGraph visitDoStatement(DoStatementContext ctx) { + ControlFlowGraph g = getGraph(ctx); + WorkingGraph s = new WorkingGraph(); + + s.node = g.buildNode(nodeCounter++ + ": do"); + + WorkingGraph doBody = visitStatement(ctx.statement()); + + g.buildEdge(s.node, doBody.node, EdgeLabel.BLANK); + + Node whileExpression = g + .buildNode(nodeCounter++ + ": while " + ctx.parenthesizedExpression().accept(new TreePrinter()) + "; "); + + g.buildEdge(whileExpression, s.node, EdgeLabel.TRUE); + + for(Edge edge : doBody.edges) { + if(edge.label() == EdgeLabel.THROWN) + s.edges.add(edge); + else + edge.target = whileExpression; + } + + // Labelled edges will be handled by labelled statement + + List nonLabelledBreakEdges = doBody.breakEdges.get(""); + + if(nonLabelledBreakEdges != null) { + s.edges.addAll(nonLabelledBreakEdges); + s.breakEdges.remove(""); + } + + List nonLabelledContinueEdges = doBody.continueEdges.get(""); + + if(nonLabelledContinueEdges != null) { + for(Edge edge : nonLabelledContinueEdges) { + edge.setTarget(whileExpression); + s.edges.add(edge); + } + + s.continueEdges.remove(""); + } + + s.edges.add(g.buildEdge(whileExpression, null, EdgeLabel.FALSE)); + + return s; + } + + @Override + public WorkingGraph visitIfStatement(IfStatementContext ctx) { + ControlFlowGraph g = getGraph(ctx); + WorkingGraph s = new WorkingGraph(); + + s.node = g.buildNode(nodeCounter++ + ": if " + ctx.parenthesizedExpression().accept(new TreePrinter())); + + WorkingGraph trueNode = visitStatement(ctx.statement()); + + s.edges.add(g.buildEdge(s.node, trueNode.node, EdgeLabel.TRUE)); + s.edges = trueNode.edges; + + ElseClauseContext elseClause = ctx.elseClause(); + + if(elseClause != null) { + WorkingGraph elseNode = visitElseClause(elseClause); + + s.edges.add(g.buildEdge(s.node, elseNode.node, EdgeLabel.FALSE)); + s.connect(elseNode); + } + else + s.edges.add(g.buildEdge(s.node, null, EdgeLabel.FALSE)); + + return s; + } + + @Override + public WorkingGraph visitLabeledStatement(LabeledStatementContext ctx) { + String label = ctx.identifier().getText(); + StatementContext sc = ctx.statement(); + WorkingGraph s = visitStatement(sc); + List breakEdges = s.breakEdges.get(label); + + if(breakEdges != null) { + s.breakEdges.remove(label); + s.edges.addAll(breakEdges); + } + + List continueEdges = s.continueEdges.get(label); + + if(continueEdges != null) { + s.continueEdges.remove(label); + + if(sc.forStatement() != null || sc.whileStatement() != null || sc.doStatement() != null) + for(Edge continueEdge : continueEdges) + continueEdge.setTarget(s.node); + } + + return s; + } + + @Override + public WorkingGraph visitTryStatement(TryStatementContext ctx) { + ControlFlowGraph g = getGraph(ctx); + BlockContext tryBlock = ctx.block(); + CatchesContext catches = ctx.catches(); + List catchClauses = catches == null ? new ArrayList<>() : catches.catchClause(); + FinallyClauseContext finallyClause = ctx.finallyClause(); + + WorkingGraph s = new WorkingGraph(); + + s.node = g.buildNode(nodeCounter++ + ": try"); + s.edges.add(g.buildEdge(s.node, null, EdgeLabel.BLANK)); + + WorkingGraph tryBody = visitTryBlock(tryBlock); + + s.connect(tryBody); + + for(CatchClauseContext catch_ : catchClauses) { + WorkingGraph catchClause = visitCatchClause(catch_); + + for(Edge edge : s.edges) { + if(edge.label() == EdgeLabel.THROWN && edge.target() == null) + edge.setTarget(catchClause.node); + } + + s.edges.addAll(catchClause.edges); + } + + if(finallyClause != null) { + boolean delayedThrown = false; + + for(Edge edge : s.edges) + if(edge.label() == EdgeLabel.THROWN && edge.target() == null) { + delayedThrown = true; + break; + } + + WorkingGraph finallyBody = visitFinallyClause(finallyClause, delayedThrown); + + for(Edge edge : s.edges) + if(edge.target() == null) + edge.setTarget(finallyBody.node); + + s.edges.addAll(finallyBody.edges); + } + + return s; + } + + @Override + public WorkingGraph visitForStatement(ForStatementContext ctx) { + ControlFlowGraph g = getGraph(ctx); + WorkingGraph s = new WorkingGraph(); + ForInitContext forInit = ctx.forInit(); + ExpressionContext expression = ctx.expression(); + ForUpdateContext forUpdate = ctx.forUpdate(); + StringBuilder sb = new StringBuilder(); + + sb.append(nodeCounter++); + sb.append(": for ( "); + sb.append(forInit == null ? "; " : forInit.accept(new TreePrinter()) + "; "); + sb.append(expression == null ? "; " : expression.accept(new TreePrinter()) + "; "); + + if(forUpdate != null) + sb.append(forUpdate.accept(new TreePrinter())); + + sb.append(")"); + s.node = g.buildNode(sb.toString()); + + WorkingGraph forBody = visitStatement(ctx.statement()); + + s.connect(forBody); + s.edges.add(g.buildEdge(s.node, forBody.node, EdgeLabel.TRUE)); + s.edges.add(g.buildEdge(s.node, null, EdgeLabel.FALSE)); + + for(Edge edge : forBody.edges) { + if(edge.target() == null && edge.label() != EdgeLabel.THROWN) + edge.setTarget(s.node); + } + // s.edges.addAll(forBody.edges); + + // Labelled edges will be handled by labelled statement + + List nonLabelledBreakEdges = forBody.breakEdges.get(""); + + if(nonLabelledBreakEdges != null) { + s.edges.addAll(nonLabelledBreakEdges); + s.breakEdges.remove(""); + } + + List nonLabelledContinueEdges = forBody.continueEdges.get(""); + + if(nonLabelledContinueEdges != null) { + for(Edge edge : nonLabelledContinueEdges) { + edge.setTarget(s.node); + s.edges.add(edge); + } + + s.continueEdges.remove(""); + } + + return s; + } + + @Override + public WorkingGraph visitWhileStatement(WhileStatementContext ctx) { + ControlFlowGraph g = getGraph(ctx); + WorkingGraph s = new WorkingGraph(); + ParenthesizedExpressionContext condition = ctx.parenthesizedExpression(); + + s.node = g.buildNode(nodeCounter++ + ": while " + condition.accept(new TreePrinter())); + + WorkingGraph whileBody = visitStatement(ctx.statement()); + + s.connect(whileBody); + g.buildEdge(s.node, whileBody.node, EdgeLabel.TRUE); + s.edges.add(g.buildEdge(s.node, null, EdgeLabel.FALSE)); + + for(Edge edge : whileBody.edges) { + if(edge.label() == EdgeLabel.THROWN) + s.edges.add(edge); + else + edge.target = s.node; + } + + // Labelled edges will be handled by labelled statement + + List nonLabelledBreakEdges = whileBody.breakEdges.get(""); + + if(nonLabelledBreakEdges != null) { + s.edges.addAll(nonLabelledBreakEdges); + s.breakEdges.remove(""); + } + + List nonLabelledContinueEdges = whileBody.continueEdges.get(""); + + if(nonLabelledContinueEdges != null) { + for(Edge edge : nonLabelledContinueEdges) { + edge.setTarget(s.node); + s.edges.add(edge); + } + + s.continueEdges.remove(""); + } + + return s; + } + + @Override + public WorkingGraph visitSwitchStatement(SwitchStatementContext ctx) { + ControlFlowGraph g = getGraph(ctx); + WorkingGraph s = new WorkingGraph(); + List statementGroups = ctx.switchBlockStatementGroup(); + + s.node = g.buildNode(nodeCounter++ + ": switch " + ctx.parenthesizedExpression().accept(new TreePrinter())); + + if(!statementGroups.isEmpty()) + for(SwitchBlockStatementGroupContext group : statementGroups) { + List labels = group.switchLabel(); + List statements = group.blockStatement(); + + WorkingGraph first = visitBlockStatement(statements.get(0)); + TreePrinter printer = new TreePrinter(); + + for(SwitchLabelContext label : labels) + s.edges.add(g.buildEdge(s.node, first.node, EdgeLabel.CASE, label.accept(printer))); + + for(int i = 1, size = statements.size(); i < size; i++) { + WorkingGraph later = visitBlockStatement(statements.get(i)); + + for(List list : later.breakEdges.values()) + first.edges.addAll(list); + + later.breakEdges.clear(); + first.connect(later); + } + + s.connect(first); + } + else + s.edges.add(g.buildEdge(s.node, null, EdgeLabel.BLANK)); + + List extraLabels = ctx.switchLabel(); + + for(SwitchLabelContext label : extraLabels) + s.edges.add(g.buildEdge(s.node, null, EdgeLabel.CASE, label.accept(new TreePrinter()))); + + return s; + } + + @Override + public WorkingGraph visitSynchronizedStatement(SynchronizedStatementContext ctx) { + ControlFlowGraph g = getGraph(ctx); + WorkingGraph s = new WorkingGraph(); + + s.node = g + .buildNode(nodeCounter++ + ": synchronized " + ctx.parenthesizedExpression().accept(new TreePrinter())); + s.edges.add(g.buildEdge(s.node, null, EdgeLabel.BLANK)); + + WorkingGraph block = visitBlock(ctx.block()); + + s.connect(block); + + return s; + } + + @Override + public WorkingGraph visitReturnStatement(ReturnStatementContext ctx) { + ControlFlowGraph g = getGraph(ctx); + WorkingGraph s = new WorkingGraph(); + + s.node = g.buildNode(nodeCounter++ + ": " + ctx.accept(new TreePrinter())); + s.edges.add(g.buildEdge(s.node, null, EdgeLabel.BLANK)); + + return s; + } + + @Override + public WorkingGraph visitThrowStatement(ThrowStatementContext ctx) { + ControlFlowGraph g = getGraph(ctx); + WorkingGraph s = new WorkingGraph(); + + s.node = g.buildNode(nodeCounter++ + ": " + ctx.accept(new TreePrinter())); + s.edges.add(g.buildEdge(s.node, null, EdgeLabel.THROWN)); + + return s; + } + + @Override + public WorkingGraph visitEmptyStatement(EmptyStatementContext ctx) { + ControlFlowGraph g = getGraph(ctx); + WorkingGraph s = new WorkingGraph(); + + s.node = g.buildNode(nodeCounter++ + ": *EMPTY* ; "); + s.edges.add(g.buildEdge(s.node, null, EdgeLabel.BLANK)); + + return s; + } + + @Override + public WorkingGraph visitExpressionStatement(ExpressionStatementContext ctx) { + ControlFlowGraph g = getGraph(ctx); + WorkingGraph s = new WorkingGraph(); + + s.node = g.buildNode(nodeCounter++ + ": " + ctx.accept(new TreePrinter())); + s.edges.add(g.buildEdge(s.node, null, EdgeLabel.BLANK)); + + return s; + } + + @Override + public WorkingGraph visitStatementExpression(StatementExpressionContext ctx) { + // Ignore + return null; + } + + @Override + public WorkingGraph visitConstantExpression(ConstantExpressionContext ctx) { + // Ignore + return null; + } + + @Override + public WorkingGraph visitCatches(CatchesContext ctx) { + return visitChildren(ctx); + } + + @Override + public WorkingGraph visitCatchClause(CatchClauseContext ctx) { + ControlFlowGraph g = getGraph(ctx); + WorkingGraph s = new WorkingGraph(); + + s.node = g + .buildNode(nodeCounter++ + ": catch ( " + ctx.formalParameter().type().accept(new TreePrinter()) + ")"); + + WorkingGraph body = visitBlock(ctx.block()); + + s.edges.add(g.buildEdge(s.node, body.node, EdgeLabel.CAUGHT)); + s.edges.add(g.buildEdge(s.node, null, EdgeLabel.THROWN)); + s.edges.addAll(body.edges); + + return s; + } + + @Override + public WorkingGraph visitSwitchBlockStatementGroup(SwitchBlockStatementGroupContext ctx) { + // Ignore + return null; + } + + @Override + public WorkingGraph visitSwitchLabel(SwitchLabelContext ctx) { + // Ignore + return null; + } + + @Override + public WorkingGraph visitForInit(ForInitContext ctx) { + // Ignore + return null; + } + + @Override + public WorkingGraph visitForUpdate(ForUpdateContext ctx) { + // Ignore + return null; + } + + @Override + public WorkingGraph visitModifier(ModifierContext ctx) { + // Ignore + return null; + } + + @Override + public WorkingGraph visitVariableDeclarators(VariableDeclaratorsContext ctx) { + return visitChildren(ctx); + } + + @Override + public WorkingGraph visitVariableDeclarator(VariableDeclaratorContext ctx) { + return visitChildren(ctx); + } + + @Override + public WorkingGraph visitVariableDeclaratorId(VariableDeclaratorIdContext ctx) { + // Ignore + return null; + } + + @Override + public WorkingGraph visitConstantDeclarator(ConstantDeclaratorContext ctx) { + return visitChildren(ctx); + } + + @Override + public WorkingGraph visitCompilationUnit(CompilationUnitContext ctx) { + QualifiedIdentifierContext pkg = ctx.qualifiedIdentifier(); + + if(pkg != null) + nameStack.push(pkg.accept(new TreePrinter())); + + for(TypeDeclarationContext typeDeclaration : ctx.typeDeclaration()) + typeDeclaration.accept(this); + + return null; + } + + @Override + public WorkingGraph visitImportDeclaration(ImportDeclarationContext ctx) { + // Ignore + return null; + } + + @Override + public WorkingGraph visitTypeDeclaration(TypeDeclarationContext ctx) { + return visitChildren(ctx); + } + + @Override + public WorkingGraph visitClassOrInterfaceDeclaration(ClassOrInterfaceDeclarationContext ctx) { + return visitChildren(ctx); + } + + @Override + public WorkingGraph visitClassDeclaration(ClassDeclarationContext ctx) { + nameStack.push(ctx.identifier().getText()); + visitClassBody(ctx.classBody()); + + return null; + } + + @Override + public WorkingGraph visitInterfaceDeclaration(InterfaceDeclarationContext ctx) { + // Possible nested classes + nameStack.push(ctx.identifier().getText()); + return visitChildren(ctx); + } + + @Override + public WorkingGraph visitTypeList(TypeListContext ctx) { + return visitChildren(ctx); + } + + @Override + public WorkingGraph visitClassBody(ClassBodyContext ctx) { + return visitChildren(ctx); + } + + @Override + public WorkingGraph visitInterfaceBody(InterfaceBodyContext ctx) { + return visitChildren(ctx); + } + + @Override + public WorkingGraph visitClassBodyDeclaration(ClassBodyDeclarationContext ctx) { + return visitChildren(ctx); + } + + @Override + public WorkingGraph visitMemberDeclaration(MemberDeclarationContext ctx) { + return visitChildren(ctx); + } + + private String getSignature(String identifier, FormalParametersContext ctx) { + StringBuilder sb = new StringBuilder(); + + sb.append(identifier); + sb.append("("); + + List formals = ctx.formalParameter(); + int size = formals.size(); + + if(size > 0) { + sb.append(formals.get(0).type().accept(new TreePrinter())); + + for(int i = 1; i < size; i++) { + sb.append(", "); + sb.append(formals.get(i).type().accept(new TreePrinter())); + } + } + + sb.append(")"); + + return sb.toString(); + } + + @Override + public WorkingGraph visitMethodDeclaration(MethodDeclarationContext ctx) { + if(ctx.block() != null) { + String identifier = ctx.identifier().getText(); + String signature = getSignature(identifier, ctx.formalParameters()); + ControlFlowGraph g = new ControlFlowGraph(getCurrentName() + "." + signature); + + graphMap.put(ctx.parent, g); + + WorkingGraph s = visitBlock(ctx.block()); + + g.buildEdge(g.entry, s.node, EdgeLabel.BLANK); + + for(Edge edge : s.edges) { + EdgeLabel label = edge.label(); + + if(edge.target() == null) { + if(label == EdgeLabel.THROWN) + edge.setTarget(g.abruptExit); + else + edge.setTarget(g.normalExit); + } + } + + if(!s.breakEdges.isEmpty()) + throw new IllegalStateException("WorkingGraph still contains break edges: " + s); + + if(!s.continueEdges.isEmpty()) + throw new IllegalStateException("WorkingGraph still contains continue edges: " + s); + } + + return null; + } + + @Override + public WorkingGraph visitInterfaceBodyDeclaration(InterfaceBodyDeclarationContext ctx) { + // Potentially nested classes + return visitChildren(ctx); + } + + @Override + public WorkingGraph visitFormalParameters(FormalParametersContext ctx) { + // Ignore + return null; + } + + @Override + public WorkingGraph visitFormalParameter(FormalParameterContext ctx) { + // Ignore + return null; + } + + @Override + public WorkingGraph visitDims(DimsContext ctx) { + // Ignore + return null; + } + + @Override + public WorkingGraph visitParenthesizedExpression(ParenthesizedExpressionContext ctx) { + // Ignore + return null; + } + + @Override + public WorkingGraph visitStatement(StatementContext ctx) { + return visitChildren(ctx); + } + + @Override + public WorkingGraph visitSuperclass(SuperclassContext ctx) { + // Ignore + return null; + } + + @Override + public WorkingGraph visitSuperinterfaces(SuperinterfacesContext ctx) { + // Ignore + return null; + } + + @Override + public WorkingGraph visitExtendsInterfaces(ExtendsInterfacesContext ctx) { + // Ignore + return null; + } + + @Override + public WorkingGraph visitEmptyDeclaration(EmptyDeclarationContext ctx) { + // Ignore + return null; + } + + @Override + public WorkingGraph visitInitializer(InitializerContext ctx) { + ControlFlowGraph g = new ControlFlowGraph(getCurrentName() + "."); + + graphMap.put(ctx.parent, g); + + WorkingGraph s = visitBlock(ctx.block()); + + g.buildEdge(g.entry, s.node, EdgeLabel.BLANK); + + for(Edge edge : s.edges) { + EdgeLabel label = edge.label(); + + if(edge.target() == null) { + if(label == EdgeLabel.THROWN) + edge.setTarget(g.abruptExit); + else + edge.setTarget(g.normalExit); + } + } + + if(!s.breakEdges.isEmpty()) + throw new IllegalStateException("WorkingGraph still contains break edges: " + s); + + if(!s.continueEdges.isEmpty()) + throw new IllegalStateException("WorkingGraph still contains continue edges: " + s); + + return null; + } + + @Override + public WorkingGraph visitStaticInitializer(StaticInitializerContext ctx) { + ControlFlowGraph g = new ControlFlowGraph(getCurrentName() + "."); + + graphMap.put(ctx.parent, g); + + WorkingGraph s = visitBlock(ctx.block()); + + g.buildEdge(g.entry, s.node, EdgeLabel.BLANK); + + for(Edge edge : s.edges) { + EdgeLabel label = edge.label(); + + if(edge.target() == null) { + if(label == EdgeLabel.THROWN) + edge.setTarget(g.abruptExit); + else + edge.setTarget(g.normalExit); + } + } + + if(!s.breakEdges.isEmpty()) + throw new IllegalStateException("WorkingGraph still contains break edges: " + s); + + if(!s.continueEdges.isEmpty()) + throw new IllegalStateException("WorkingGraph still contains continue edges: " + s); + + return null; + } + + @Override + public WorkingGraph visitResult(ResultContext ctx) { + // Ignore + return null; + } + + @Override + public WorkingGraph visitThrows_(Throws_Context ctx) { + // Ignore + return null; + } + + @Override + public WorkingGraph visitFieldDeclaration(FieldDeclarationContext ctx) { + return visitChildren(ctx); + } + + @Override + public WorkingGraph visitConstructorDeclaration(ConstructorDeclarationContext ctx) { + String identifier = ctx.identifier().getText(); + String signature = getSignature(identifier, ctx.formalParameters()); + ControlFlowGraph g = new ControlFlowGraph(getCurrentName() + "." + signature); + + graphMap.put(ctx.parent, g); + + WorkingGraph s = visitConstructorBody(ctx.constructorBody()); + + g.buildEdge(g.entry, s.node, EdgeLabel.BLANK); + + for(Edge edge : s.edges) { + EdgeLabel label = edge.label(); + + if(edge.target() == null) { + if(label == EdgeLabel.THROWN) + edge.setTarget(g.abruptExit); + else + edge.setTarget(g.normalExit); + } + } + + if(!s.breakEdges.isEmpty()) + throw new IllegalStateException("WorkingGraph still contains break edges: " + s); + + if(!s.continueEdges.isEmpty()) + throw new IllegalStateException("WorkingGraph still contains continue edges: " + s); + + return null; + } + + @Override + public WorkingGraph visitConstructorBody(ConstructorBodyContext ctx) { + ControlFlowGraph g = getGraph(ctx); + WorkingGraph s = new WorkingGraph(); + + s.node = g.buildNode(nodeCounter++ + ": body"); + s.edges.add(g.buildEdge(s.node, null, EdgeLabel.BLANK)); + + WorkingGraph body = null; + ExplicitConstructorInvocationContext eci = ctx.explicitConstructorInvocation(); + + if(eci != null) { + body = visitExplicitConstructorInvocation(eci); + s.connect(body); + } + + for(BlockStatementContext statement : ctx.blockStatement()) { + body = visitBlockStatement(statement); + s.connect(body); + } + + return s; + } + + @Override + public WorkingGraph visitExplicitConstructorInvocation(ExplicitConstructorInvocationContext ctx) { + ControlFlowGraph g = getGraph(ctx); + WorkingGraph s = new WorkingGraph(); + + s.node = g.buildNode(nodeCounter++ + ": " + ctx.accept(new TreePrinter())); + s.edges.add(g.buildEdge(s.node, null, EdgeLabel.BLANK)); + + return s; + } + + @Override + public WorkingGraph visitInterfaceMemberDeclaration(InterfaceMemberDeclarationContext ctx) { + return visitChildren(ctx); + } + + @Override + public WorkingGraph visitInterfaceMethodDeclaration(InterfaceMethodDeclarationContext ctx) { + // Ignore + return null; + } + + @Override + public WorkingGraph visitConstantDeclaration(ConstantDeclarationContext ctx) { + // Ignore + return null; + } + + @Override + public WorkingGraph visitQualifiedIdentifiers(QualifiedIdentifiersContext ctx) { + // Ignore + return null; + } + + @Override + public WorkingGraph visitElseClause(ElseClauseContext ctx) { + ControlFlowGraph g = getGraph(ctx); + WorkingGraph s = new WorkingGraph(); + + s.node = g.buildNode(nodeCounter++ + ": else"); + + WorkingGraph body = visitStatement(ctx.statement()); + + s.edges.add(g.buildEdge(s.node, body.node, EdgeLabel.BLANK)); + s.connect(body); + + return s; + } + + @Override + public WorkingGraph visitFinallyClause(FinallyClauseContext ctx) { + // Ignore + return null; + } + + @SuppressWarnings("javadoc") + public WorkingGraph visitFinallyClause(FinallyClauseContext ctx, boolean delayedThrown) { + ControlFlowGraph g = getGraph(ctx); + WorkingGraph s = new WorkingGraph(); + + s.node = g.buildNode(nodeCounter++ + ": finally"); + + WorkingGraph body = visitFinallyBlock(ctx.block(), delayedThrown); + + s.edges.add(g.buildEdge(s.node, body.node, EdgeLabel.BLANK)); + + if(delayedThrown) + s.edges.add(g.buildEdge(s.node, body.node, EdgeLabel.THROWN_DELAYED)); + + return s; + } +} + +class WorkingGraph { + public List edges = new ArrayList<>(); + public Node node; + public Map> breakEdges = new HashMap<>(); + public Map> continueEdges = new HashMap<>(); + + public void connect(WorkingGraph s) { + if(s == null) + return; + + for(Edge edge : edges) { + if(edge.label() != EdgeLabel.THROWN && edge.target == null) + edge.setTarget(s.node); + } + + edges.addAll(s.edges); + + for(String label : s.breakEdges.keySet()) { + List sEdges = s.breakEdges.get(label); + List thisEdges = breakEdges.get(label); + + if(thisEdges == null) + breakEdges.put(label, sEdges); + else + thisEdges.addAll(sEdges); + } + + for(String label : s.continueEdges.keySet()) { + List sEdges = s.continueEdges.get(label); + List thisEdges = continueEdges.get(label); + + if(thisEdges == null) + continueEdges.put(label, sEdges); + else + thisEdges.addAll(sEdges); + } + } +} diff --git a/src/org/lsmr/cfg/TreePrinter.java b/src/org/lsmr/cfg/TreePrinter.java new file mode 100644 index 0000000..54dc702 --- /dev/null +++ b/src/org/lsmr/cfg/TreePrinter.java @@ -0,0 +1,607 @@ +package org.lsmr.cfg; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Stack; + +import org.antlr.v4.runtime.tree.ErrorNode; +import org.antlr.v4.runtime.tree.ParseTree; +import org.antlr.v4.runtime.tree.RuleNode; +import org.antlr.v4.runtime.tree.TerminalNode; +import org.lsmr.cfg.Edge.EdgeLabel; +import org.lsmr.cfg.Java1_4Parser.ArgumentsContext; +import org.lsmr.cfg.Java1_4Parser.ArrayCreatorRestContext; +import org.lsmr.cfg.Java1_4Parser.ArrayInitializerContext; +import org.lsmr.cfg.Java1_4Parser.AssertStatementContext; +import org.lsmr.cfg.Java1_4Parser.AssignmentOperatorContext; +import org.lsmr.cfg.Java1_4Parser.BasicTypeContext; +import org.lsmr.cfg.Java1_4Parser.BlockContext; +import org.lsmr.cfg.Java1_4Parser.BlockStatementContext; +import org.lsmr.cfg.Java1_4Parser.BreakStatementContext; +import org.lsmr.cfg.Java1_4Parser.CatchClauseContext; +import org.lsmr.cfg.Java1_4Parser.CatchesContext; +import org.lsmr.cfg.Java1_4Parser.ClassBodyContext; +import org.lsmr.cfg.Java1_4Parser.ClassBodyDeclarationContext; +import org.lsmr.cfg.Java1_4Parser.ClassCreatorRestContext; +import org.lsmr.cfg.Java1_4Parser.ClassDeclarationContext; +import org.lsmr.cfg.Java1_4Parser.ClassOrInterfaceDeclarationContext; +import org.lsmr.cfg.Java1_4Parser.CompilationUnitContext; +import org.lsmr.cfg.Java1_4Parser.ConstantDeclarationContext; +import org.lsmr.cfg.Java1_4Parser.ConstantDeclaratorContext; +import org.lsmr.cfg.Java1_4Parser.ConstantExpressionContext; +import org.lsmr.cfg.Java1_4Parser.ConstructorBodyContext; +import org.lsmr.cfg.Java1_4Parser.ConstructorDeclarationContext; +import org.lsmr.cfg.Java1_4Parser.ContinueStatementContext; +import org.lsmr.cfg.Java1_4Parser.CreatorContext; +import org.lsmr.cfg.Java1_4Parser.DimsContext; +import org.lsmr.cfg.Java1_4Parser.DoStatementContext; +import org.lsmr.cfg.Java1_4Parser.ElseClauseContext; +import org.lsmr.cfg.Java1_4Parser.EmptyDeclarationContext; +import org.lsmr.cfg.Java1_4Parser.EmptyStatementContext; +import org.lsmr.cfg.Java1_4Parser.ExplicitConstructorInvocationContext; +import org.lsmr.cfg.Java1_4Parser.Expression1Context; +import org.lsmr.cfg.Java1_4Parser.Expression1RestContext; +import org.lsmr.cfg.Java1_4Parser.Expression2Context; +import org.lsmr.cfg.Java1_4Parser.Expression2RestContext; +import org.lsmr.cfg.Java1_4Parser.Expression3Context; +import org.lsmr.cfg.Java1_4Parser.ExpressionContext; +import org.lsmr.cfg.Java1_4Parser.ExpressionStatementContext; +import org.lsmr.cfg.Java1_4Parser.ExtendsInterfacesContext; +import org.lsmr.cfg.Java1_4Parser.FieldDeclarationContext; +import org.lsmr.cfg.Java1_4Parser.FinallyClauseContext; +import org.lsmr.cfg.Java1_4Parser.ForInitContext; +import org.lsmr.cfg.Java1_4Parser.ForStatementContext; +import org.lsmr.cfg.Java1_4Parser.ForUpdateContext; +import org.lsmr.cfg.Java1_4Parser.FormalParameterContext; +import org.lsmr.cfg.Java1_4Parser.FormalParametersContext; +import org.lsmr.cfg.Java1_4Parser.IdentifierContext; +import org.lsmr.cfg.Java1_4Parser.IdentifierSuffixContext; +import org.lsmr.cfg.Java1_4Parser.IfStatementContext; +import org.lsmr.cfg.Java1_4Parser.ImportDeclarationContext; +import org.lsmr.cfg.Java1_4Parser.InfixOpContext; +import org.lsmr.cfg.Java1_4Parser.InitializerContext; +import org.lsmr.cfg.Java1_4Parser.InnerCreatorContext; +import org.lsmr.cfg.Java1_4Parser.InterfaceBodyContext; +import org.lsmr.cfg.Java1_4Parser.InterfaceBodyDeclarationContext; +import org.lsmr.cfg.Java1_4Parser.InterfaceDeclarationContext; +import org.lsmr.cfg.Java1_4Parser.InterfaceMemberDeclarationContext; +import org.lsmr.cfg.Java1_4Parser.InterfaceMethodDeclarationContext; +import org.lsmr.cfg.Java1_4Parser.LabeledStatementContext; +import org.lsmr.cfg.Java1_4Parser.LiteralContext; +import org.lsmr.cfg.Java1_4Parser.LocalVariableDeclarationStatementContext; +import org.lsmr.cfg.Java1_4Parser.MemberDeclarationContext; +import org.lsmr.cfg.Java1_4Parser.MethodDeclarationContext; +import org.lsmr.cfg.Java1_4Parser.ModifierContext; +import org.lsmr.cfg.Java1_4Parser.ParenthesizedExpressionContext; +import org.lsmr.cfg.Java1_4Parser.PostfixOpContext; +import org.lsmr.cfg.Java1_4Parser.PrefixOpContext; +import org.lsmr.cfg.Java1_4Parser.PrimaryContext; +import org.lsmr.cfg.Java1_4Parser.QualifiedIdentifierContext; +import org.lsmr.cfg.Java1_4Parser.QualifiedIdentifiersContext; +import org.lsmr.cfg.Java1_4Parser.ResultContext; +import org.lsmr.cfg.Java1_4Parser.ReturnStatementContext; +import org.lsmr.cfg.Java1_4Parser.SelectorContext; +import org.lsmr.cfg.Java1_4Parser.StatementContext; +import org.lsmr.cfg.Java1_4Parser.StatementExpressionContext; +import org.lsmr.cfg.Java1_4Parser.StaticInitializerContext; +import org.lsmr.cfg.Java1_4Parser.SuperSuffixContext; +import org.lsmr.cfg.Java1_4Parser.SuperclassContext; +import org.lsmr.cfg.Java1_4Parser.SuperinterfacesContext; +import org.lsmr.cfg.Java1_4Parser.SwitchBlockStatementGroupContext; +import org.lsmr.cfg.Java1_4Parser.SwitchLabelContext; +import org.lsmr.cfg.Java1_4Parser.SwitchStatementContext; +import org.lsmr.cfg.Java1_4Parser.SynchronizedStatementContext; +import org.lsmr.cfg.Java1_4Parser.ThrowStatementContext; +import org.lsmr.cfg.Java1_4Parser.Throws_Context; +import org.lsmr.cfg.Java1_4Parser.TryStatementContext; +import org.lsmr.cfg.Java1_4Parser.TypeContext; +import org.lsmr.cfg.Java1_4Parser.TypeDeclarationContext; +import org.lsmr.cfg.Java1_4Parser.TypeListContext; +import org.lsmr.cfg.Java1_4Parser.VariableDeclaratorContext; +import org.lsmr.cfg.Java1_4Parser.VariableDeclaratorIdContext; +import org.lsmr.cfg.Java1_4Parser.VariableDeclaratorsContext; +import org.lsmr.cfg.Java1_4Parser.VariableInitializerContext; +import org.lsmr.cfg.Java1_4Parser.WhileStatementContext; + +/** + * This class will visit the nodes in a parse tree to print the resulting code. + */ +public class TreePrinter implements Java1_4ParserVisitor { + @Override + public String visit(ParseTree arg0) { + return arg0.accept(this); + } + + @Override + public String visitChildren(RuleNode arg0) { + StringBuilder sb = new StringBuilder(); + int childCount = arg0.getChildCount(); + + for(int i = 0; i < childCount; i++) { + sb.append(visit(arg0.getChild(i))); + + if(sb.charAt(sb.length() - 1) != ' ') + sb.append(" "); + } + + return sb.toString(); + } + + @Override + public String visitErrorNode(ErrorNode arg0) { + return null; + } + + @Override + public String visitTerminal(TerminalNode arg0) { + return arg0.getText(); + } + + @Override + public String visitIdentifier(IdentifierContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitQualifiedIdentifier(QualifiedIdentifierContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitLiteral(LiteralContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitType(TypeContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitBasicType(BasicTypeContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitExpression(ExpressionContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitAssignmentOperator(AssignmentOperatorContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitExpression1(Expression1Context ctx) { + return visitChildren(ctx); + } + + @Override + public String visitExpression1Rest(Expression1RestContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitExpression2(Expression2Context ctx) { + return visitChildren(ctx); + } + + @Override + public String visitExpression2Rest(Expression2RestContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitInfixOp(InfixOpContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitExpression3(Expression3Context ctx) { + return visitChildren(ctx); + } + + @Override + public String visitPrefixOp(PrefixOpContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitPostfixOp(PostfixOpContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitPrimary(PrimaryContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitIdentifierSuffix(IdentifierSuffixContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitSelector(SelectorContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitSuperSuffix(SuperSuffixContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitArguments(ArgumentsContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitCreator(CreatorContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitInnerCreator(InnerCreatorContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitArrayCreatorRest(ArrayCreatorRestContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitClassCreatorRest(ClassCreatorRestContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitArrayInitializer(ArrayInitializerContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitVariableInitializer(VariableInitializerContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitBlock(BlockContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitBlockStatement(BlockStatementContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitLocalVariableDeclarationStatement(LocalVariableDeclarationStatementContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitAssertStatement(AssertStatementContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitBreakStatement(BreakStatementContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitContinueStatement(ContinueStatementContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitDoStatement(DoStatementContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitIfStatement(IfStatementContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitTryStatement(TryStatementContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitForStatement(ForStatementContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitWhileStatement(WhileStatementContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitSwitchStatement(SwitchStatementContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitSynchronizedStatement(SynchronizedStatementContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitReturnStatement(ReturnStatementContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitThrowStatement(ThrowStatementContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitEmptyStatement(EmptyStatementContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitExpressionStatement(ExpressionStatementContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitStatementExpression(StatementExpressionContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitConstantExpression(ConstantExpressionContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitCatches(CatchesContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitCatchClause(CatchClauseContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitSwitchBlockStatementGroup(SwitchBlockStatementGroupContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitSwitchLabel(SwitchLabelContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitForInit(ForInitContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitForUpdate(ForUpdateContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitModifier(ModifierContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitVariableDeclarators(VariableDeclaratorsContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitVariableDeclarator(VariableDeclaratorContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitVariableDeclaratorId(VariableDeclaratorIdContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitConstantDeclarator(ConstantDeclaratorContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitCompilationUnit(CompilationUnitContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitImportDeclaration(ImportDeclarationContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitTypeDeclaration(TypeDeclarationContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitClassOrInterfaceDeclaration(ClassOrInterfaceDeclarationContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitClassDeclaration(ClassDeclarationContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitInterfaceDeclaration(InterfaceDeclarationContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitTypeList(TypeListContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitClassBody(ClassBodyContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitInterfaceBody(InterfaceBodyContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitClassBodyDeclaration(ClassBodyDeclarationContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitMemberDeclaration(MemberDeclarationContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitMethodDeclaration(MethodDeclarationContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitInterfaceBodyDeclaration(InterfaceBodyDeclarationContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitFormalParameters(FormalParametersContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitFormalParameter(FormalParameterContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitDims(DimsContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitParenthesizedExpression(ParenthesizedExpressionContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitStatement(StatementContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitSuperclass(SuperclassContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitSuperinterfaces(SuperinterfacesContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitExtendsInterfaces(ExtendsInterfacesContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitEmptyDeclaration(EmptyDeclarationContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitInitializer(InitializerContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitStaticInitializer(StaticInitializerContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitResult(ResultContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitThrows_(Throws_Context ctx) { + return visitChildren(ctx); + } + + @Override + public String visitFieldDeclaration(FieldDeclarationContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitConstructorDeclaration(ConstructorDeclarationContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitConstructorBody(ConstructorBodyContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitExplicitConstructorInvocation(ExplicitConstructorInvocationContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitInterfaceMemberDeclaration(InterfaceMemberDeclarationContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitInterfaceMethodDeclaration(InterfaceMethodDeclarationContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitConstantDeclaration(ConstantDeclarationContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitQualifiedIdentifiers(QualifiedIdentifiersContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitElseClause(ElseClauseContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitFinallyClause(FinallyClauseContext ctx) { + return visitChildren(ctx); + } + + @Override + public String visitLabeledStatement(LabeledStatementContext ctx) { + return visitChildren(ctx); + } +} diff --git a/src/pdg/PDG.java b/src/pdg/PDG.java new file mode 100644 index 0000000..f5a1e42 --- /dev/null +++ b/src/pdg/PDG.java @@ -0,0 +1,454 @@ +// program Dependence Graph implementation using the Profs CFG. +// combines control dependence and data dependence. +package pdg; + +import org.lsmr.cfg.ControlFlowGraph; +import org.lsmr.cfg.Node; +import org.lsmr.cfg.Edge; +import org.jgrapht.Graph; +import org.jgrapht.graph.DefaultDirectedGraph; + +import java.util.*; + +public class PDG { + private ControlFlowGraph cfg; + private Graph pdg; + private Map cfgToPdgMap; + + // Analysis results + private Map> postDominators; + private Map> controlDependence; + private Map> dataDependence; + + public PDG(ControlFlowGraph cfg) { + this.cfg = cfg; + this.pdg = new DefaultDirectedGraph<>(PDGEdge.class); + this.cfgToPdgMap = new HashMap<>(); + this.postDominators = new HashMap<>(); + this.controlDependence = new HashMap<>(); + this.dataDependence = new HashMap<>(); + + buildPDG(); + } + + // build the complete PDG. + private void buildPDG() { + // Step 1: create PDG nodes from CFG nodes + createPDGNodes(); + // Step 2: compute control dependence + computeControlDependence(); + // Step 3: compute data dependence + computeDataDependence(); + // Step 4: add edges to PDG + addPDGEdges(); + } + + // Create a PDG node for each CFG node. + private void createPDGNodes() { + for (Node cfgNode : cfg.nodes()) { + PDGNode pdgNode = new PDGNode(cfgNode); + pdg.addVertex(pdgNode); + cfgToPdgMap.put(cfgNode, pdgNode); + } + } + + // Compute control dependence using post-dominator analysis. + // Source: https://pages.cs.wisc.edu/~fischer/cs701.f14/lectures/L6.4up.pdf + private void computeControlDependence() { + // If, compute post-dominators + computePostDominators(); + // Then, compute control dependence + for (Node node : cfg.nodes()) { + controlDependence.put(node, new HashSet<>()); + } + + // for each edge X -> Y in the CFG + for (Node x : cfg.nodes()) { + for (Edge edge : x.outEdges()) { + Node y = edge.target(); + if (y == null) continue; + // find all nodes that are control-dependent on X via this edge + for (Node node : cfg.nodes()) { + // Node is control-dependent on X if: + // 1. Node post-dominates Y (the successor) + // 2. Node does NOT post-dominate X + if (postDominates(node, y) && !postDominates(node, x)) { + controlDependence.get(x).add(node); + } + } + } + } + } + + // compute post-dominators using fixed-point algorithm. + // node Y post-dominates X if all paths from X to exit go through Y. + private void computePostDominators() { + List allNodes = cfg.nodes(); + Node exitNode = cfg.normalExit; + for (Node node : allNodes) { + postDominators.put(node, new HashSet<>(allNodes)); + } + + if (exitNode != null) { + postDominators.put(exitNode, new HashSet<>(Arrays.asList(exitNode))); + } + + boolean changed = true; + while (changed) { + changed = false; + + for (Node node : allNodes) { + if (node.equals(exitNode)) continue; + + Set newPostDom = new HashSet<>(); + newPostDom.add(node); // Node post-dominates itself + + Set successorEdges = node.outEdges(); + if (!successorEdges.isEmpty()) { + boolean first = true; + for (Edge edge : successorEdges) { + Node successor = edge.target(); + if (successor == null) continue; + + if (first) { + newPostDom.addAll(postDominators.get(successor)); + first = false; + } else { + newPostDom.retainAll(postDominators.get(successor)); + } + } + } + + if (!newPostDom.equals(postDominators.get(node))) { + postDominators.put(node, newPostDom); + changed = true; + } + } + } + } + + private boolean postDominates(Node dominator, Node node) { + Set postDoms = postDominators.get(node); + return postDoms != null && postDoms.contains(dominator); + } + + private void computeDataDependence() { + Map> defs = new HashMap<>(); + Map> uses = new HashMap<>(); + + for (Node node : cfg.nodes()) { + defs.put(node, extractDefs(node)); + uses.put(node, extractUses(node)); + PDGNode pdgNode = cfgToPdgMap.get(node); + pdgNode.setDefs(defs.get(node)); + pdgNode.setUses(uses.get(node)); + } + Map> reachingDefs = computeReachingDefinitions(defs); + for (Node node : cfg.nodes()) { + dataDependence.put(node, new HashSet<>()); + } + for (Node use : cfg.nodes()) { + Set usedVars = uses.get(use); + Set reaching = reachingDefs.get(use); + + for (Definition def : reaching) { + if (usedVars.contains(def.variable)) { + dataDependence.get(def.node).add(use); + } + } + } + } + + // Extract variable definitions from a CFG node. + private Set extractDefs(Node node) { + Set defs = new HashSet<>(); + String label = node.label(); + + if (label.startsWith("*")) { // Skip special nodes + return defs; + } + + if (label.contains("=") && !label.contains("==")) { // Look for assignments: variable = ... + try { + String[] parts = label.split("="); + if (parts.length >= 2) { + String varPart = parts[0].trim(); + + // handle "int v" or just "v" + String[] tokens = varPart.split("\\s+"); + String varName = tokens[tokens.length - 1].replaceAll("[^a-zA-Z0-9_]", ""); + + if (varName.length() > 0 && Character.isJavaIdentifierStart(varName.charAt(0))) { + defs.add(varName); + } + } + } catch (Exception e) { + // parsing failed, ignore + } + } + + return defs; + } + + // Extract variable uses from a CFG node. + private Set extractUses(Node node) { + Set uses = new HashSet<>(); + String label = node.label(); + + // Skip special nodes + if (label.startsWith("*")) { + return uses; + } + + // For assignments, extract from right-hand side + if (label.contains("=") && !label.contains("==")) { + String[] parts = label.split("=", 2); + if (parts.length >= 2) { + String rhs = parts[1].trim().replace(";", ""); + uses.addAll(extractVariablesFromExpression(rhs)); + } + } else { + // For other statements, extract all variables + uses.addAll(extractVariablesFromExpression(label)); + } + + return uses; + } + + // Extract variable names from an expression. + private Set extractVariablesFromExpression(String expr) { + Set vars = new HashSet<>(); + + // Remove common operators and split + String cleaned = expr.replaceAll("[+\\-*/()\\[\\]{}<>=!&|;,.]", " "); + String[] tokens = cleaned.split("\\s+"); + + for (String token : tokens) { + token = token.trim(); + if (token.isEmpty()) continue; + + // Check if it's a valid identifier (not a number, not a keyword) + if (isValidIdentifier(token) && !isKeyword(token)) { + vars.add(token); + } + } + + return vars; + } + + private boolean isValidIdentifier(String s) { + if (s == null || s.isEmpty()) return false; + + // Check if it's a number + try { + Integer.parseInt(s); + return false; + } catch (NumberFormatException e) { + // Not a number, continue + } + + if (!Character.isJavaIdentifierStart(s.charAt(0))) return false; + for (int i = 1; i < s.length(); i++) { + if (!Character.isJavaIdentifierPart(s.charAt(i))) return false; + } + return true; + } + + private boolean isKeyword(String s) { + Set keywords = new HashSet<>(Arrays.asList( + "if", "else", "while", "for", "return", "int", "boolean", "void", "class", + "public", "private", "static", "new", "this", "true", "false", "null", + "break", "continue", "switch", "case", "default", "try", "catch", "finally", + "throw", "throws", "extends", "implements", "abstract", "final", "native", + "synchronized", "transient", "volatile", "strictfp", "package", "import" + )); + return keywords.contains(s); + } + + // Compute reaching definitions using fixed-point analysis. + private Map> computeReachingDefinitions(Map> defs) { + Map> reachingDefs = new HashMap<>(); + + // Initialize + for (Node node : cfg.nodes()) { + reachingDefs.put(node, new HashSet<>()); + } + + // Fixed-point iteration + boolean changed = true; + while (changed) { + changed = false; + + for (Node node : cfg.nodes()) { + Set newReaching = new HashSet<>(); + + // Union of reaching definitions from all predecessors + Set inEdges = node.inEdges(); + for (Edge edge : inEdges) { + Node pred = edge.source(); + Set predReaching = new HashSet<>(reachingDefs.get(pred)); + + // Kill definitions of variables defined in pred + Set predDefs = defs.get(pred); + predReaching.removeIf(def -> predDefs.contains(def.variable)); + + // Gen: Add new definitions from pred + for (String var : predDefs) { + predReaching.add(new Definition(pred, var)); + } + + newReaching.addAll(predReaching); + } + + if (!newReaching.equals(reachingDefs.get(node))) { + reachingDefs.put(node, newReaching); + changed = true; + } + } + } + + return reachingDefs; + } + + // Add control and data dependence edges to PDG. + private void addPDGEdges() { + // Add control dependence edges + for (Node from : controlDependence.keySet()) { + PDGNode fromPDG = cfgToPdgMap.get(from); + for (Node to : controlDependence.get(from)) { + PDGNode toPDG = cfgToPdgMap.get(to); + PDGEdge edge = new PDGEdge(PDGEdge.EdgeType.CONTROL); + try { + pdg.addEdge(fromPDG, toPDG, edge); + } catch (IllegalArgumentException e) { + // Edge might already exist + } + } + } + + // Add data dependence edges + for (Node from : dataDependence.keySet()) { + PDGNode fromPDG = cfgToPdgMap.get(from); + for (Node to : dataDependence.get(from)) { + PDGNode toPDG = cfgToPdgMap.get(to); + PDGEdge edge = new PDGEdge(PDGEdge.EdgeType.DATA); + try { + pdg.addEdge(fromPDG, toPDG, edge); + } catch (IllegalArgumentException e) { + // Edge might already exist + } + } + } + } + + /** + * Compute forward slice from a given node label. + * Returns all nodes that could be impacted by a change to the given node. + **/ + public Set computeForwardSlice(String nodeLabel) { + Node startCFGNode = cfg.findNode(nodeLabel); // Find the CFG node with this label + if (startCFGNode == null) { + return Collections.emptySet(); + } + return computeForwardSliceFromNode(startCFGNode); + } + + // Compute forward slice from a given node. + private Set computeForwardSliceFromNode(Node startNode) { + PDGNode startPDGNode = cfgToPdgMap.get(startNode); + Set impactedLabels = new HashSet<>(); + Set visited = new HashSet<>(); + Queue queue = new LinkedList<>(); + + queue.add(startPDGNode); + visited.add(startPDGNode); + + while (!queue.isEmpty()) { + PDGNode current = queue.poll(); + impactedLabels.add(current.getCfgNode().label()); + + // Follow all outgoing edges (both control and data) + Set outEdges = pdg.outgoingEdgesOf(current); + for (PDGEdge edge : outEdges) { + PDGNode target = pdg.getEdgeTarget(edge); + if (!visited.contains(target)) { + visited.add(target); + queue.add(target); + } + } + } + + return impactedLabels; + } + + // Print the PDG structure. + public void printPDG() { + System.out.println("\n=== PDG Structure ==="); + + List nodes = new ArrayList<>(pdg.vertexSet()); + nodes.sort(Comparator.comparing(n -> n.getCfgNode().label())); + + for (PDGNode node : nodes) { + System.out.print("Node: " + node.getCfgNode().label()); + System.out.print(" [Defs: " + node.getDefs() + ", Uses: " + node.getUses() + "]"); + System.out.println(); + + Set outEdges = pdg.outgoingEdgesOf(node); + for (PDGEdge edge : outEdges) { + PDGNode target = pdg.getEdgeTarget(edge); + System.out.println(" -> " + edge.getType() + " dep on: " + target.getCfgNode().label()); + } + } + } + + // Print CFG structure for debugging. + public void printCFG() { + System.out.println("\n=== CFG Structure ==="); + System.out.println("Entry: " + cfg.entry.label()); + System.out.println("Normal Exit: " + cfg.normalExit.label()); + System.out.println("Abrupt Exit: " + cfg.abruptExit.label()); + System.out.println("\nNodes:"); + + for (Node node : cfg.nodes()) { + System.out.println(" " + node.label()); + for (Edge edge : node.outEdges()) { + String target = edge.target() != null ? edge.target().label() : "null"; + System.out.println(" -> " + edge.label() + " to " + target); + } + } + } + + // Get the PDG graph. + public Graph getGraph() { + return pdg; + } + + // Get the underlying CFG. + public ControlFlowGraph getCFG() { + return cfg; + } + + //Helper class for tracking definitions + private static class Definition { + Node node; + String variable; + + Definition(Node node, String variable) { + this.node = node; + this.variable = variable; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof Definition)) return false; + Definition that = (Definition) o; + return node.equals(that.node) && variable.equals(that.variable); + } + + @Override + public int hashCode() { + return Objects.hash(node, variable); + } + } +} diff --git a/src/pdg/PDGEdge.java b/src/pdg/PDGEdge.java new file mode 100644 index 0000000..bcc6ca1 --- /dev/null +++ b/src/pdg/PDGEdge.java @@ -0,0 +1,29 @@ +/** + * Edge in the PDG representing either control or data dependence. + */ +package pdg; + +import org.jgrapht.graph.DefaultEdge; + +public class PDGEdge extends DefaultEdge { + + public enum EdgeType { + CONTROL, // Control dependence + DATA // Data dependence + } + + private EdgeType type; + + public PDGEdge(EdgeType type) { + this.type = type; + } + + public EdgeType getType() { + return type; + } + + @Override + public String toString() { + return type.toString(); + } +} diff --git a/src/pdg/PDGNode.java b/src/pdg/PDGNode.java new file mode 100644 index 0000000..3fb672a --- /dev/null +++ b/src/pdg/PDGNode.java @@ -0,0 +1,60 @@ + +/** + * PDG Node that wraps a CFG node (org.lsmr.cfg.Node) and adds def-use information. + */ + package pdg; + +import org.lsmr.cfg.Node; +import java.util.*; + + +public class PDGNode { + private Node cfgNode; + private Set defs; + private Set uses; + + public PDGNode(Node cfgNode) { + this.cfgNode = cfgNode; + this.defs = new HashSet<>(); + this.uses = new HashSet<>(); + } + + public Node getCfgNode() { + return cfgNode; + } + + public Set getDefs() { + return defs; + } + + public void setDefs(Set defs) { + this.defs = defs; + } + + public Set getUses() { + return uses; + } + + public void setUses(Set uses) { + this.uses = uses; + } + + @Override + public String toString() { + return "PDGNode{" + cfgNode.label() + + ", defs=" + defs + ", uses=" + uses + '}'; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof PDGNode)) return false; + PDGNode pdgNode = (PDGNode) o; + return cfgNode.equals(pdgNode.cfgNode); + } + + @Override + public int hashCode() { + return Objects.hash(cfgNode); + } +}