17 Commits
main ... nico

Author SHA1 Message Date
Mann Patel
1c59eb1b5b remove unwanted lib's 2025-12-23 22:13:47 -07:00
Mann Patel
35458c6cbf Update README.md 2025-12-22 03:22:46 -07:00
Mann Patel
5ac562803a Update README.md 2025-12-21 17:51:57 -07:00
patel-mann
4893129144 UPD 2025-12-18 15:16:47 -07:00
Mann Patel
27bc69e837 update: testing and result finding quest 2025-12-17 21:10:51 -07:00
Nicolas Amaya
4c7002c263 changes to PDG seems to be working for if, while and for added some stuff for arrays but havent tested yet 2025-12-15 20:03:43 -07:00
Nicolas Amaya
046634109c Fixed bug in extractDefs & extractUses 2025-12-15 18:06:48 -07:00
Nicolas Amaya
c40bdeb411 Updated name from PDGTool to CIA 2025-12-14 17:54:03 -07:00
Nicolas Amaya
c70db58e20 Updated getAllLineNumbers function, was moving into cfg it returns a List<Integer> 2025-12-14 16:24:46 -07:00
Nicolas Amaya
9437b5e88d clean up of CFGBuilder removing prev strategy to get line number 2025-12-14 16:10:38 -07:00
Nicolas Amaya
6d02dc8fa7 Updated Line number to be a field of the Node of the CFG 2025-12-14 16:08:41 -07:00
Nicolas Amaya
35b5447c7d removed r which was breaking the code v2 2025-12-13 23:28:36 -07:00
Nicolas Amaya
8579c0bfc0 removed r which was breaking the code 2025-12-13 23:20:04 -07:00
Mann Patel
c574bf8100 Update README.md 2025-12-04 22:17:52 -07:00
Mann Patel
c021b1eabf we are moving form post dominators. 2025-12-04 18:41:14 -07:00
Mann Patel
ab9d95be1f Feat: Initial setup + PDG (Needs checking tho) 2025-11-28 22:03:34 -07:00
Mann Patel
cd1a698fa5 Clean Slate 2025-11-24 20:25:37 -07:00
52 changed files with 12889 additions and 15441 deletions

BIN
.DS_Store vendored Normal file

Binary file not shown.

File diff suppressed because one or more lines are too long

View File

@@ -1,795 +0,0 @@
// Generated from /Users/mannpatel/Desktop/CPSC-499/ExprLexer.g4 by ANTLR 4.13.1
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 ExprLexer extends Lexer {
static { RuntimeMetaData.checkVersion("4.13.1", RuntimeMetaData.VERSION); }
protected static final DFA[] _decisionToDFA;
protected static final PredictionContextCache _sharedContextCache =
new PredictionContextCache();
public static final int
WhiteSpace=1, Comment=2, Abstract=3, Assert=4, Boolean=5, Break=6, Byte=7,
Case=8, Catch=9, Char=10, Class=11, Const=12, Continue=13, Default=14,
Do=15, Double=16, Else=17, Extends=18, Final=19, Finally=20, Float=21,
For=22, Goto=23, If=24, Implements=25, Import=26, InstanceOf=27, Int=28,
Interface=29, Long=30, Native=31, New=32, Package=33, Private=34, Protected=35,
Public=36, Return=37, Short=38, Static=39, Strictfp=40, Super=41, Switch=42,
Synchronized=43, This=44, Throw=45, Throws=46, Transient=47, Try=48, Void=49,
Volatile=50, While=51, Dot=52, IntegerLiteral=53, FloatingPointLiteral=54,
CharacterLiteral=55, StringLiteral=56, BooleanLiteral=57, NullLiteral=58,
ParenthesesLeft=59, ParenthesesRight=60, CurlyBracketLeft=61, CurlyBracketRight=62,
SquareBracketLeft=63, SquareBracketRight=64, Semicolon=65, Comma=66, UnsignedRightShiftAssign=67,
EqualTo=68, NotEqualTo=69, LessThanEqualTo=70, GreaterThanEqualTo=71,
ConditionalAND=72, ConditionalOR=73, Increment=74, Decrement=75, LeftShift=76,
SignedRightShift=77, UnsignedRightShift=78, AddAssign=79, SubtractAssign=80,
MultiplyAssign=81, DivideAssign=82, BitwiseANDAssign=83, BitwiseORAssign=84,
BitwiseXORAssign=85, RemainderAssign=86, LeftShiftAssign=87, SignedRightShiftAssign=88,
Assignment=89, BitwiseComplement=90, LessThan=91, GreaterThan=92, LogicalComplement=93,
Question=94, Colon=95, Addition=96, Subtraction=97, Multiplication=98,
Division=99, BitwiseAND=100, BitwiseOR=101, BitwiseXOR=102, Remainder=103,
IDENTIFIER=104;
public static String[] channelNames = {
"DEFAULT_TOKEN_CHANNEL", "HIDDEN"
};
public static String[] modeNames = {
"DEFAULT_MODE"
};
private static String[] makeRuleNames() {
return new String[] {
"LineTerminator", "WhiteSpace", "EndOfLineComment", "Comment", "TraditionalComment",
"CommentTail", "CommentTailStar", "NotStar", "NotStarNotSlash", "Abstract",
"Assert", "Boolean", "Break", "Byte", "Case", "Catch", "Char", "Class",
"Const", "Continue", "Default", "Do", "Double", "Else", "Extends", "Final",
"Finally", "Float", "For", "Goto", "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", "Dot", "IntegerLiteral", "DecimalIntegerLiteral",
"HexIntegerLiteral", "OctalIntegerLiteral", "IntegerTypeSuffix", "DecimalNumeral",
"HexNumeral", "HexDigits", "HexDigit", "FloatingPointLiteral", "ExponentPart",
"ExponentIndicator", "SignedInteger", "Digits", "Digit", "NonZeroDigit",
"Sign", "FloatTypeSuffix", "CharacterLiteral", "SingleCharacter", "StringLiteral",
"StringCharacters", "StringCharacter", "EscapeSequence", "OctalEscape",
"OctalNumeral", "OctalDigits", "OctalDigit", "ZeroToThree", "BooleanLiteral",
"NullLiteral", "ParenthesesLeft", "ParenthesesRight", "CurlyBracketLeft",
"CurlyBracketRight", "SquareBracketLeft", "SquareBracketRight", "Semicolon",
"Comma", "UnsignedRightShiftAssign", "EqualTo", "NotEqualTo", "LessThanEqualTo",
"GreaterThanEqualTo", "ConditionalAND", "ConditionalOR", "Increment",
"Decrement", "LeftShift", "SignedRightShift", "UnsignedRightShift", "AddAssign",
"SubtractAssign", "MultiplyAssign", "DivideAssign", "BitwiseANDAssign",
"BitwiseORAssign", "BitwiseXORAssign", "RemainderAssign", "LeftShiftAssign",
"SignedRightShiftAssign", "Assignment", "BitwiseComplement", "LessThan",
"GreaterThan", "LogicalComplement", "Question", "Colon", "Addition",
"Subtraction", "Multiplication", "Division", "BitwiseAND", "BitwiseOR",
"BitwiseXOR", "Remainder", "IDENTIFIER", "JavaLetter", "JavaLetterOrDigit"
};
}
public static final String[] ruleNames = makeRuleNames();
private static String[] makeLiteralNames() {
return new String[] {
null, null, null, "'abstract'", "'assert'", "'boolean'", "'break'", "'byte'",
"'case'", "'catch'", "'char'", "'class'", "'const'", "'continue'", "'default'",
"'do'", "'double'", "'else'", "'extends'", "'final'", "'finally'", "'float'",
"'for'", "'goto'", "'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'", "'('", "')'", "'{'", "'}'", "'['",
"']'", "';'", "','", "'>>>='", "'=='", "'!='", "'<='", "'>='", "'&&'",
"'||'", "'++'", "'--'", "'<<'", "'>>'", "'>>>'", "'+='", "'-='", "'*='",
"'/='", "'&='", "'|='", "'^='", "'%='", "'<<='", "'>>='", "'='", "'~'",
"'<'", "'>'", "'!'", "'?'", "':'", "'+'", "'-'", "'*'", "'/'", "'&'",
"'|'", "'^'", "'%'"
};
}
private static final String[] _LITERAL_NAMES = makeLiteralNames();
private static String[] makeSymbolicNames() {
return new String[] {
null, "WhiteSpace", "Comment", "Abstract", "Assert", "Boolean", "Break",
"Byte", "Case", "Catch", "Char", "Class", "Const", "Continue", "Default",
"Do", "Double", "Else", "Extends", "Final", "Finally", "Float", "For",
"Goto", "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",
"Dot", "IntegerLiteral", "FloatingPointLiteral", "CharacterLiteral",
"StringLiteral", "BooleanLiteral", "NullLiteral", "ParenthesesLeft",
"ParenthesesRight", "CurlyBracketLeft", "CurlyBracketRight", "SquareBracketLeft",
"SquareBracketRight", "Semicolon", "Comma", "UnsignedRightShiftAssign",
"EqualTo", "NotEqualTo", "LessThanEqualTo", "GreaterThanEqualTo", "ConditionalAND",
"ConditionalOR", "Increment", "Decrement", "LeftShift", "SignedRightShift",
"UnsignedRightShift", "AddAssign", "SubtractAssign", "MultiplyAssign",
"DivideAssign", "BitwiseANDAssign", "BitwiseORAssign", "BitwiseXORAssign",
"RemainderAssign", "LeftShiftAssign", "SignedRightShiftAssign", "Assignment",
"BitwiseComplement", "LessThan", "GreaterThan", "LogicalComplement",
"Question", "Colon", "Addition", "Subtraction", "Multiplication", "Division",
"BitwiseAND", "BitwiseOR", "BitwiseXOR", "Remainder", "IDENTIFIER"
};
}
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] = "<INVALID>";
}
}
}
@Override
@Deprecated
public String[] getTokenNames() {
return tokenNames;
}
@Override
public Vocabulary getVocabulary() {
return VOCABULARY;
}
public ExprLexer(CharStream input) {
super(input);
_interp = new LexerATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache);
}
@Override
public String getGrammarFileName() { return "ExprLexer.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\u0000h\u03ef\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\u0002i\u0007i\u0002j\u0007j\u0002k\u0007k\u0002l\u0007"+
"l\u0002m\u0007m\u0002n\u0007n\u0002o\u0007o\u0002p\u0007p\u0002q\u0007"+
"q\u0002r\u0007r\u0002s\u0007s\u0002t\u0007t\u0002u\u0007u\u0002v\u0007"+
"v\u0002w\u0007w\u0002x\u0007x\u0002y\u0007y\u0002z\u0007z\u0002{\u0007"+
"{\u0002|\u0007|\u0002}\u0007}\u0002~\u0007~\u0002\u007f\u0007\u007f\u0002"+
"\u0080\u0007\u0080\u0002\u0081\u0007\u0081\u0002\u0082\u0007\u0082\u0002"+
"\u0083\u0007\u0083\u0002\u0084\u0007\u0084\u0002\u0085\u0007\u0085\u0002"+
"\u0086\u0007\u0086\u0002\u0087\u0007\u0087\u0002\u0088\u0007\u0088\u0002"+
"\u0089\u0007\u0089\u0001\u0000\u0001\u0000\u0003\u0000\u0118\b\u0000\u0001"+
"\u0000\u0003\u0000\u011b\b\u0000\u0001\u0001\u0001\u0001\u0003\u0001\u011f"+
"\b\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0001\u0002\u0001\u0002\u0001"+
"\u0002\u0005\u0002\u0127\b\u0002\n\u0002\f\u0002\u012a\t\u0002\u0001\u0002"+
"\u0003\u0002\u012d\b\u0002\u0001\u0003\u0001\u0003\u0003\u0003\u0131\b"+
"\u0003\u0001\u0003\u0001\u0003\u0001\u0004\u0001\u0004\u0001\u0004\u0001"+
"\u0004\u0001\u0004\u0001\u0004\u0001\u0005\u0001\u0005\u0001\u0005\u0003"+
"\u0005\u013e\b\u0005\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+
"\u0006\u0001\u0006\u0003\u0006\u0146\b\u0006\u0001\u0007\u0001\u0007\u0003"+
"\u0007\u014a\b\u0007\u0001\b\u0001\b\u0003\b\u014e\b\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\u000b\u0001\u000b\u0001"+
"\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\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\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f"+
"\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\u0012\u0001\u0012\u0001\u0013"+
"\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013"+
"\u0001\u0013\u0001\u0013\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014"+
"\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0015\u0001\u0015"+
"\u0001\u0015\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016"+
"\u0001\u0016\u0001\u0016\u0001\u0017\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\u0019\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\u001a\u0001\u001b"+
"\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001c"+
"\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001d\u0001\u001d\u0001\u001d"+
"\u0001\u001d\u0001\u001d\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 \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.\u0001/\u0001/\u0001"+
"/\u0001/\u0001/\u0001/\u00010\u00010\u00010\u00010\u00010\u00010\u0001"+
"0\u00011\u00011\u00011\u00011\u00011\u00011\u00011\u00011\u00011\u0001"+
"1\u00011\u00011\u00011\u00012\u00012\u00012\u00012\u00012\u00013\u0001"+
"3\u00013\u00013\u00013\u00013\u00014\u00014\u00014\u00014\u00014\u0001"+
"4\u00014\u00015\u00015\u00015\u00015\u00015\u00015\u00015\u00015\u0001"+
"5\u00015\u00016\u00016\u00016\u00016\u00017\u00017\u00017\u00017\u0001"+
"7\u00018\u00018\u00018\u00018\u00018\u00018\u00018\u00018\u00018\u0001"+
"9\u00019\u00019\u00019\u00019\u00019\u0001:\u0001:\u0001;\u0001;\u0001"+
";\u0003;\u02a3\b;\u0001<\u0001<\u0003<\u02a7\b<\u0001=\u0001=\u0003=\u02ab"+
"\b=\u0001>\u0001>\u0003>\u02af\b>\u0001?\u0001?\u0001@\u0001@\u0001@\u0003"+
"@\u02b6\b@\u0003@\u02b8\b@\u0001A\u0001A\u0001A\u0001A\u0001A\u0001A\u0003"+
"A\u02c0\bA\u0001B\u0001B\u0001B\u0001B\u0003B\u02c6\bB\u0001C\u0001C\u0001"+
"D\u0001D\u0001D\u0003D\u02cd\bD\u0001D\u0003D\u02d0\bD\u0001D\u0003D\u02d3"+
"\bD\u0001D\u0001D\u0001D\u0003D\u02d8\bD\u0001D\u0003D\u02db\bD\u0001"+
"D\u0001D\u0001D\u0003D\u02e0\bD\u0001D\u0001D\u0003D\u02e4\bD\u0001D\u0001"+
"D\u0003D\u02e8\bD\u0001E\u0001E\u0001E\u0001F\u0001F\u0001G\u0003G\u02f0"+
"\bG\u0001G\u0001G\u0001H\u0004H\u02f5\bH\u000bH\fH\u02f6\u0001I\u0001"+
"I\u0003I\u02fb\bI\u0001J\u0001J\u0001K\u0001K\u0001L\u0001L\u0001M\u0001"+
"M\u0001M\u0001M\u0001M\u0001M\u0001M\u0001M\u0003M\u030b\bM\u0001N\u0001"+
"N\u0001O\u0001O\u0003O\u0311\bO\u0001O\u0001O\u0001P\u0004P\u0316\bP\u000b"+
"P\fP\u0317\u0001Q\u0001Q\u0003Q\u031c\bQ\u0001R\u0001R\u0001R\u0001R\u0001"+
"R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001"+
"R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001"+
"R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001"+
"R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0003R\u0348\bR\u0001"+
"S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001"+
"S\u0003S\u0355\bS\u0001T\u0001T\u0001T\u0001U\u0001U\u0001V\u0001V\u0001"+
"W\u0001W\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001"+
"X\u0003X\u0369\bX\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Z\u0001Z\u0001"+
"[\u0001[\u0001\\\u0001\\\u0001]\u0001]\u0001^\u0001^\u0001_\u0001_\u0001"+
"`\u0001`\u0001a\u0001a\u0001b\u0001b\u0001b\u0001b\u0001b\u0001c\u0001"+
"c\u0001c\u0001d\u0001d\u0001d\u0001e\u0001e\u0001e\u0001f\u0001f\u0001"+
"f\u0001g\u0001g\u0001g\u0001h\u0001h\u0001h\u0001i\u0001i\u0001i\u0001"+
"j\u0001j\u0001j\u0001k\u0001k\u0001k\u0001l\u0001l\u0001l\u0001m\u0001"+
"m\u0001m\u0001m\u0001n\u0001n\u0001n\u0001o\u0001o\u0001o\u0001p\u0001"+
"p\u0001p\u0001q\u0001q\u0001q\u0001r\u0001r\u0001r\u0001s\u0001s\u0001"+
"s\u0001t\u0001t\u0001t\u0001u\u0001u\u0001u\u0001v\u0001v\u0001v\u0001"+
"v\u0001w\u0001w\u0001w\u0001w\u0001x\u0001x\u0001y\u0001y\u0001z\u0001"+
"z\u0001{\u0001{\u0001|\u0001|\u0001}\u0001}\u0001~\u0001~\u0001\u007f"+
"\u0001\u007f\u0001\u0080\u0001\u0080\u0001\u0081\u0001\u0081\u0001\u0082"+
"\u0001\u0082\u0001\u0083\u0001\u0083\u0001\u0084\u0001\u0084\u0001\u0085"+
"\u0001\u0085\u0001\u0086\u0001\u0086\u0001\u0087\u0001\u0087\u0005\u0087"+
"\u03e7\b\u0087\n\u0087\f\u0087\u03ea\t\u0087\u0001\u0088\u0001\u0088\u0001"+
"\u0089\u0001\u0089\u0000\u0000\u008a\u0001\u0000\u0003\u0001\u0005\u0000"+
"\u0007\u0002\t\u0000\u000b\u0000\r\u0000\u000f\u0000\u0011\u0000\u0013"+
"\u0003\u0015\u0004\u0017\u0005\u0019\u0006\u001b\u0007\u001d\b\u001f\t"+
"!\n#\u000b%\f\'\r)\u000e+\u000f-\u0010/\u00111\u00123\u00135\u00147\u0015"+
"9\u0016;\u0017=\u0018?\u0019A\u001aC\u001bE\u001cG\u001dI\u001eK\u001f"+
"M O!Q\"S#U$W%Y&[\'](_)a*c+e,g-i.k/m0o1q2s3u4w5y\u0000{\u0000}\u0000\u007f"+
"\u0000\u0081\u0000\u0083\u0000\u0085\u0000\u0087\u0000\u00896\u008b\u0000"+
"\u008d\u0000\u008f\u0000\u0091\u0000\u0093\u0000\u0095\u0000\u0097\u0000"+
"\u0099\u0000\u009b7\u009d\u0000\u009f8\u00a1\u0000\u00a3\u0000\u00a5\u0000"+
"\u00a7\u0000\u00a9\u0000\u00ab\u0000\u00ad\u0000\u00af\u0000\u00b19\u00b3"+
":\u00b5;\u00b7<\u00b9=\u00bb>\u00bd?\u00bf@\u00c1A\u00c3B\u00c5C\u00c7"+
"D\u00c9E\u00cbF\u00cdG\u00cfH\u00d1I\u00d3J\u00d5K\u00d7L\u00d9M\u00db"+
"N\u00ddO\u00dfP\u00e1Q\u00e3R\u00e5S\u00e7T\u00e9U\u00ebV\u00edW\u00ef"+
"X\u00f1Y\u00f3Z\u00f5[\u00f7\\\u00f9]\u00fb^\u00fd_\u00ff`\u0101a\u0103"+
"b\u0105c\u0107d\u0109e\u010bf\u010dg\u010fh\u0111\u0000\u0113\u0000\u0001"+
"\u0000\u000f\u0003\u0000\t\t\f\f \u0002\u0000\n\n\r\r\u0002\u0000**^"+
"^\u0003\u0000**//^^\u0002\u0000LLll\u0003\u000009AFaf\u0002\u0000EEee"+
"\u0001\u000019\u0002\u0000++--\u0004\u0000DDFFddff\u0003\u0000\'\'\\\\"+
"^^\u0001\u000007\u0001\u000003\u0004\u0000$$AZ__az\u0005\u0000$$09AZ_"+
"_az\u03fd\u0000\u0003\u0001\u0000\u0000\u0000\u0000\u0007\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\u00003\u0001\u0000\u0000\u0000\u0000"+
"5\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\u0000A\u0001\u0000\u0000\u0000\u0000"+
"C\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\u0000O\u0001\u0000\u0000\u0000\u0000"+
"Q\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\u0000k\u0001\u0000\u0000\u0000\u0000"+
"m\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\u0089\u0001\u0000\u0000\u0000"+
"\u0000\u009b\u0001\u0000\u0000\u0000\u0000\u009f\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\u00bd\u0001\u0000\u0000\u0000\u0000\u00bf\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\u0000\u00d3\u0001\u0000\u0000\u0000"+
"\u0000\u00d5\u0001\u0000\u0000\u0000\u0000\u00d7\u0001\u0000\u0000\u0000"+
"\u0000\u00d9\u0001\u0000\u0000\u0000\u0000\u00db\u0001\u0000\u0000\u0000"+
"\u0000\u00dd\u0001\u0000\u0000\u0000\u0000\u00df\u0001\u0000\u0000\u0000"+
"\u0000\u00e1\u0001\u0000\u0000\u0000\u0000\u00e3\u0001\u0000\u0000\u0000"+
"\u0000\u00e5\u0001\u0000\u0000\u0000\u0000\u00e7\u0001\u0000\u0000\u0000"+
"\u0000\u00e9\u0001\u0000\u0000\u0000\u0000\u00eb\u0001\u0000\u0000\u0000"+
"\u0000\u00ed\u0001\u0000\u0000\u0000\u0000\u00ef\u0001\u0000\u0000\u0000"+
"\u0000\u00f1\u0001\u0000\u0000\u0000\u0000\u00f3\u0001\u0000\u0000\u0000"+
"\u0000\u00f5\u0001\u0000\u0000\u0000\u0000\u00f7\u0001\u0000\u0000\u0000"+
"\u0000\u00f9\u0001\u0000\u0000\u0000\u0000\u00fb\u0001\u0000\u0000\u0000"+
"\u0000\u00fd\u0001\u0000\u0000\u0000\u0000\u00ff\u0001\u0000\u0000\u0000"+
"\u0000\u0101\u0001\u0000\u0000\u0000\u0000\u0103\u0001\u0000\u0000\u0000"+
"\u0000\u0105\u0001\u0000\u0000\u0000\u0000\u0107\u0001\u0000\u0000\u0000"+
"\u0000\u0109\u0001\u0000\u0000\u0000\u0000\u010b\u0001\u0000\u0000\u0000"+
"\u0000\u010d\u0001\u0000\u0000\u0000\u0000\u010f\u0001\u0000\u0000\u0000"+
"\u0001\u011a\u0001\u0000\u0000\u0000\u0003\u011e\u0001\u0000\u0000\u0000"+
"\u0005\u0122\u0001\u0000\u0000\u0000\u0007\u0130\u0001\u0000\u0000\u0000"+
"\t\u0134\u0001\u0000\u0000\u0000\u000b\u013d\u0001\u0000\u0000\u0000\r"+
"\u0145\u0001\u0000\u0000\u0000\u000f\u0149\u0001\u0000\u0000\u0000\u0011"+
"\u014d\u0001\u0000\u0000\u0000\u0013\u014f\u0001\u0000\u0000\u0000\u0015"+
"\u0158\u0001\u0000\u0000\u0000\u0017\u015f\u0001\u0000\u0000\u0000\u0019"+
"\u0167\u0001\u0000\u0000\u0000\u001b\u016d\u0001\u0000\u0000\u0000\u001d"+
"\u0172\u0001\u0000\u0000\u0000\u001f\u0177\u0001\u0000\u0000\u0000!\u017d"+
"\u0001\u0000\u0000\u0000#\u0182\u0001\u0000\u0000\u0000%\u0188\u0001\u0000"+
"\u0000\u0000\'\u018e\u0001\u0000\u0000\u0000)\u0197\u0001\u0000\u0000"+
"\u0000+\u019f\u0001\u0000\u0000\u0000-\u01a2\u0001\u0000\u0000\u0000/"+
"\u01a9\u0001\u0000\u0000\u00001\u01ae\u0001\u0000\u0000\u00003\u01b6\u0001"+
"\u0000\u0000\u00005\u01bc\u0001\u0000\u0000\u00007\u01c4\u0001\u0000\u0000"+
"\u00009\u01ca\u0001\u0000\u0000\u0000;\u01ce\u0001\u0000\u0000\u0000="+
"\u01d3\u0001\u0000\u0000\u0000?\u01d6\u0001\u0000\u0000\u0000A\u01e1\u0001"+
"\u0000\u0000\u0000C\u01e8\u0001\u0000\u0000\u0000E\u01f3\u0001\u0000\u0000"+
"\u0000G\u01f7\u0001\u0000\u0000\u0000I\u0201\u0001\u0000\u0000\u0000K"+
"\u0206\u0001\u0000\u0000\u0000M\u020d\u0001\u0000\u0000\u0000O\u0211\u0001"+
"\u0000\u0000\u0000Q\u0219\u0001\u0000\u0000\u0000S\u0221\u0001\u0000\u0000"+
"\u0000U\u022b\u0001\u0000\u0000\u0000W\u0232\u0001\u0000\u0000\u0000Y"+
"\u0239\u0001\u0000\u0000\u0000[\u023f\u0001\u0000\u0000\u0000]\u0246\u0001"+
"\u0000\u0000\u0000_\u024f\u0001\u0000\u0000\u0000a\u0255\u0001\u0000\u0000"+
"\u0000c\u025c\u0001\u0000\u0000\u0000e\u0269\u0001\u0000\u0000\u0000g"+
"\u026e\u0001\u0000\u0000\u0000i\u0274\u0001\u0000\u0000\u0000k\u027b\u0001"+
"\u0000\u0000\u0000m\u0285\u0001\u0000\u0000\u0000o\u0289\u0001\u0000\u0000"+
"\u0000q\u028e\u0001\u0000\u0000\u0000s\u0297\u0001\u0000\u0000\u0000u"+
"\u029d\u0001\u0000\u0000\u0000w\u02a2\u0001\u0000\u0000\u0000y\u02a4\u0001"+
"\u0000\u0000\u0000{\u02a8\u0001\u0000\u0000\u0000}\u02ac\u0001\u0000\u0000"+
"\u0000\u007f\u02b0\u0001\u0000\u0000\u0000\u0081\u02b7\u0001\u0000\u0000"+
"\u0000\u0083\u02bf\u0001\u0000\u0000\u0000\u0085\u02c5\u0001\u0000\u0000"+
"\u0000\u0087\u02c7\u0001\u0000\u0000\u0000\u0089\u02e7\u0001\u0000\u0000"+
"\u0000\u008b\u02e9\u0001\u0000\u0000\u0000\u008d\u02ec\u0001\u0000\u0000"+
"\u0000\u008f\u02ef\u0001\u0000\u0000\u0000\u0091\u02f4\u0001\u0000\u0000"+
"\u0000\u0093\u02fa\u0001\u0000\u0000\u0000\u0095\u02fc\u0001\u0000\u0000"+
"\u0000\u0097\u02fe\u0001\u0000\u0000\u0000\u0099\u0300\u0001\u0000\u0000"+
"\u0000\u009b\u030a\u0001\u0000\u0000\u0000\u009d\u030c\u0001\u0000\u0000"+
"\u0000\u009f\u030e\u0001\u0000\u0000\u0000\u00a1\u0315\u0001\u0000\u0000"+
"\u0000\u00a3\u031b\u0001\u0000\u0000\u0000\u00a5\u031d\u0001\u0000\u0000"+
"\u0000\u00a7\u0354\u0001\u0000\u0000\u0000\u00a9\u0356\u0001\u0000\u0000"+
"\u0000\u00ab\u0359\u0001\u0000\u0000\u0000\u00ad\u035b\u0001\u0000\u0000"+
"\u0000\u00af\u035d\u0001\u0000\u0000\u0000\u00b1\u0368\u0001\u0000\u0000"+
"\u0000\u00b3\u036a\u0001\u0000\u0000\u0000\u00b5\u036f\u0001\u0000\u0000"+
"\u0000\u00b7\u0371\u0001\u0000\u0000\u0000\u00b9\u0373\u0001\u0000\u0000"+
"\u0000\u00bb\u0375\u0001\u0000\u0000\u0000\u00bd\u0377\u0001\u0000\u0000"+
"\u0000\u00bf\u0379\u0001\u0000\u0000\u0000\u00c1\u037b\u0001\u0000\u0000"+
"\u0000\u00c3\u037d\u0001\u0000\u0000\u0000\u00c5\u037f\u0001\u0000\u0000"+
"\u0000\u00c7\u0384\u0001\u0000\u0000\u0000\u00c9\u0387\u0001\u0000\u0000"+
"\u0000\u00cb\u038a\u0001\u0000\u0000\u0000\u00cd\u038d\u0001\u0000\u0000"+
"\u0000\u00cf\u0390\u0001\u0000\u0000\u0000\u00d1\u0393\u0001\u0000\u0000"+
"\u0000\u00d3\u0396\u0001\u0000\u0000\u0000\u00d5\u0399\u0001\u0000\u0000"+
"\u0000\u00d7\u039c\u0001\u0000\u0000\u0000\u00d9\u039f\u0001\u0000\u0000"+
"\u0000\u00db\u03a2\u0001\u0000\u0000\u0000\u00dd\u03a6\u0001\u0000\u0000"+
"\u0000\u00df\u03a9\u0001\u0000\u0000\u0000\u00e1\u03ac\u0001\u0000\u0000"+
"\u0000\u00e3\u03af\u0001\u0000\u0000\u0000\u00e5\u03b2\u0001\u0000\u0000"+
"\u0000\u00e7\u03b5\u0001\u0000\u0000\u0000\u00e9\u03b8\u0001\u0000\u0000"+
"\u0000\u00eb\u03bb\u0001\u0000\u0000\u0000\u00ed\u03be\u0001\u0000\u0000"+
"\u0000\u00ef\u03c2\u0001\u0000\u0000\u0000\u00f1\u03c6\u0001\u0000\u0000"+
"\u0000\u00f3\u03c8\u0001\u0000\u0000\u0000\u00f5\u03ca\u0001\u0000\u0000"+
"\u0000\u00f7\u03cc\u0001\u0000\u0000\u0000\u00f9\u03ce\u0001\u0000\u0000"+
"\u0000\u00fb\u03d0\u0001\u0000\u0000\u0000\u00fd\u03d2\u0001\u0000\u0000"+
"\u0000\u00ff\u03d4\u0001\u0000\u0000\u0000\u0101\u03d6\u0001\u0000\u0000"+
"\u0000\u0103\u03d8\u0001\u0000\u0000\u0000\u0105\u03da\u0001\u0000\u0000"+
"\u0000\u0107\u03dc\u0001\u0000\u0000\u0000\u0109\u03de\u0001\u0000\u0000"+
"\u0000\u010b\u03e0\u0001\u0000\u0000\u0000\u010d\u03e2\u0001\u0000\u0000"+
"\u0000\u010f\u03e4\u0001\u0000\u0000\u0000\u0111\u03eb\u0001\u0000\u0000"+
"\u0000\u0113\u03ed\u0001\u0000\u0000\u0000\u0115\u0117\u0005\r\u0000\u0000"+
"\u0116\u0118\u0005\n\u0000\u0000\u0117\u0116\u0001\u0000\u0000\u0000\u0117"+
"\u0118\u0001\u0000\u0000\u0000\u0118\u011b\u0001\u0000\u0000\u0000\u0119"+
"\u011b\u0005\n\u0000\u0000\u011a\u0115\u0001\u0000\u0000\u0000\u011a\u0119"+
"\u0001\u0000\u0000\u0000\u011b\u0002\u0001\u0000\u0000\u0000\u011c\u011f"+
"\u0007\u0000\u0000\u0000\u011d\u011f\u0003\u0001\u0000\u0000\u011e\u011c"+
"\u0001\u0000\u0000\u0000\u011e\u011d\u0001\u0000\u0000\u0000\u011f\u0120"+
"\u0001\u0000\u0000\u0000\u0120\u0121\u0006\u0001\u0000\u0000\u0121\u0004"+
"\u0001\u0000\u0000\u0000\u0122\u0123\u0005/\u0000\u0000\u0123\u0124\u0005"+
"/\u0000\u0000\u0124\u0128\u0001\u0000\u0000\u0000\u0125\u0127\b\u0001"+
"\u0000\u0000\u0126\u0125\u0001\u0000\u0000\u0000\u0127\u012a\u0001\u0000"+
"\u0000\u0000\u0128\u0126\u0001\u0000\u0000\u0000\u0128\u0129\u0001\u0000"+
"\u0000\u0000\u0129\u012c\u0001\u0000\u0000\u0000\u012a\u0128\u0001\u0000"+
"\u0000\u0000\u012b\u012d\u0003\u0001\u0000\u0000\u012c\u012b\u0001\u0000"+
"\u0000\u0000\u012c\u012d\u0001\u0000\u0000\u0000\u012d\u0006\u0001\u0000"+
"\u0000\u0000\u012e\u0131\u0003\t\u0004\u0000\u012f\u0131\u0003\u0005\u0002"+
"\u0000\u0130\u012e\u0001\u0000\u0000\u0000\u0130\u012f\u0001\u0000\u0000"+
"\u0000\u0131\u0132\u0001\u0000\u0000\u0000\u0132\u0133\u0006\u0003\u0000"+
"\u0000\u0133\b\u0001\u0000\u0000\u0000\u0134\u0135\u0005/\u0000\u0000"+
"\u0135\u0136\u0005*\u0000\u0000\u0136\u0137\u0001\u0000\u0000\u0000\u0137"+
"\u0138\u0003\u000f\u0007\u0000\u0138\u0139\u0003\u000b\u0005\u0000\u0139"+
"\n\u0001\u0000\u0000\u0000\u013a\u013b\u0005*\u0000\u0000\u013b\u013e"+
"\u0003\r\u0006\u0000\u013c\u013e\u0003\u000f\u0007\u0000\u013d\u013a\u0001"+
"\u0000\u0000\u0000\u013d\u013c\u0001\u0000\u0000\u0000\u013e\f\u0001\u0000"+
"\u0000\u0000\u013f\u0146\u0005/\u0000\u0000\u0140\u0141\u0005*\u0000\u0000"+
"\u0141\u0146\u0003\r\u0006\u0000\u0142\u0143\u0003\u0011\b\u0000\u0143"+
"\u0144\u0003\u000b\u0005\u0000\u0144\u0146\u0001\u0000\u0000\u0000\u0145"+
"\u013f\u0001\u0000\u0000\u0000\u0145\u0140\u0001\u0000\u0000\u0000\u0145"+
"\u0142\u0001\u0000\u0000\u0000\u0146\u000e\u0001\u0000\u0000\u0000\u0147"+
"\u014a\u0007\u0002\u0000\u0000\u0148\u014a\u0003\u0001\u0000\u0000\u0149"+
"\u0147\u0001\u0000\u0000\u0000\u0149\u0148\u0001\u0000\u0000\u0000\u014a"+
"\u0010\u0001\u0000\u0000\u0000\u014b\u014e\u0007\u0003\u0000\u0000\u014c"+
"\u014e\u0003\u0001\u0000\u0000\u014d\u014b\u0001\u0000\u0000\u0000\u014d"+
"\u014c\u0001\u0000\u0000\u0000\u014e\u0012\u0001\u0000\u0000\u0000\u014f"+
"\u0150\u0005a\u0000\u0000\u0150\u0151\u0005b\u0000\u0000\u0151\u0152\u0005"+
"s\u0000\u0000\u0152\u0153\u0005t\u0000\u0000\u0153\u0154\u0005r\u0000"+
"\u0000\u0154\u0155\u0005a\u0000\u0000\u0155\u0156\u0005c\u0000\u0000\u0156"+
"\u0157\u0005t\u0000\u0000\u0157\u0014\u0001\u0000\u0000\u0000\u0158\u0159"+
"\u0005a\u0000\u0000\u0159\u015a\u0005s\u0000\u0000\u015a\u015b\u0005s"+
"\u0000\u0000\u015b\u015c\u0005e\u0000\u0000\u015c\u015d\u0005r\u0000\u0000"+
"\u015d\u015e\u0005t\u0000\u0000\u015e\u0016\u0001\u0000\u0000\u0000\u015f"+
"\u0160\u0005b\u0000\u0000\u0160\u0161\u0005o\u0000\u0000\u0161\u0162\u0005"+
"o\u0000\u0000\u0162\u0163\u0005l\u0000\u0000\u0163\u0164\u0005e\u0000"+
"\u0000\u0164\u0165\u0005a\u0000\u0000\u0165\u0166\u0005n\u0000\u0000\u0166"+
"\u0018\u0001\u0000\u0000\u0000\u0167\u0168\u0005b\u0000\u0000\u0168\u0169"+
"\u0005r\u0000\u0000\u0169\u016a\u0005e\u0000\u0000\u016a\u016b\u0005a"+
"\u0000\u0000\u016b\u016c\u0005k\u0000\u0000\u016c\u001a\u0001\u0000\u0000"+
"\u0000\u016d\u016e\u0005b\u0000\u0000\u016e\u016f\u0005y\u0000\u0000\u016f"+
"\u0170\u0005t\u0000\u0000\u0170\u0171\u0005e\u0000\u0000\u0171\u001c\u0001"+
"\u0000\u0000\u0000\u0172\u0173\u0005c\u0000\u0000\u0173\u0174\u0005a\u0000"+
"\u0000\u0174\u0175\u0005s\u0000\u0000\u0175\u0176\u0005e\u0000\u0000\u0176"+
"\u001e\u0001\u0000\u0000\u0000\u0177\u0178\u0005c\u0000\u0000\u0178\u0179"+
"\u0005a\u0000\u0000\u0179\u017a\u0005t\u0000\u0000\u017a\u017b\u0005c"+
"\u0000\u0000\u017b\u017c\u0005h\u0000\u0000\u017c \u0001\u0000\u0000\u0000"+
"\u017d\u017e\u0005c\u0000\u0000\u017e\u017f\u0005h\u0000\u0000\u017f\u0180"+
"\u0005a\u0000\u0000\u0180\u0181\u0005r\u0000\u0000\u0181\"\u0001\u0000"+
"\u0000\u0000\u0182\u0183\u0005c\u0000\u0000\u0183\u0184\u0005l\u0000\u0000"+
"\u0184\u0185\u0005a\u0000\u0000\u0185\u0186\u0005s\u0000\u0000\u0186\u0187"+
"\u0005s\u0000\u0000\u0187$\u0001\u0000\u0000\u0000\u0188\u0189\u0005c"+
"\u0000\u0000\u0189\u018a\u0005o\u0000\u0000\u018a\u018b\u0005n\u0000\u0000"+
"\u018b\u018c\u0005s\u0000\u0000\u018c\u018d\u0005t\u0000\u0000\u018d&"+
"\u0001\u0000\u0000\u0000\u018e\u018f\u0005c\u0000\u0000\u018f\u0190\u0005"+
"o\u0000\u0000\u0190\u0191\u0005n\u0000\u0000\u0191\u0192\u0005t\u0000"+
"\u0000\u0192\u0193\u0005i\u0000\u0000\u0193\u0194\u0005n\u0000\u0000\u0194"+
"\u0195\u0005u\u0000\u0000\u0195\u0196\u0005e\u0000\u0000\u0196(\u0001"+
"\u0000\u0000\u0000\u0197\u0198\u0005d\u0000\u0000\u0198\u0199\u0005e\u0000"+
"\u0000\u0199\u019a\u0005f\u0000\u0000\u019a\u019b\u0005a\u0000\u0000\u019b"+
"\u019c\u0005u\u0000\u0000\u019c\u019d\u0005l\u0000\u0000\u019d\u019e\u0005"+
"t\u0000\u0000\u019e*\u0001\u0000\u0000\u0000\u019f\u01a0\u0005d\u0000"+
"\u0000\u01a0\u01a1\u0005o\u0000\u0000\u01a1,\u0001\u0000\u0000\u0000\u01a2"+
"\u01a3\u0005d\u0000\u0000\u01a3\u01a4\u0005o\u0000\u0000\u01a4\u01a5\u0005"+
"u\u0000\u0000\u01a5\u01a6\u0005b\u0000\u0000\u01a6\u01a7\u0005l\u0000"+
"\u0000\u01a7\u01a8\u0005e\u0000\u0000\u01a8.\u0001\u0000\u0000\u0000\u01a9"+
"\u01aa\u0005e\u0000\u0000\u01aa\u01ab\u0005l\u0000\u0000\u01ab\u01ac\u0005"+
"s\u0000\u0000\u01ac\u01ad\u0005e\u0000\u0000\u01ad0\u0001\u0000\u0000"+
"\u0000\u01ae\u01af\u0005e\u0000\u0000\u01af\u01b0\u0005x\u0000\u0000\u01b0"+
"\u01b1\u0005t\u0000\u0000\u01b1\u01b2\u0005e\u0000\u0000\u01b2\u01b3\u0005"+
"n\u0000\u0000\u01b3\u01b4\u0005d\u0000\u0000\u01b4\u01b5\u0005s\u0000"+
"\u0000\u01b52\u0001\u0000\u0000\u0000\u01b6\u01b7\u0005f\u0000\u0000\u01b7"+
"\u01b8\u0005i\u0000\u0000\u01b8\u01b9\u0005n\u0000\u0000\u01b9\u01ba\u0005"+
"a\u0000\u0000\u01ba\u01bb\u0005l\u0000\u0000\u01bb4\u0001\u0000\u0000"+
"\u0000\u01bc\u01bd\u0005f\u0000\u0000\u01bd\u01be\u0005i\u0000\u0000\u01be"+
"\u01bf\u0005n\u0000\u0000\u01bf\u01c0\u0005a\u0000\u0000\u01c0\u01c1\u0005"+
"l\u0000\u0000\u01c1\u01c2\u0005l\u0000\u0000\u01c2\u01c3\u0005y\u0000"+
"\u0000\u01c36\u0001\u0000\u0000\u0000\u01c4\u01c5\u0005f\u0000\u0000\u01c5"+
"\u01c6\u0005l\u0000\u0000\u01c6\u01c7\u0005o\u0000\u0000\u01c7\u01c8\u0005"+
"a\u0000\u0000\u01c8\u01c9\u0005t\u0000\u0000\u01c98\u0001\u0000\u0000"+
"\u0000\u01ca\u01cb\u0005f\u0000\u0000\u01cb\u01cc\u0005o\u0000\u0000\u01cc"+
"\u01cd\u0005r\u0000\u0000\u01cd:\u0001\u0000\u0000\u0000\u01ce\u01cf\u0005"+
"g\u0000\u0000\u01cf\u01d0\u0005o\u0000\u0000\u01d0\u01d1\u0005t\u0000"+
"\u0000\u01d1\u01d2\u0005o\u0000\u0000\u01d2<\u0001\u0000\u0000\u0000\u01d3"+
"\u01d4\u0005i\u0000\u0000\u01d4\u01d5\u0005f\u0000\u0000\u01d5>\u0001"+
"\u0000\u0000\u0000\u01d6\u01d7\u0005i\u0000\u0000\u01d7\u01d8\u0005m\u0000"+
"\u0000\u01d8\u01d9\u0005p\u0000\u0000\u01d9\u01da\u0005l\u0000\u0000\u01da"+
"\u01db\u0005e\u0000\u0000\u01db\u01dc\u0005m\u0000\u0000\u01dc\u01dd\u0005"+
"e\u0000\u0000\u01dd\u01de\u0005n\u0000\u0000\u01de\u01df\u0005t\u0000"+
"\u0000\u01df\u01e0\u0005s\u0000\u0000\u01e0@\u0001\u0000\u0000\u0000\u01e1"+
"\u01e2\u0005i\u0000\u0000\u01e2\u01e3\u0005m\u0000\u0000\u01e3\u01e4\u0005"+
"p\u0000\u0000\u01e4\u01e5\u0005o\u0000\u0000\u01e5\u01e6\u0005r\u0000"+
"\u0000\u01e6\u01e7\u0005t\u0000\u0000\u01e7B\u0001\u0000\u0000\u0000\u01e8"+
"\u01e9\u0005i\u0000\u0000\u01e9\u01ea\u0005n\u0000\u0000\u01ea\u01eb\u0005"+
"s\u0000\u0000\u01eb\u01ec\u0005t\u0000\u0000\u01ec\u01ed\u0005a\u0000"+
"\u0000\u01ed\u01ee\u0005n\u0000\u0000\u01ee\u01ef\u0005c\u0000\u0000\u01ef"+
"\u01f0\u0005e\u0000\u0000\u01f0\u01f1\u0005o\u0000\u0000\u01f1\u01f2\u0005"+
"f\u0000\u0000\u01f2D\u0001\u0000\u0000\u0000\u01f3\u01f4\u0005i\u0000"+
"\u0000\u01f4\u01f5\u0005n\u0000\u0000\u01f5\u01f6\u0005t\u0000\u0000\u01f6"+
"F\u0001\u0000\u0000\u0000\u01f7\u01f8\u0005i\u0000\u0000\u01f8\u01f9\u0005"+
"n\u0000\u0000\u01f9\u01fa\u0005t\u0000\u0000\u01fa\u01fb\u0005e\u0000"+
"\u0000\u01fb\u01fc\u0005r\u0000\u0000\u01fc\u01fd\u0005f\u0000\u0000\u01fd"+
"\u01fe\u0005a\u0000\u0000\u01fe\u01ff\u0005c\u0000\u0000\u01ff\u0200\u0005"+
"e\u0000\u0000\u0200H\u0001\u0000\u0000\u0000\u0201\u0202\u0005l\u0000"+
"\u0000\u0202\u0203\u0005o\u0000\u0000\u0203\u0204\u0005n\u0000\u0000\u0204"+
"\u0205\u0005g\u0000\u0000\u0205J\u0001\u0000\u0000\u0000\u0206\u0207\u0005"+
"n\u0000\u0000\u0207\u0208\u0005a\u0000\u0000\u0208\u0209\u0005t\u0000"+
"\u0000\u0209\u020a\u0005i\u0000\u0000\u020a\u020b\u0005v\u0000\u0000\u020b"+
"\u020c\u0005e\u0000\u0000\u020cL\u0001\u0000\u0000\u0000\u020d\u020e\u0005"+
"n\u0000\u0000\u020e\u020f\u0005e\u0000\u0000\u020f\u0210\u0005w\u0000"+
"\u0000\u0210N\u0001\u0000\u0000\u0000\u0211\u0212\u0005p\u0000\u0000\u0212"+
"\u0213\u0005a\u0000\u0000\u0213\u0214\u0005c\u0000\u0000\u0214\u0215\u0005"+
"k\u0000\u0000\u0215\u0216\u0005a\u0000\u0000\u0216\u0217\u0005g\u0000"+
"\u0000\u0217\u0218\u0005e\u0000\u0000\u0218P\u0001\u0000\u0000\u0000\u0219"+
"\u021a\u0005p\u0000\u0000\u021a\u021b\u0005r\u0000\u0000\u021b\u021c\u0005"+
"i\u0000\u0000\u021c\u021d\u0005v\u0000\u0000\u021d\u021e\u0005a\u0000"+
"\u0000\u021e\u021f\u0005t\u0000\u0000\u021f\u0220\u0005e\u0000\u0000\u0220"+
"R\u0001\u0000\u0000\u0000\u0221\u0222\u0005p\u0000\u0000\u0222\u0223\u0005"+
"r\u0000\u0000\u0223\u0224\u0005o\u0000\u0000\u0224\u0225\u0005t\u0000"+
"\u0000\u0225\u0226\u0005e\u0000\u0000\u0226\u0227\u0005c\u0000\u0000\u0227"+
"\u0228\u0005t\u0000\u0000\u0228\u0229\u0005e\u0000\u0000\u0229\u022a\u0005"+
"d\u0000\u0000\u022aT\u0001\u0000\u0000\u0000\u022b\u022c\u0005p\u0000"+
"\u0000\u022c\u022d\u0005u\u0000\u0000\u022d\u022e\u0005b\u0000\u0000\u022e"+
"\u022f\u0005l\u0000\u0000\u022f\u0230\u0005i\u0000\u0000\u0230\u0231\u0005"+
"c\u0000\u0000\u0231V\u0001\u0000\u0000\u0000\u0232\u0233\u0005r\u0000"+
"\u0000\u0233\u0234\u0005e\u0000\u0000\u0234\u0235\u0005t\u0000\u0000\u0235"+
"\u0236\u0005u\u0000\u0000\u0236\u0237\u0005r\u0000\u0000\u0237\u0238\u0005"+
"n\u0000\u0000\u0238X\u0001\u0000\u0000\u0000\u0239\u023a\u0005s\u0000"+
"\u0000\u023a\u023b\u0005h\u0000\u0000\u023b\u023c\u0005o\u0000\u0000\u023c"+
"\u023d\u0005r\u0000\u0000\u023d\u023e\u0005t\u0000\u0000\u023eZ\u0001"+
"\u0000\u0000\u0000\u023f\u0240\u0005s\u0000\u0000\u0240\u0241\u0005t\u0000"+
"\u0000\u0241\u0242\u0005a\u0000\u0000\u0242\u0243\u0005t\u0000\u0000\u0243"+
"\u0244\u0005i\u0000\u0000\u0244\u0245\u0005c\u0000\u0000\u0245\\\u0001"+
"\u0000\u0000\u0000\u0246\u0247\u0005s\u0000\u0000\u0247\u0248\u0005t\u0000"+
"\u0000\u0248\u0249\u0005r\u0000\u0000\u0249\u024a\u0005i\u0000\u0000\u024a"+
"\u024b\u0005c\u0000\u0000\u024b\u024c\u0005t\u0000\u0000\u024c\u024d\u0005"+
"f\u0000\u0000\u024d\u024e\u0005p\u0000\u0000\u024e^\u0001\u0000\u0000"+
"\u0000\u024f\u0250\u0005s\u0000\u0000\u0250\u0251\u0005u\u0000\u0000\u0251"+
"\u0252\u0005p\u0000\u0000\u0252\u0253\u0005e\u0000\u0000\u0253\u0254\u0005"+
"r\u0000\u0000\u0254`\u0001\u0000\u0000\u0000\u0255\u0256\u0005s\u0000"+
"\u0000\u0256\u0257\u0005w\u0000\u0000\u0257\u0258\u0005i\u0000\u0000\u0258"+
"\u0259\u0005t\u0000\u0000\u0259\u025a\u0005c\u0000\u0000\u025a\u025b\u0005"+
"h\u0000\u0000\u025bb\u0001\u0000\u0000\u0000\u025c\u025d\u0005s\u0000"+
"\u0000\u025d\u025e\u0005y\u0000\u0000\u025e\u025f\u0005n\u0000\u0000\u025f"+
"\u0260\u0005c\u0000\u0000\u0260\u0261\u0005h\u0000\u0000\u0261\u0262\u0005"+
"r\u0000\u0000\u0262\u0263\u0005o\u0000\u0000\u0263\u0264\u0005n\u0000"+
"\u0000\u0264\u0265\u0005i\u0000\u0000\u0265\u0266\u0005z\u0000\u0000\u0266"+
"\u0267\u0005e\u0000\u0000\u0267\u0268\u0005d\u0000\u0000\u0268d\u0001"+
"\u0000\u0000\u0000\u0269\u026a\u0005t\u0000\u0000\u026a\u026b\u0005h\u0000"+
"\u0000\u026b\u026c\u0005i\u0000\u0000\u026c\u026d\u0005s\u0000\u0000\u026d"+
"f\u0001\u0000\u0000\u0000\u026e\u026f\u0005t\u0000\u0000\u026f\u0270\u0005"+
"h\u0000\u0000\u0270\u0271\u0005r\u0000\u0000\u0271\u0272\u0005o\u0000"+
"\u0000\u0272\u0273\u0005w\u0000\u0000\u0273h\u0001\u0000\u0000\u0000\u0274"+
"\u0275\u0005t\u0000\u0000\u0275\u0276\u0005h\u0000\u0000\u0276\u0277\u0005"+
"r\u0000\u0000\u0277\u0278\u0005o\u0000\u0000\u0278\u0279\u0005w\u0000"+
"\u0000\u0279\u027a\u0005s\u0000\u0000\u027aj\u0001\u0000\u0000\u0000\u027b"+
"\u027c\u0005t\u0000\u0000\u027c\u027d\u0005r\u0000\u0000\u027d\u027e\u0005"+
"a\u0000\u0000\u027e\u027f\u0005n\u0000\u0000\u027f\u0280\u0005s\u0000"+
"\u0000\u0280\u0281\u0005i\u0000\u0000\u0281\u0282\u0005e\u0000\u0000\u0282"+
"\u0283\u0005n\u0000\u0000\u0283\u0284\u0005t\u0000\u0000\u0284l\u0001"+
"\u0000\u0000\u0000\u0285\u0286\u0005t\u0000\u0000\u0286\u0287\u0005r\u0000"+
"\u0000\u0287\u0288\u0005y\u0000\u0000\u0288n\u0001\u0000\u0000\u0000\u0289"+
"\u028a\u0005v\u0000\u0000\u028a\u028b\u0005o\u0000\u0000\u028b\u028c\u0005"+
"i\u0000\u0000\u028c\u028d\u0005d\u0000\u0000\u028dp\u0001\u0000\u0000"+
"\u0000\u028e\u028f\u0005v\u0000\u0000\u028f\u0290\u0005o\u0000\u0000\u0290"+
"\u0291\u0005l\u0000\u0000\u0291\u0292\u0005a\u0000\u0000\u0292\u0293\u0005"+
"t\u0000\u0000\u0293\u0294\u0005i\u0000\u0000\u0294\u0295\u0005l\u0000"+
"\u0000\u0295\u0296\u0005e\u0000\u0000\u0296r\u0001\u0000\u0000\u0000\u0297"+
"\u0298\u0005w\u0000\u0000\u0298\u0299\u0005h\u0000\u0000\u0299\u029a\u0005"+
"i\u0000\u0000\u029a\u029b\u0005l\u0000\u0000\u029b\u029c\u0005e\u0000"+
"\u0000\u029ct\u0001\u0000\u0000\u0000\u029d\u029e\u0005.\u0000\u0000\u029e"+
"v\u0001\u0000\u0000\u0000\u029f\u02a3\u0003y<\u0000\u02a0\u02a3\u0003"+
"{=\u0000\u02a1\u02a3\u0003}>\u0000\u02a2\u029f\u0001\u0000\u0000\u0000"+
"\u02a2\u02a0\u0001\u0000\u0000\u0000\u02a2\u02a1\u0001\u0000\u0000\u0000"+
"\u02a3x\u0001\u0000\u0000\u0000\u02a4\u02a6\u0003\u0081@\u0000\u02a5\u02a7"+
"\u0003\u007f?\u0000\u02a6\u02a5\u0001\u0000\u0000\u0000\u02a6\u02a7\u0001"+
"\u0000\u0000\u0000\u02a7z\u0001\u0000\u0000\u0000\u02a8\u02aa\u0003\u0083"+
"A\u0000\u02a9\u02ab\u0003\u007f?\u0000\u02aa\u02a9\u0001\u0000\u0000\u0000"+
"\u02aa\u02ab\u0001\u0000\u0000\u0000\u02ab|\u0001\u0000\u0000\u0000\u02ac"+
"\u02ae\u0003\u00a9T\u0000\u02ad\u02af\u0003\u007f?\u0000\u02ae\u02ad\u0001"+
"\u0000\u0000\u0000\u02ae\u02af\u0001\u0000\u0000\u0000\u02af~\u0001\u0000"+
"\u0000\u0000\u02b0\u02b1\u0007\u0004\u0000\u0000\u02b1\u0080\u0001\u0000"+
"\u0000\u0000\u02b2\u02b8\u00050\u0000\u0000\u02b3\u02b5\u0003\u0095J\u0000"+
"\u02b4\u02b6\u0003\u0091H\u0000\u02b5\u02b4\u0001\u0000\u0000\u0000\u02b5"+
"\u02b6\u0001\u0000\u0000\u0000\u02b6\u02b8\u0001\u0000\u0000\u0000\u02b7"+
"\u02b2\u0001\u0000\u0000\u0000\u02b7\u02b3\u0001\u0000\u0000\u0000\u02b8"+
"\u0082\u0001\u0000\u0000\u0000\u02b9\u02ba\u00050\u0000\u0000\u02ba\u02bb"+
"\u0005x\u0000\u0000\u02bb\u02c0\u0003\u0085B\u0000\u02bc\u02bd\u00050"+
"\u0000\u0000\u02bd\u02be\u0005X\u0000\u0000\u02be\u02c0\u0003\u0085B\u0000"+
"\u02bf\u02b9\u0001\u0000\u0000\u0000\u02bf\u02bc\u0001\u0000\u0000\u0000"+
"\u02c0\u0084\u0001\u0000\u0000\u0000\u02c1\u02c6\u0003\u0087C\u0000\u02c2"+
"\u02c3\u0003\u0087C\u0000\u02c3\u02c4\u0003\u0085B\u0000\u02c4\u02c6\u0001"+
"\u0000\u0000\u0000\u02c5\u02c1\u0001\u0000\u0000\u0000\u02c5\u02c2\u0001"+
"\u0000\u0000\u0000\u02c6\u0086\u0001\u0000\u0000\u0000\u02c7\u02c8\u0007"+
"\u0005\u0000\u0000\u02c8\u0088\u0001\u0000\u0000\u0000\u02c9\u02ca\u0003"+
"\u0091H\u0000\u02ca\u02cc\u0005.\u0000\u0000\u02cb\u02cd\u0003\u0091H"+
"\u0000\u02cc\u02cb\u0001\u0000\u0000\u0000\u02cc\u02cd\u0001\u0000\u0000"+
"\u0000\u02cd\u02cf\u0001\u0000\u0000\u0000\u02ce\u02d0\u0003\u008bE\u0000"+
"\u02cf\u02ce\u0001\u0000\u0000\u0000\u02cf\u02d0\u0001\u0000\u0000\u0000"+
"\u02d0\u02d2\u0001\u0000\u0000\u0000\u02d1\u02d3\u0003\u0099L\u0000\u02d2"+
"\u02d1\u0001\u0000\u0000\u0000\u02d2\u02d3\u0001\u0000\u0000\u0000\u02d3"+
"\u02e8\u0001\u0000\u0000\u0000\u02d4\u02d5\u0005.\u0000\u0000\u02d5\u02d7"+
"\u0003\u0091H\u0000\u02d6\u02d8\u0003\u008bE\u0000\u02d7\u02d6\u0001\u0000"+
"\u0000\u0000\u02d7\u02d8\u0001\u0000\u0000\u0000\u02d8\u02da\u0001\u0000"+
"\u0000\u0000\u02d9\u02db\u0003\u0099L\u0000\u02da\u02d9\u0001\u0000\u0000"+
"\u0000\u02da\u02db\u0001\u0000\u0000\u0000\u02db\u02e8\u0001\u0000\u0000"+
"\u0000\u02dc\u02dd\u0003\u0091H\u0000\u02dd\u02df\u0003\u008bE\u0000\u02de"+
"\u02e0\u0003\u0099L\u0000\u02df\u02de\u0001\u0000\u0000\u0000\u02df\u02e0"+
"\u0001\u0000\u0000\u0000\u02e0\u02e8\u0001\u0000\u0000\u0000\u02e1\u02e3"+
"\u0003\u0091H\u0000\u02e2\u02e4\u0003\u008bE\u0000\u02e3\u02e2\u0001\u0000"+
"\u0000\u0000\u02e3\u02e4\u0001\u0000\u0000\u0000\u02e4\u02e5\u0001\u0000"+
"\u0000\u0000\u02e5\u02e6\u0003\u0099L\u0000\u02e6\u02e8\u0001\u0000\u0000"+
"\u0000\u02e7\u02c9\u0001\u0000\u0000\u0000\u02e7\u02d4\u0001\u0000\u0000"+
"\u0000\u02e7\u02dc\u0001\u0000\u0000\u0000\u02e7\u02e1\u0001\u0000\u0000"+
"\u0000\u02e8\u008a\u0001\u0000\u0000\u0000\u02e9\u02ea\u0003\u008dF\u0000"+
"\u02ea\u02eb\u0003\u008fG\u0000\u02eb\u008c\u0001\u0000\u0000\u0000\u02ec"+
"\u02ed\u0007\u0006\u0000\u0000\u02ed\u008e\u0001\u0000\u0000\u0000\u02ee"+
"\u02f0\u0003\u0097K\u0000\u02ef\u02ee\u0001\u0000\u0000\u0000\u02ef\u02f0"+
"\u0001\u0000\u0000\u0000\u02f0\u02f1\u0001\u0000\u0000\u0000\u02f1\u02f2"+
"\u0003\u0091H\u0000\u02f2\u0090\u0001\u0000\u0000\u0000\u02f3\u02f5\u0003"+
"\u0093I\u0000\u02f4\u02f3\u0001\u0000\u0000\u0000\u02f5\u02f6\u0001\u0000"+
"\u0000\u0000\u02f6\u02f4\u0001\u0000\u0000\u0000\u02f6\u02f7\u0001\u0000"+
"\u0000\u0000\u02f7\u0092\u0001\u0000\u0000\u0000\u02f8\u02fb\u00050\u0000"+
"\u0000\u02f9\u02fb\u0003\u0095J\u0000\u02fa\u02f8\u0001\u0000\u0000\u0000"+
"\u02fa\u02f9\u0001\u0000\u0000\u0000\u02fb\u0094\u0001\u0000\u0000\u0000"+
"\u02fc\u02fd\u0007\u0007\u0000\u0000\u02fd\u0096\u0001\u0000\u0000\u0000"+
"\u02fe\u02ff\u0007\b\u0000\u0000\u02ff\u0098\u0001\u0000\u0000\u0000\u0300"+
"\u0301\u0007\t\u0000\u0000\u0301\u009a\u0001\u0000\u0000\u0000\u0302\u0303"+
"\u0005\'\u0000\u0000\u0303\u0304\u0003\u009dN\u0000\u0304\u0305\u0005"+
"\'\u0000\u0000\u0305\u030b\u0001\u0000\u0000\u0000\u0306\u0307\u0005\'"+
"\u0000\u0000\u0307\u0308\u0003\u00a5R\u0000\u0308\u0309\u0005\'\u0000"+
"\u0000\u0309\u030b\u0001\u0000\u0000\u0000\u030a\u0302\u0001\u0000\u0000"+
"\u0000\u030a\u0306\u0001\u0000\u0000\u0000\u030b\u009c\u0001\u0000\u0000"+
"\u0000\u030c\u030d\u0007\n\u0000\u0000\u030d\u009e\u0001\u0000\u0000\u0000"+
"\u030e\u0310\u0005\"\u0000\u0000\u030f\u0311\u0003\u00a1P\u0000\u0310"+
"\u030f\u0001\u0000\u0000\u0000\u0310\u0311\u0001\u0000\u0000\u0000\u0311"+
"\u0312\u0001\u0000\u0000\u0000\u0312\u0313\u0005\"\u0000\u0000\u0313\u00a0"+
"\u0001\u0000\u0000\u0000\u0314\u0316\u0003\u00a3Q\u0000\u0315\u0314\u0001"+
"\u0000\u0000\u0000\u0316\u0317\u0001\u0000\u0000\u0000\u0317\u0315\u0001"+
"\u0000\u0000\u0000\u0317\u0318\u0001\u0000\u0000\u0000\u0318\u00a2\u0001"+
"\u0000\u0000\u0000\u0319\u031c\u0003\u009dN\u0000\u031a\u031c\u0003\u00a5"+
"R\u0000\u031b\u0319\u0001\u0000\u0000\u0000\u031b\u031a\u0001\u0000\u0000"+
"\u0000\u031c\u00a4\u0001\u0000\u0000\u0000\u031d\u0347\u0005\\\u0000\u0000"+
"\u031e\u031f\u0005u\u0000\u0000\u031f\u0320\u00050\u0000\u0000\u0320\u0321"+
"\u00050\u0000\u0000\u0321\u0322\u00050\u0000\u0000\u0322\u0348\u00058"+
"\u0000\u0000\u0323\u0324\u0005u\u0000\u0000\u0324\u0325\u00050\u0000\u0000"+
"\u0325\u0326\u00050\u0000\u0000\u0326\u0327\u00050\u0000\u0000\u0327\u0348"+
"\u00059\u0000\u0000\u0328\u0329\u0005u\u0000\u0000\u0329\u032a\u00050"+
"\u0000\u0000\u032a\u032b\u00050\u0000\u0000\u032b\u032c\u00050\u0000\u0000"+
"\u032c\u0348\u0005a\u0000\u0000\u032d\u032e\u0005u\u0000\u0000\u032e\u032f"+
"\u00050\u0000\u0000\u032f\u0330\u00050\u0000\u0000\u0330\u0331\u00050"+
"\u0000\u0000\u0331\u0348\u0005c\u0000\u0000\u0332\u0333\u0005u\u0000\u0000"+
"\u0333\u0334\u00050\u0000\u0000\u0334\u0335\u00050\u0000\u0000\u0335\u0336"+
"\u00050\u0000\u0000\u0336\u0348\u0005d\u0000\u0000\u0337\u0338\u0005u"+
"\u0000\u0000\u0338\u0339\u00050\u0000\u0000\u0339\u033a\u00050\u0000\u0000"+
"\u033a\u033b\u00052\u0000\u0000\u033b\u0348\u00052\u0000\u0000\u033c\u033d"+
"\u0005u\u0000\u0000\u033d\u033e\u00050\u0000\u0000\u033e\u033f\u00050"+
"\u0000\u0000\u033f\u0340\u00052\u0000\u0000\u0340\u0348\u00057\u0000\u0000"+
"\u0341\u0342\u0005u\u0000\u0000\u0342\u0343\u00050\u0000\u0000\u0343\u0344"+
"\u00050\u0000\u0000\u0344\u0345\u00055\u0000\u0000\u0345\u0348\u0005c"+
"\u0000\u0000\u0346\u0348\u0003\u00a7S\u0000\u0347\u031e\u0001\u0000\u0000"+
"\u0000\u0347\u0323\u0001\u0000\u0000\u0000\u0347\u0328\u0001\u0000\u0000"+
"\u0000\u0347\u032d\u0001\u0000\u0000\u0000\u0347\u0332\u0001\u0000\u0000"+
"\u0000\u0347\u0337\u0001\u0000\u0000\u0000\u0347\u033c\u0001\u0000\u0000"+
"\u0000\u0347\u0341\u0001\u0000\u0000\u0000\u0347\u0346\u0001\u0000\u0000"+
"\u0000\u0348\u00a6\u0001\u0000\u0000\u0000\u0349\u034a\u0005\\\u0000\u0000"+
"\u034a\u0355\u0003\u00adV\u0000\u034b\u034c\u0005\\\u0000\u0000\u034c"+
"\u034d\u0003\u00adV\u0000\u034d\u034e\u0003\u00adV\u0000\u034e\u0355\u0001"+
"\u0000\u0000\u0000\u034f\u0350\u0005\\\u0000\u0000\u0350\u0351\u0003\u00af"+
"W\u0000\u0351\u0352\u0003\u00adV\u0000\u0352\u0353\u0003\u00adV\u0000"+
"\u0353\u0355\u0001\u0000\u0000\u0000\u0354\u0349\u0001\u0000\u0000\u0000"+
"\u0354\u034b\u0001\u0000\u0000\u0000\u0354\u034f\u0001\u0000\u0000\u0000"+
"\u0355\u00a8\u0001\u0000\u0000\u0000\u0356\u0357\u00050\u0000\u0000\u0357"+
"\u0358\u0003\u00abU\u0000\u0358\u00aa\u0001\u0000\u0000\u0000\u0359\u035a"+
"\u0003\u00adV\u0000\u035a\u00ac\u0001\u0000\u0000\u0000\u035b\u035c\u0007"+
"\u000b\u0000\u0000\u035c\u00ae\u0001\u0000\u0000\u0000\u035d\u035e\u0007"+
"\f\u0000\u0000\u035e\u00b0\u0001\u0000\u0000\u0000\u035f\u0360\u0005t"+
"\u0000\u0000\u0360\u0361\u0005r\u0000\u0000\u0361\u0362\u0005u\u0000\u0000"+
"\u0362\u0369\u0005e\u0000\u0000\u0363\u0364\u0005f\u0000\u0000\u0364\u0365"+
"\u0005a\u0000\u0000\u0365\u0366\u0005l\u0000\u0000\u0366\u0367\u0005s"+
"\u0000\u0000\u0367\u0369\u0005e\u0000\u0000\u0368\u035f\u0001\u0000\u0000"+
"\u0000\u0368\u0363\u0001\u0000\u0000\u0000\u0369\u00b2\u0001\u0000\u0000"+
"\u0000\u036a\u036b\u0005n\u0000\u0000\u036b\u036c\u0005u\u0000\u0000\u036c"+
"\u036d\u0005l\u0000\u0000\u036d\u036e\u0005l\u0000\u0000\u036e\u00b4\u0001"+
"\u0000\u0000\u0000\u036f\u0370\u0005(\u0000\u0000\u0370\u00b6\u0001\u0000"+
"\u0000\u0000\u0371\u0372\u0005)\u0000\u0000\u0372\u00b8\u0001\u0000\u0000"+
"\u0000\u0373\u0374\u0005{\u0000\u0000\u0374\u00ba\u0001\u0000\u0000\u0000"+
"\u0375\u0376\u0005}\u0000\u0000\u0376\u00bc\u0001\u0000\u0000\u0000\u0377"+
"\u0378\u0005[\u0000\u0000\u0378\u00be\u0001\u0000\u0000\u0000\u0379\u037a"+
"\u0005]\u0000\u0000\u037a\u00c0\u0001\u0000\u0000\u0000\u037b\u037c\u0005"+
";\u0000\u0000\u037c\u00c2\u0001\u0000\u0000\u0000\u037d\u037e\u0005,\u0000"+
"\u0000\u037e\u00c4\u0001\u0000\u0000\u0000\u037f\u0380\u0005>\u0000\u0000"+
"\u0380\u0381\u0005>\u0000\u0000\u0381\u0382\u0005>\u0000\u0000\u0382\u0383"+
"\u0005=\u0000\u0000\u0383\u00c6\u0001\u0000\u0000\u0000\u0384\u0385\u0005"+
"=\u0000\u0000\u0385\u0386\u0005=\u0000\u0000\u0386\u00c8\u0001\u0000\u0000"+
"\u0000\u0387\u0388\u0005!\u0000\u0000\u0388\u0389\u0005=\u0000\u0000\u0389"+
"\u00ca\u0001\u0000\u0000\u0000\u038a\u038b\u0005<\u0000\u0000\u038b\u038c"+
"\u0005=\u0000\u0000\u038c\u00cc\u0001\u0000\u0000\u0000\u038d\u038e\u0005"+
">\u0000\u0000\u038e\u038f\u0005=\u0000\u0000\u038f\u00ce\u0001\u0000\u0000"+
"\u0000\u0390\u0391\u0005&\u0000\u0000\u0391\u0392\u0005&\u0000\u0000\u0392"+
"\u00d0\u0001\u0000\u0000\u0000\u0393\u0394\u0005|\u0000\u0000\u0394\u0395"+
"\u0005|\u0000\u0000\u0395\u00d2\u0001\u0000\u0000\u0000\u0396\u0397\u0005"+
"+\u0000\u0000\u0397\u0398\u0005+\u0000\u0000\u0398\u00d4\u0001\u0000\u0000"+
"\u0000\u0399\u039a\u0005-\u0000\u0000\u039a\u039b\u0005-\u0000\u0000\u039b"+
"\u00d6\u0001\u0000\u0000\u0000\u039c\u039d\u0005<\u0000\u0000\u039d\u039e"+
"\u0005<\u0000\u0000\u039e\u00d8\u0001\u0000\u0000\u0000\u039f\u03a0\u0005"+
">\u0000\u0000\u03a0\u03a1\u0005>\u0000\u0000\u03a1\u00da\u0001\u0000\u0000"+
"\u0000\u03a2\u03a3\u0005>\u0000\u0000\u03a3\u03a4\u0005>\u0000\u0000\u03a4"+
"\u03a5\u0005>\u0000\u0000\u03a5\u00dc\u0001\u0000\u0000\u0000\u03a6\u03a7"+
"\u0005+\u0000\u0000\u03a7\u03a8\u0005=\u0000\u0000\u03a8\u00de\u0001\u0000"+
"\u0000\u0000\u03a9\u03aa\u0005-\u0000\u0000\u03aa\u03ab\u0005=\u0000\u0000"+
"\u03ab\u00e0\u0001\u0000\u0000\u0000\u03ac\u03ad\u0005*\u0000\u0000\u03ad"+
"\u03ae\u0005=\u0000\u0000\u03ae\u00e2\u0001\u0000\u0000\u0000\u03af\u03b0"+
"\u0005/\u0000\u0000\u03b0\u03b1\u0005=\u0000\u0000\u03b1\u00e4\u0001\u0000"+
"\u0000\u0000\u03b2\u03b3\u0005&\u0000\u0000\u03b3\u03b4\u0005=\u0000\u0000"+
"\u03b4\u00e6\u0001\u0000\u0000\u0000\u03b5\u03b6\u0005|\u0000\u0000\u03b6"+
"\u03b7\u0005=\u0000\u0000\u03b7\u00e8\u0001\u0000\u0000\u0000\u03b8\u03b9"+
"\u0005^\u0000\u0000\u03b9\u03ba\u0005=\u0000\u0000\u03ba\u00ea\u0001\u0000"+
"\u0000\u0000\u03bb\u03bc\u0005%\u0000\u0000\u03bc\u03bd\u0005=\u0000\u0000"+
"\u03bd\u00ec\u0001\u0000\u0000\u0000\u03be\u03bf\u0005<\u0000\u0000\u03bf"+
"\u03c0\u0005<\u0000\u0000\u03c0\u03c1\u0005=\u0000\u0000\u03c1\u00ee\u0001"+
"\u0000\u0000\u0000\u03c2\u03c3\u0005>\u0000\u0000\u03c3\u03c4\u0005>\u0000"+
"\u0000\u03c4\u03c5\u0005=\u0000\u0000\u03c5\u00f0\u0001\u0000\u0000\u0000"+
"\u03c6\u03c7\u0005=\u0000\u0000\u03c7\u00f2\u0001\u0000\u0000\u0000\u03c8"+
"\u03c9\u0005~\u0000\u0000\u03c9\u00f4\u0001\u0000\u0000\u0000\u03ca\u03cb"+
"\u0005<\u0000\u0000\u03cb\u00f6\u0001\u0000\u0000\u0000\u03cc\u03cd\u0005"+
">\u0000\u0000\u03cd\u00f8\u0001\u0000\u0000\u0000\u03ce\u03cf\u0005!\u0000"+
"\u0000\u03cf\u00fa\u0001\u0000\u0000\u0000\u03d0\u03d1\u0005?\u0000\u0000"+
"\u03d1\u00fc\u0001\u0000\u0000\u0000\u03d2\u03d3\u0005:\u0000\u0000\u03d3"+
"\u00fe\u0001\u0000\u0000\u0000\u03d4\u03d5\u0005+\u0000\u0000\u03d5\u0100"+
"\u0001\u0000\u0000\u0000\u03d6\u03d7\u0005-\u0000\u0000\u03d7\u0102\u0001"+
"\u0000\u0000\u0000\u03d8\u03d9\u0005*\u0000\u0000\u03d9\u0104\u0001\u0000"+
"\u0000\u0000\u03da\u03db\u0005/\u0000\u0000\u03db\u0106\u0001\u0000\u0000"+
"\u0000\u03dc\u03dd\u0005&\u0000\u0000\u03dd\u0108\u0001\u0000\u0000\u0000"+
"\u03de\u03df\u0005|\u0000\u0000\u03df\u010a\u0001\u0000\u0000\u0000\u03e0"+
"\u03e1\u0005^\u0000\u0000\u03e1\u010c\u0001\u0000\u0000\u0000\u03e2\u03e3"+
"\u0005%\u0000\u0000\u03e3\u010e\u0001\u0000\u0000\u0000\u03e4\u03e8\u0003"+
"\u0111\u0088\u0000\u03e5\u03e7\u0003\u0113\u0089\u0000\u03e6\u03e5\u0001"+
"\u0000\u0000\u0000\u03e7\u03ea\u0001\u0000\u0000\u0000\u03e8\u03e6\u0001"+
"\u0000\u0000\u0000\u03e8\u03e9\u0001\u0000\u0000\u0000\u03e9\u0110\u0001"+
"\u0000\u0000\u0000\u03ea\u03e8\u0001\u0000\u0000\u0000\u03eb\u03ec\u0007"+
"\r\u0000\u0000\u03ec\u0112\u0001\u0000\u0000\u0000\u03ed\u03ee\u0007\u000e"+
"\u0000\u0000\u03ee\u0114\u0001\u0000\u0000\u0000&\u0000\u0117\u011a\u011e"+
"\u0128\u012c\u0130\u013d\u0145\u0149\u014d\u02a2\u02a6\u02aa\u02ae\u02b5"+
"\u02b7\u02bf\u02c5\u02cc\u02cf\u02d2\u02d7\u02da\u02df\u02e3\u02e7\u02ef"+
"\u02f6\u02fa\u030a\u0310\u0317\u031b\u0347\u0354\u0368\u03e8\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);
}
}
}

View File

@@ -1,200 +0,0 @@
WhiteSpace=1
Comment=2
Abstract=3
Assert=4
Boolean=5
Break=6
Byte=7
Case=8
Catch=9
Char=10
Class=11
Const=12
Continue=13
Default=14
Do=15
Double=16
Else=17
Extends=18
Final=19
Finally=20
Float=21
For=22
Goto=23
If=24
Implements=25
Import=26
InstanceOf=27
Int=28
Interface=29
Long=30
Native=31
New=32
Package=33
Private=34
Protected=35
Public=36
Return=37
Short=38
Static=39
Strictfp=40
Super=41
Switch=42
Synchronized=43
This=44
Throw=45
Throws=46
Transient=47
Try=48
Void=49
Volatile=50
While=51
Dot=52
IntegerLiteral=53
FloatingPointLiteral=54
CharacterLiteral=55
StringLiteral=56
BooleanLiteral=57
NullLiteral=58
ParenthesesLeft=59
ParenthesesRight=60
CurlyBracketLeft=61
CurlyBracketRight=62
SquareBracketLeft=63
SquareBracketRight=64
Semicolon=65
Comma=66
UnsignedRightShiftAssign=67
EqualTo=68
NotEqualTo=69
LessThanEqualTo=70
GreaterThanEqualTo=71
ConditionalAND=72
ConditionalOR=73
Increment=74
Decrement=75
LeftShift=76
SignedRightShift=77
UnsignedRightShift=78
AddAssign=79
SubtractAssign=80
MultiplyAssign=81
DivideAssign=82
BitwiseANDAssign=83
BitwiseORAssign=84
BitwiseXORAssign=85
RemainderAssign=86
LeftShiftAssign=87
SignedRightShiftAssign=88
Assignment=89
BitwiseComplement=90
LessThan=91
GreaterThan=92
LogicalComplement=93
Question=94
Colon=95
Addition=96
Subtraction=97
Multiplication=98
Division=99
BitwiseAND=100
BitwiseOR=101
BitwiseXOR=102
Remainder=103
IDENTIFIER=104
'abstract'=3
'assert'=4
'boolean'=5
'break'=6
'byte'=7
'case'=8
'catch'=9
'char'=10
'class'=11
'const'=12
'continue'=13
'default'=14
'do'=15
'double'=16
'else'=17
'extends'=18
'final'=19
'finally'=20
'float'=21
'for'=22
'goto'=23
'if'=24
'implements'=25
'import'=26
'instanceof'=27
'int'=28
'interface'=29
'long'=30
'native'=31
'new'=32
'package'=33
'private'=34
'protected'=35
'public'=36
'return'=37
'short'=38
'static'=39
'strictfp'=40
'super'=41
'switch'=42
'synchronized'=43
'this'=44
'throw'=45
'throws'=46
'transient'=47
'try'=48
'void'=49
'volatile'=50
'while'=51
'.'=52
'null'=58
'('=59
')'=60
'{'=61
'}'=62
'['=63
']'=64
';'=65
','=66
'>>>='=67
'=='=68
'!='=69
'<='=70
'>='=71
'&&'=72
'||'=73
'++'=74
'--'=75
'<<'=76
'>>'=77
'>>>'=78
'+='=79
'-='=80
'*='=81
'/='=82
'&='=83
'|='=84
'^='=85
'%='=86
'<<='=87
'>>='=88
'='=89
'~'=90
'<'=91
'>'=92
'!'=93
'?'=94
':'=95
'+'=96
'-'=97
'*'=98
'/'=99
'&'=100
'|'=101
'^'=102
'%'=103

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@@ -1,200 +0,0 @@
WhiteSpace=1
Comment=2
Abstract=3
Assert=4
Boolean=5
Break=6
Byte=7
Case=8
Catch=9
Char=10
Class=11
Const=12
Continue=13
Default=14
Do=15
Double=16
Else=17
Extends=18
Final=19
Finally=20
Float=21
For=22
Goto=23
If=24
Implements=25
Import=26
InstanceOf=27
Int=28
Interface=29
Long=30
Native=31
New=32
Package=33
Private=34
Protected=35
Public=36
Return=37
Short=38
Static=39
Strictfp=40
Super=41
Switch=42
Synchronized=43
This=44
Throw=45
Throws=46
Transient=47
Try=48
Void=49
Volatile=50
While=51
Dot=52
IntegerLiteral=53
FloatingPointLiteral=54
CharacterLiteral=55
StringLiteral=56
BooleanLiteral=57
NullLiteral=58
ParenthesesLeft=59
ParenthesesRight=60
CurlyBracketLeft=61
CurlyBracketRight=62
SquareBracketLeft=63
SquareBracketRight=64
Semicolon=65
Comma=66
UnsignedRightShiftAssign=67
EqualTo=68
NotEqualTo=69
LessThanEqualTo=70
GreaterThanEqualTo=71
ConditionalAND=72
ConditionalOR=73
Increment=74
Decrement=75
LeftShift=76
SignedRightShift=77
UnsignedRightShift=78
AddAssign=79
SubtractAssign=80
MultiplyAssign=81
DivideAssign=82
BitwiseANDAssign=83
BitwiseORAssign=84
BitwiseXORAssign=85
RemainderAssign=86
LeftShiftAssign=87
SignedRightShiftAssign=88
Assignment=89
BitwiseComplement=90
LessThan=91
GreaterThan=92
LogicalComplement=93
Question=94
Colon=95
Addition=96
Subtraction=97
Multiplication=98
Division=99
BitwiseAND=100
BitwiseOR=101
BitwiseXOR=102
Remainder=103
IDENTIFIER=104
'abstract'=3
'assert'=4
'boolean'=5
'break'=6
'byte'=7
'case'=8
'catch'=9
'char'=10
'class'=11
'const'=12
'continue'=13
'default'=14
'do'=15
'double'=16
'else'=17
'extends'=18
'final'=19
'finally'=20
'float'=21
'for'=22
'goto'=23
'if'=24
'implements'=25
'import'=26
'instanceof'=27
'int'=28
'interface'=29
'long'=30
'native'=31
'new'=32
'package'=33
'private'=34
'protected'=35
'public'=36
'return'=37
'short'=38
'static'=39
'strictfp'=40
'super'=41
'switch'=42
'synchronized'=43
'this'=44
'throw'=45
'throws'=46
'transient'=47
'try'=48
'void'=49
'volatile'=50
'while'=51
'.'=52
'null'=58
'('=59
')'=60
'{'=61
'}'=62
'['=63
']'=64
';'=65
','=66
'>>>='=67
'=='=68
'!='=69
'<='=70
'>='=71
'&&'=72
'||'=73
'++'=74
'--'=75
'<<'=76
'>>'=77
'>>>'=78
'+='=79
'-='=80
'*='=81
'/='=82
'&='=83
'|='=84
'^='=85
'%='=86
'<<='=87
'>>='=88
'='=89
'~'=90
'<'=91
'>'=92
'!'=93
'?'=94
':'=95
'+'=96
'-'=97
'*'=98
'/'=99
'&'=100
'|'=101
'^'=102
'%'=103

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@@ -1,200 +0,0 @@
WhiteSpace=1
Comment=2
Abstract=3
Assert=4
Boolean=5
Break=6
Byte=7
Case=8
Catch=9
Char=10
Class=11
Const=12
Continue=13
Default=14
Do=15
Double=16
Else=17
Extends=18
Final=19
Finally=20
Float=21
For=22
Goto=23
If=24
Implements=25
Import=26
InstanceOf=27
Int=28
Interface=29
Long=30
Native=31
New=32
Package=33
Private=34
Protected=35
Public=36
Return=37
Short=38
Static=39
Strictfp=40
Super=41
Switch=42
Synchronized=43
This=44
Throw=45
Throws=46
Transient=47
Try=48
Void=49
Volatile=50
While=51
Dot=52
IntegerLiteral=53
FloatingPointLiteral=54
CharacterLiteral=55
StringLiteral=56
BooleanLiteral=57
NullLiteral=58
ParenthesesLeft=59
ParenthesesRight=60
CurlyBracketLeft=61
CurlyBracketRight=62
SquareBracketLeft=63
SquareBracketRight=64
Semicolon=65
Comma=66
UnsignedRightShiftAssign=67
EqualTo=68
NotEqualTo=69
LessThanEqualTo=70
GreaterThanEqualTo=71
ConditionalAND=72
ConditionalOR=73
Increment=74
Decrement=75
LeftShift=76
SignedRightShift=77
UnsignedRightShift=78
AddAssign=79
SubtractAssign=80
MultiplyAssign=81
DivideAssign=82
BitwiseANDAssign=83
BitwiseORAssign=84
BitwiseXORAssign=85
RemainderAssign=86
LeftShiftAssign=87
SignedRightShiftAssign=88
Assignment=89
BitwiseComplement=90
LessThan=91
GreaterThan=92
LogicalComplement=93
Question=94
Colon=95
Addition=96
Subtraction=97
Multiplication=98
Division=99
BitwiseAND=100
BitwiseOR=101
BitwiseXOR=102
Remainder=103
IDENTIFIER=104
'abstract'=3
'assert'=4
'boolean'=5
'break'=6
'byte'=7
'case'=8
'catch'=9
'char'=10
'class'=11
'const'=12
'continue'=13
'default'=14
'do'=15
'double'=16
'else'=17
'extends'=18
'final'=19
'finally'=20
'float'=21
'for'=22
'goto'=23
'if'=24
'implements'=25
'import'=26
'instanceof'=27
'int'=28
'interface'=29
'long'=30
'native'=31
'new'=32
'package'=33
'private'=34
'protected'=35
'public'=36
'return'=37
'short'=38
'static'=39
'strictfp'=40
'super'=41
'switch'=42
'synchronized'=43
'this'=44
'throw'=45
'throws'=46
'transient'=47
'try'=48
'void'=49
'volatile'=50
'while'=51
'.'=52
'null'=58
'('=59
')'=60
'{'=61
'}'=62
'['=63
']'=64
';'=65
','=66
'>>>='=67
'=='=68
'!='=69
'<='=70
'>='=71
'&&'=72
'||'=73
'++'=74
'--'=75
'<<'=76
'>>'=77
'>>>'=78
'+='=79
'-='=80
'*='=81
'/='=82
'&='=83
'|='=84
'^='=85
'%='=86
'<<='=87
'>>='=88
'='=89
'~'=90
'<'=91
'>'=92
'!'=93
'?'=94
':'=95
'+'=96
'-'=97
'*'=98
'/'=99
'&'=100
'|'=101
'^'=102
'%'=103

2
.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
/bin
.vscode/

3
.idea/.gitignore generated vendored
View File

@@ -1,3 +0,0 @@
# Default ignored files
/shelf/
/workspace.xml

9
.idea/CPSC-499.iml generated
View File

@@ -1,9 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

4
.idea/misc.xml generated
View File

@@ -1,4 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" project-jdk-name="corretto-1.8" project-jdk-type="JavaSDK" />
</project>

8
.idea/modules.xml generated
View File

@@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/CPSC-499.iml" filepath="$PROJECT_DIR$/.idea/CPSC-499.iml" />
</modules>
</component>
</project>

6
.idea/vcs.xml generated
View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
</component>
</project>

View File

@@ -1,230 +0,0 @@
lexer grammar ExprLexer;
// LINE TERMINATORS -----------------------------------------------------------------------------------------------------------------------
fragment LineTerminator: '\r' '\n'? | '\n';
//WHITE SPACE ----------------------------------------------------------------------------------------------------------------------------------------
WhiteSpace: (' ' | '\t' | '\f' | LineTerminator) -> skip;
//COMMENTS --------------------------------------------------------------------------------------------------------------------------------------------------
fragment EndOfLineComment: '//' ~('\r' | '\n')* LineTerminator?;
Comment: (TraditionalComment | EndOfLineComment) -> skip;
fragment TraditionalComment:
'/*' NotStar CommentTail;
fragment CommentTail: '*' CommentTailStar | NotStar ;
fragment CommentTailStar:
'/' | '*' CommentTailStar | NotStarNotSlash CommentTail;
fragment NotStar:
[^*] | LineTerminator;
fragment NotStarNotSlash:
[^*/] | LineTerminator;
// KEYWORDS --------------------------------------------------------------------------------------------------------
Abstract: 'abstract';
Assert: 'assert';
Boolean: 'boolean';
Break: 'break';
Byte: 'byte';
Case: 'case';
Catch: 'catch';
Char: 'char';
Class: 'class';
Const: 'const';
Continue: 'continue';
Default: 'default';
Do: 'do';
Double: 'double';
Else: 'else';
Extends: 'extends';
Final: 'final';
Finally: 'finally';
Float: 'float';
For: 'for';
Goto: 'goto';
If: 'if';
Implements: 'implements';
Import: 'import';
InstanceOf: 'instanceof';
Int: 'int';
Interface: 'interface';
Long: 'long';
Native: 'native';
New: 'new';
Package: 'package';
Private: 'private';
Protected: 'protected';
Public: 'public';
Return: 'return';
Short: 'short';
Static: 'static';
Strictfp: 'strictfp';
Super: 'super';
Switch: 'switch';
Synchronized: 'synchronized';
This: 'this';
Throw: 'throw';
Throws: 'throws';
Transient: 'transient';
Try: 'try';
Void: 'void';
Volatile: 'volatile';
While: 'while';
Dot: '.';
// LITERALS -------------------------------------------------------------------------------------------------------------------
IntegerLiteral: DecimalIntegerLiteral | HexIntegerLiteral | OctalIntegerLiteral;
fragment DecimalIntegerLiteral:
DecimalNumeral IntegerTypeSuffix?;
fragment HexIntegerLiteral:
HexNumeral IntegerTypeSuffix?;
fragment OctalIntegerLiteral:
OctalNumeral IntegerTypeSuffix?;
fragment IntegerTypeSuffix:
[lL];
fragment DecimalNumeral:
'0' | NonZeroDigit Digits?;
fragment HexNumeral:
'0' 'x' HexDigits | '0' 'X' HexDigits;
fragment HexDigits:
HexDigit | HexDigit HexDigits;
fragment HexDigit:
[0-9a-fA-F];
FloatingPointLiteral: Digits '.' Digits? ExponentPart? FloatTypeSuffix?
| '.' Digits ExponentPart? FloatTypeSuffix?
| Digits ExponentPart FloatTypeSuffix?
| Digits ExponentPart? FloatTypeSuffix;
fragment ExponentPart:
ExponentIndicator SignedInteger;
fragment ExponentIndicator:
[eE];
fragment SignedInteger:
Sign? Digits;
fragment Digits:
Digit+;
fragment Digit:
'0' | NonZeroDigit;
fragment NonZeroDigit:
[1-9];
fragment Sign:
[+-];
fragment FloatTypeSuffix:
[fFdD];
CharacterLiteral: '\'' SingleCharacter '\'' | '\'' EscapeSequence '\'';
fragment SingleCharacter:
[^'\\];
StringLiteral: '"' StringCharacters? '"';
fragment StringCharacters:
StringCharacter+;
fragment StringCharacter:
SingleCharacter | EscapeSequence;
fragment EscapeSequence:
'\\' ('u0008' | 'u0009' | 'u000a' | 'u000c' | 'u000d' | 'u0022' | 'u0027' | 'u005c' | OctalEscape);
fragment OctalEscape:
'\\' OctalDigit | '\\' OctalDigit OctalDigit | '\\' ZeroToThree OctalDigit OctalDigit;
fragment OctalNumeral:
'0' OctalDigits;
fragment OctalDigits:
OctalDigit;
fragment OctalDigit:
[0-7];
fragment ZeroToThree:
[0-3];
BooleanLiteral: 'true' | 'false' ;
NullLiteral: 'null';
//SEPRATORS -------------------------------------------------------------------------------------------------------------------------
ParenthesesLeft: '(';
ParenthesesRight: ')';
CurlyBracketLeft: '{';
CurlyBracketRight: '}';
SquareBracketLeft: '[';
SquareBracketRight: ']';
Semicolon: ';';
Comma: ',';
//OPERATORS ---------------------------------------------------------------------------------------------------------------------------------------
UnsignedRightShiftAssign: '>>>=';
EqualTo: '==';
NotEqualTo: '!=';
LessThanEqualTo: '<=';
GreaterThanEqualTo: '>=';
ConditionalAND: '&&';
ConditionalOR: '||';
Increment: '++';
Decrement: '--';
LeftShift: '<<';
SignedRightShift: '>>';
UnsignedRightShift: '>>>';
AddAssign: '+=';
SubtractAssign: '-=';
MultiplyAssign: '*=';
DivideAssign: '/=';
BitwiseANDAssign: '&=';
BitwiseORAssign: '|=';
BitwiseXORAssign: '^=';
RemainderAssign: '%=';
LeftShiftAssign: '<<=';
SignedRightShiftAssign: '>>=';
Assignment: '=';
BitwiseComplement: '~';
LessThan: '<';
GreaterThan: '>';
LogicalComplement: '!';
Question: '?';
Colon: ':';
Addition: '+';
Subtraction: '-';
Multiplication: '*';
Division: '/';
BitwiseAND: '&';
BitwiseOR: '|';
BitwiseXOR: '^';
Remainder: '%';
//IDENTIFIERS -------------------------------------------------------------------------------------------------------------------------------------------
IDENTIFIER: JavaLetter JavaLetterOrDigit*;
fragment JavaLetter:
[a-zA-Z$_];
fragment JavaLetterOrDigit:
[A-Za-z0-9$_];

View File

@@ -1,248 +0,0 @@
parser grammar ExprParser;
options {
tokenVocab=ExprLexer;
}
prog: compilationUnit EOF;
identifier: IDENTIFIER;
qualifiedIdentifier: identifier (Dot identifier)*;
literal: IntegerLiteral
| FloatingPointLiteral
| CharacterLiteral
| StringLiteral
| BooleanLiteral
| NullLiteral;
//Section 15.26: Assignment Operators
expression: unaryExpr assignmentOperator expression | conditionalExpr ;
//Highest Prescedence _Expr = expression
//CI cha 6
conditionalExpr: logicalOrExpr Question conditionalExpr Colon conditionalExpr | logicalOrExpr;
logicalOrExpr: logicalAndExpr (ConditionalOR logicalAndExpr)*;
logicalAndExpr: equalityExpr (ConditionalAND equalityExpr)*;
equalityExpr: relationalExpr ((EqualTo | NotEqualTo) relationalExpr)*;
relationalExpr: additiveExpr((LessThan | GreaterThan | LessThanEqualTo | GreaterThanEqualTo) additiveExpr | InstanceOf type)*;
additiveExpr: multiplicativeExpr((Addition | Subtraction) multiplicativeExpr)*;
multiplicativeExpr: unaryExpr((Multiplication | Division | Remainder) unaryExpr)*;
unaryExpr:postfixExpr |(Addition | Subtraction | LogicalComplement | BitwiseComplement | Increment | Decrement) unaryExpr | parExpression type unaryExpr;
postfixExpr: primaryExpr (Increment| Decrement| Dot IDENTIFIER | SquareBracketLeft expression SquareBracketRight | arguments)*;
primaryExpr: parExpression
| IntegerLiteral
| FloatingPointLiteral
| StringLiteral
| CharacterLiteral
| BooleanLiteral
| NullLiteral
| IDENTIFIER
| This
| Super (Dot IDENTIFIER)?
| New type arguments
| primitiveType (SquareBracketLeft SquareBracketRight)* Dot Class
| type Dot Class;
assignmentOperator: Assignment
| AddAssign
| SubtractAssign
| MultiplyAssign
| DivideAssign
| BitwiseANDAssign
| BitwiseORAssign
| BitwiseXORAssign
| RemainderAssign
| LeftShiftAssign
| SignedRightShiftAssign
| UnsignedRightShiftAssign;
type: identifier (Dot identifier)* bracketsOpt | primitiveType;
statementExpression: expression;
constantExpression: expression;
identifierSuffix: SquareBracketLeft SquareBracketRight bracketsOpt Dot Class
|SquareBracketLeft expression SquareBracketRight
|arguments
|Dot (Class | This | Super arguments New innerCreator);
postfixOp: Increment | Decrement;
primitiveType: Byte | Short| Char | Int| Long| Float| Double| Boolean;
//Method arguments
argumentsOpt: (arguments)?;
arguments: ParenthesesLeft (expression (Comma expression)*)? ParenthesesRight;
bracketsOpt: (SquareBracketLeft SquareBracketRight)*;
creator: qualifiedIdentifier ( arrayCreatorRest | classCreatorRest);
innerCreator: identifier classCreatorRest;
arrayCreatorRest: SquareBracketLeft SquareBracketRight bracketsOpt arrayInitializer
| SquareBracketLeft expression SquareBracketRight (SquareBracketLeft expression SquareBracketRight)*;
classCreatorRest: arguments (classBody)?;
arrayInitializer: CurlyBracketLeft (variableInitializer(Comma variableInitializer)*(Comma)?)? CurlyBracketRight;
variableInitializer: arrayInitializer
|expression;
parExpression: ParenthesesLeft expression ParenthesesRight;
block: CurlyBracketLeft blockStatements CurlyBracketRight;
blockStatements: (blockStatement)*;
blockStatement: localVariableDeclarationStatement
|classOrInterfaceDeclaration
|(identifier Colon)? statement;
localVariableDeclarationStatement: (Final)? type variableDeclarators;
statement:completeIf | If parExpression statementIncompleteIf;
statementIncompleteIf: block
| If parExpression completeIf Else statementIncompleteIf
| For ParenthesesLeft forInit? Semicolon (expression)? Semicolon forUpdate? ParenthesesRight statement
| While parExpression statement
| Do statement While parExpression Semicolon
| Try block catches
| Try block Finally block
| Try block catches Finally block
| switchStatement
| Synchronized parExpression block
| Return (expression)? Semicolon
| Throw expression Semicolon
| Break (identifier)? Semicolon
| Continue (identifier)? Semicolon
| statementExpression Semicolon
| Semicolon;
//solve ambiguity over If()else. aka (Dangling else).
//this will do the longest check by looking for an else section, fincding the closest else!
completeIf: If parExpression completeIf Else completeIf | statementIncompleteIf;
catches: catchClause (catchClause)*;
catchClause: Catch ParenthesesLeft formalParameter ParenthesesRight block;
switchStatement: Switch parExpression CurlyBracketLeft CurlyBracketRight
| Switch parExpression CurlyBracketLeft switchBlockStatementGroups? CurlyBracketRight;
switchBlockStatementGroups: (switchBlockStatementGroup)*;
switchBlockStatementGroup: switchLabel blockStatements;
switchLabel: Case constantExpression Colon
| Default Colon;
moreStatementExpressions: (Comma statementExpression)*;
forInit: statementExpression moreStatementExpressions
| (Final)? type variableDeclarators;
forUpdate: statementExpression moreStatementExpressions;
modifiersOpt: (modifier)*;
modifier: Public
| Protected
| Private
| Static
| Abstract
| Final
| Native
| Synchronized
| Transient
| Volatile
| Strictfp;
variableDeclarators: variableDeclarator (Comma variableDeclarator)*;
variableDeclaratorsRest: variableDeclaratorRest (Comma variableDeclarator)*;
constantDeclaratorsRest: constantDeclaratorRest (Comma constantDeclarator)*;
variableDeclarator: identifier variableDeclaratorsRest;
constantDeclarator: identifier constantDeclaratorRest;
variableDeclaratorRest: bracketsOpt (Assignment variableInitializer)?;
constantDeclaratorRest: bracketsOpt Assignment variableInitializer;
variableDeclaratorId: identifier bracketsOpt;
compilationUnit: (Package qualifiedIdentifier Semicolon)? (importDeclaration)*(typeDeclaration)*;
importDeclaration: Import identifier (Dot identifier)* (Dot Multiplication)? Semicolon;
typeDeclaration: classOrInterfaceDeclaration | Semicolon;
classOrInterfaceDeclaration: modifiersOpt (classDeclaration | interfaceDeclaration);
classDeclaration: Class identifier (Extends type)? (Implements typeList)? classBody;
interfaceDeclaration: Interface identifier (Extends typeList)? interfaceBody;
typeList: type (Comma type)*;
classBody: CurlyBracketLeft (classBodyDeclaration)* CurlyBracketRight;
interfaceBody: CurlyBracketLeft (interfaceBodyDeclaration)* CurlyBracketRight;
classBodyDeclaration: Semicolon
| (Static)? block
| modifiersOpt memberDecl;
memberDecl: methodOrFieldDecl
| Void identifier methodDeclaratorRest
| identifier constructorDeclaratorRest
| classOrInterfaceDeclaration;
methodOrFieldDecl: type identifier methodOrFieldRest;
methodOrFieldRest: variableDeclaratorRest
|methodDeclaratorRest;
interfaceBodyDeclaration: Semicolon
| modifiersOpt interfaceMemberDecl;
interfaceMemberDecl: interfaceMethodOrFieldDecl
| Void identifier voidInterfaceMethodDeclaratorRest
| classOrInterfaceDeclaration;
interfaceMethodOrFieldDecl: type identifier interfaceMethodOrFieldRest;
interfaceMethodOrFieldRest: constantDeclaratorRest Semicolon
| interfaceMethodDeclaratorRest;
methodDeclaratorRest: formalParameters bracketsOpt (Throws qualifiedIdentifierList)?(methodBody | Semicolon);
voidMethodDeclaratorRest: formalParameters (Throws qualifiedIdentifierList)? (methodBody | Semicolon);
interfaceMethodDeclaratorRest: formalParameters bracketsOpt (Throws qualifiedIdentifierList)? Semicolon;
voidInterfaceMethodDeclaratorRest: formalParameters (Throws qualifiedIdentifierList)?;
constructorDeclaratorRest: formalParameters (Throws qualifiedIdentifierList)? methodBody;
qualifiedIdentifierList: qualifiedIdentifier (Comma qualifiedIdentifier)*;
formalParameters: ParenthesesLeft (formalParameter (Comma formalParameter)*)? ParenthesesRight;
formalParameter: (Final)? type variableDeclaratorId;
methodBody: block;

View File

@@ -1,248 +0,0 @@
parser grammar ExprSyntactic;
options {
tokenVocab=ExprLexer;
}
prog: compilationUnit EOF;
identifier: IDENTIFIER;
qualifiedIdentifier: identifier (Dot identifier)*;
literal: IntegerLiteral
| FloatingPointLiteral
| CharacterLiteral
| StringLiteral
| BooleanLiteral
| NullLiteral;
//Section 15.26: Assignment Operators
expression: unaryExpr assignmentOperator expression | conditionalExpr ;
//Highest Prescedence _Expr = expression
//CI cha 6
conditionalExpr: logicalOrExpr Question conditionalExpr Colon conditionalExpr | logicalOrExpr;
logicalOrExpr: logicalAndExpr (ConditionalOR logicalAndExpr)*;
logicalAndExpr: equalityExpr (ConditionalAND equalityExpr)*;
equalityExpr: relationalExpr ((EqualTo | NotEqualTo) relationalExpr)*;
relationalExpr: additiveExpr((LessThan | GreaterThan | LessThanEqualTo | GreaterThanEqualTo) additiveExpr | InstanceOf type)*;
additiveExpr: multiplicativeExpr((Addition | Subtraction) multiplicativeExpr)*;
multiplicativeExpr: unaryExpr((Multiplication | Division | Remainder) unaryExpr)*;
unaryExpr:postfixExpr |(Addition | Subtraction | LogicalComplement | BitwiseComplement | Increment | Decrement) unaryExpr | parExpression type unaryExpr;
postfixExpr: primaryExpr (Increment| Decrement| Dot IDENTIFIER | SquareBracketLeft expression SquareBracketRight | arguments)*;
primaryExpr: parExpression
| IntegerLiteral
| FloatingPointLiteral
| StringLiteral
| CharacterLiteral
| BooleanLiteral
| NullLiteral
| IDENTIFIER
| This
| Super (Dot IDENTIFIER)?
| New type arguments
| primitiveType (SquareBracketLeft SquareBracketRight)* Dot Class
| type Dot Class;
assignmentOperator: Assignment
| AddAssign
| SubtractAssign
| MultiplyAssign
| DivideAssign
| BitwiseANDAssign
| BitwiseORAssign
| BitwiseXORAssign
| RemainderAssign
| LeftShiftAssign
| SignedRightShiftAssign
| UnsignedRightShiftAssign;
type: identifier (Dot identifier)* bracketsOpt | primitiveType;
statementExpression: expression;
constantExpression: expression;
identifierSuffix: SquareBracketLeft SquareBracketRight bracketsOpt Dot Class
|SquareBracketLeft expression SquareBracketRight
|arguments
|Dot (Class | This | Super arguments New innerCreator);
postfixOp: Increment | Decrement;
primitiveType: Byte | Short| Char | Int| Long| Float| Double| Boolean;
//Method arguments
argumentsOpt: (arguments)?;
arguments: ParenthesesLeft (expression (Comma expression)*)? ParenthesesRight;
bracketsOpt: (SquareBracketLeft SquareBracketRight)*;
creator: qualifiedIdentifier ( arrayCreatorRest | classCreatorRest);
innerCreator: identifier classCreatorRest;
arrayCreatorRest: SquareBracketLeft SquareBracketRight bracketsOpt arrayInitializer
| SquareBracketLeft expression SquareBracketRight (SquareBracketLeft expression SquareBracketRight)*;
classCreatorRest: arguments (classBody)?;
arrayInitializer: CurlyBracketLeft (variableInitializer(Comma variableInitializer)*(Comma)?)? CurlyBracketRight;
variableInitializer: arrayInitializer
|expression;
parExpression: ParenthesesLeft expression ParenthesesRight;
block: CurlyBracketLeft blockStatements CurlyBracketRight;
blockStatements: (blockStatement)*;
blockStatement: localVariableDeclarationStatement
|classOrInterfaceDeclaration
|(identifier Colon)? statement;
localVariableDeclarationStatement: (Final)? type variableDeclarators;
statement:completeIf | If parExpression statementIncompleteIf;
statementIncompleteIf: block
| If parExpression completeIf Else statementIncompleteIf
| For ParenthesesLeft forInit? Semicolon (expression)? Semicolon forUpdate? ParenthesesRight statement
| While parExpression statement
| Do statement While parExpression Semicolon
| Try block catches
| Try block Finally block
| Try block catches Finally block
| switchStatement
| Synchronized parExpression block
| Return (expression)? Semicolon
| Throw expression Semicolon
| Break (identifier)? Semicolon
| Continue (identifier)? Semicolon
| statementExpression Semicolon
| Semicolon;
//solve ambiguity over If()else. aka (Dangling else).
//this will do the longest check by looking for an else section, fincding the closest else!
completeIf: If parExpression completeIf Else completeIf | statementIncompleteIf;
catches: catchClause (catchClause)*;
catchClause: Catch ParenthesesLeft formalParameter ParenthesesRight block;
switchStatement: Switch parExpression CurlyBracketLeft CurlyBracketRight
| Switch parExpression CurlyBracketLeft switchBlockStatementGroups? CurlyBracketRight;
switchBlockStatementGroups: (switchBlockStatementGroup)*;
switchBlockStatementGroup: switchLabel blockStatements;
switchLabel: Case constantExpression Colon
| Default Colon;
moreStatementExpressions: (Comma statementExpression)*;
forInit: statementExpression moreStatementExpressions
| (Final)? type variableDeclarators;
forUpdate: statementExpression moreStatementExpressions;
modifiersOpt: (modifier)*;
modifier: Public
| Protected
| Private
| Static
| Abstract
| Final
| Native
| Synchronized
| Transient
| Volatile
| Strictfp;
variableDeclarators: variableDeclarator (Comma variableDeclarator)*;
variableDeclaratorsRest: variableDeclaratorRest (Comma variableDeclarator)*;
constantDeclaratorsRest: constantDeclaratorRest (Comma constantDeclarator)*;
variableDeclarator: identifier variableDeclaratorsRest;
constantDeclarator: identifier constantDeclaratorRest;
variableDeclaratorRest: bracketsOpt (Assignment variableInitializer)?;
constantDeclaratorRest: bracketsOpt Assignment variableInitializer;
variableDeclaratorId: identifier bracketsOpt;
compilationUnit: (Package qualifiedIdentifier Semicolon)? (importDeclaration)*(typeDeclaration)*;
importDeclaration: Import identifier (Dot identifier)* (Dot Multiplication)? Semicolon;
typeDeclaration: classOrInterfaceDeclaration | Semicolon;
classOrInterfaceDeclaration: modifiersOpt (classDeclaration | interfaceDeclaration);
classDeclaration: Class identifier (Extends type)? (Implements typeList)? classBody;
interfaceDeclaration: Interface identifier (Extends typeList)? interfaceBody;
typeList: type (Comma type)*;
classBody: CurlyBracketLeft (classBodyDeclaration)* CurlyBracketRight;
interfaceBody: CurlyBracketLeft (interfaceBodyDeclaration)* CurlyBracketRight;
classBodyDeclaration: Semicolon
| (Static)? block
| modifiersOpt memberDecl;
memberDecl: methodOrFieldDecl
| Void identifier methodDeclaratorRest
| identifier constructorDeclaratorRest
| classOrInterfaceDeclaration;
methodOrFieldDecl: type identifier methodOrFieldRest;
methodOrFieldRest: variableDeclaratorRest
|methodDeclaratorRest;
interfaceBodyDeclaration: Semicolon
| modifiersOpt interfaceMemberDecl;
interfaceMemberDecl: interfaceMethodOrFieldDecl
| Void identifier voidInterfaceMethodDeclaratorRest
| classOrInterfaceDeclaration;
interfaceMethodOrFieldDecl: type identifier interfaceMethodOrFieldRest;
interfaceMethodOrFieldRest: constantDeclaratorRest Semicolon
| interfaceMethodDeclaratorRest;
methodDeclaratorRest: formalParameters bracketsOpt (Throws qualifiedIdentifierList)?(methodBody | Semicolon);
voidMethodDeclaratorRest: formalParameters (Throws qualifiedIdentifierList)? (methodBody | Semicolon);
interfaceMethodDeclaratorRest: formalParameters bracketsOpt (Throws qualifiedIdentifierList)? Semicolon;
voidInterfaceMethodDeclaratorRest: formalParameters (Throws qualifiedIdentifierList)?;
constructorDeclaratorRest: formalParameters (Throws qualifiedIdentifierList)? methodBody;
qualifiedIdentifierList: qualifiedIdentifier (Comma qualifiedIdentifier)*;
formalParameters: ParenthesesLeft (formalParameter (Comma formalParameter)*)? ParenthesesRight;
formalParameter: (Final)? type variableDeclaratorId;
methodBody: block;

View File

@@ -1,105 +0,0 @@
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Scanner;
import org.antlr.v4.runtime.*;
import org.antlr.v4.runtime.tree.*;
import org.antlr.v4.runtime.misc.ParseCancellationException;
public class ExprTool {
public static void main(String[] args) throws Exception {
if (args.length == 0) {
// If no files given then read from stdin
Scanner scanner = new Scanner(System.in);
StringBuilder inputBuilder = new StringBuilder();
while (scanner.hasNextLine()) {
inputBuilder.append(scanner.nextLine()).append("\n");
}
scanner.close();
parseAndWalk(inputBuilder.toString(), "<stdin>");
} else {
// for Loop through all given file paths
for (String filePath : args) {
try {
String inputText = new String(Files.readAllBytes(Paths.get(filePath)));
parseAndWalk(inputText, filePath);
} catch (IOException e) {
System.err.println("Error reading file: " + filePath);
}
}
}
}
// Reusable parsing + walking
private static void parseAndWalk(String inputText, String sourceName) {
try {
// Create char stream
CharStream input = CharStreams.fromString(inputText, sourceName);
// Lexer
ExprLexer lexer = new ExprLexer(input);
lexer.removeErrorListeners();
lexer.addErrorListener(new ThrowingErrorListener());
// Tokens
CommonTokenStream tokens = new CommonTokenStream(lexer);
// Parser
ExprParser parser = new ExprParser(tokens);
parser.removeErrorListeners();
parser.addErrorListener(new ThrowingErrorListener());
// Parse compilation unit
ParseTree tree = parser.compilationUnit();
// Walk
ParseTreeWalker walker = new ParseTreeWalker();
walker.walk(new ClassPrinter(sourceName), tree);
} catch (RuntimeException e) {
System.err.println("Parsing failed: " + e.getMessage());
}
}
// Listener to print class declarations with line/column
public static class ClassPrinter extends ExprParserBaseListener {
private final String sourceName;
public ClassPrinter(String sourceName) {
this.sourceName = sourceName;
}
@Override
public void enterClassDeclaration(ExprParser.ClassDeclarationContext ctx) {
int line = ctx.getStart().getLine();
int col = ctx.getStart().getCharPositionInLine();
String className = ctx.identifier().getText();
System.out.printf("Class %s, file %s, line %d, column %d%n",
className, sourceName, line, col);
}
}
// Custom error listener
public static class ThrowingErrorListener extends BaseErrorListener {
@Override
public void syntaxError(Recognizer<?, ?> recognizer,
Object offendingSymbol,
int line, int charPositionInLine,
String msg,
RecognitionException e) {
String sourceName = recognizer.getInputStream().getSourceName();
if (sourceName == null || sourceName.isEmpty()) {
sourceName = "<unknown>";
}
String formatted = String.format(
" file %s, line %d, column %d%n%s",
sourceName, line, charPositionInLine, msg
);
throw new ParseCancellationException(formatted);
}
}
}

468
README.md
View File

@@ -1 +1,467 @@
# CPSC-499 ## Termanology
1. Forward Slice => All statements that could be affected if you change a given statement.
2. AIS = Actualy Impacted Set (Manully calcualte the expected outcome)
3. EIS = Estimated Impacted Set (The set extracted from the outcome of the program)
### Run
```bash
chmod +x run.sh
# Show all dependencies for a file
./run.sh examples/Example1.java
# Analyze impact of line 3
./run.sh examples/Example1.java 3
```
# Testing
## Test1 simple data flow
### Line 3 (int x = 5;)
AIS = {3, 4, 5, 6}
```bash
=== Impact Analysis for Line 3 ===
Statement(s) at line 3:
1: int x = 5 ;
=== IMPACTED LINES ===
Line 3
Line 4
Line 5
Line 6
Total: 4 lines impacted
```
1. TP: {3, 4, 5, 6} |TP| = 4
2. FP: {} |FP| = 0
3. FN: {} |FN| = 0
4. TN: {} |TN| = 0
### Line 4 (int y = x + 2;)
AIS = {4,5,6}
```bash
=== Impact Analysis for Line 4 ===
Statement(s) at line 4:
2: int y = x + 2 ;
=== IMPACTED LINES ===
Line 4
Line 5
Line 6
Total: 3 lines impacted
```
1. TP: {4, 5, 6} |TP| = 3
2. FP: {} |FP| = 0
3. FN: {} |FN| = 0
4. TN: {} |TN| = 0
***
## Test2 Control Dependency
### Change at Line 5 (if (x > 5))
AIS = {5, 6, 8, 9}
```bash
=== Impact Analysis for Line 5 ===
Statement(s) at line 5:
3: if ( x > 5 )
=== IMPACTED LINES ===
Line 5
Line 8
Line 9
Total: 3 lines impacted
```
1. TP: {5, 8, 9} |TP| = 3
2. FP: {} |FP| = 0
3. FN: {6} |FN| = 1
4. TN: {} |TN| = 0
### Change at Line 3 (int x = 10;)
AIS = {3, 5, 6, 8, 9}
```bash
=== Impact Analysis for Line 3 ===
Statement(s) at line 3:
1: int x = 10 ;
=== IMPACTED LINES ===
Line 3
Line 5
Line 6
Line 8
Line 9
Total: 5 lines impacted
```
1. TP: {3, 5, 6, 8, 9} |TP| = 5
2. FP: {} |FP| = 0
3. FN: {} |FN| = 0
4. TN: {} |TN| = 0
***
## Test3 Simple Loop
### Change at Line 3 (int sum = 0;)
AIS = {3, 6, 8}
```Bash
=== Impact Analysis for Line 3 ===
Statement(s) at line 3:
1: int sum = 0 ;
=== IMPACTED LINES ===
Line 3
Line 6
Line 8
Total: 3 lines impacted
```
1. TP: {3, 6, 8} |TP| = 3
2. FP: {} |FP| = 0
3. FN: {} |FN| = 0
4. TN: {} |TN| = 0
### Change at Line 5 (for loop heading)
AIS = {5, 6, 8}
```Bash
=== Impact Analysis for Line 5 ===
Statement(s) at line 5:
3: for ( i = 0 ; i < 5 ; i ++ )
4: block
=== IMPACTED LINES ===
Line 5
Line 6
Line 8
Total: 3 lines impacted
```
1. TP: {5, 6, 8} |TP| = 3
2. FP: {} |FP| = 0
3. FN: {} |FN| = 0
4. TN: {} |TN| = 0
***
## Test4 If-Else Branch
### Change at Line 5 (if (x > 5))
AIS = {5, 6, 8, 10, 11}
```Bash
=== Impact Analysis for Line 5 ===
Statement(s) at line 5:
4: block
3: if ( x > 5 )
=== IMPACTED LINES ===
Line 5
Line 6
Line 7
Line 8
Line 10
Line 11
Total: 6 lines impacted
```
1. TP: {5, 6, 7, 8, 10, 11} |TP| = 6
2. FP: {} |FP| = 0
3. FN: {7} |FN| = 1
4. TN: {} |TN| = 0
### Change at Line 6 (y = x + 10;)
AIS = {6, 10, 11}
```bash
=== Impact Analysis for Line 6 ===
Statement(s) at line 6:
5: y = x + 10 ;
=== IMPACTED LINES ===
Line 6
Total: 1 lines impacted
```
1. TP: {6} |TP| = 1
2. FP: {} |FP| = 0
3. FN: {10, 11} |FN| = 2
4. TN: {} |TN| = 0
***
## Test5 Multiple Uses va
### Change at Line 3 (int a = 5;)
AIS = {3, 4, 5, 6, 7}
```Bash
=== Impact Analysis for Line 3 ===
Statement(s) at line 3:
1: int a = 5 ;
=== IMPACTED LINES ===
Line 3
Line 4
Line 5
Line 6
Line 7
Total: 5 lines impacted
```
1. TP: {3, 4, 5, 6, 7} |TP| = 5
2. FP: {} |FP| = 0
3. FN: {} |FN| = 0
4. TN: {} |TN| = 0
### Change at Line 4 (int b = a + 2;)
AIS = {4, 6, 7}
```Bash
=== Impact Analysis for Line 4 ===
Statement(s) at line 4:
2: int b = a + 2 ;
=== IMPACTED LINES ===
Line 4
Line 6
Line 7
Total: 3 lines impacted
```
1. TP: {4, 6, 7} |TP| = 3
2. FP: {} |FP| = 0
3. FN: {} |FN| = 0
4. TN: {} |TN| = 0
***
## Test6 Nested Control
### Change at Line 5 (if (x > 5))
AIS = {5, 6, 7, 10, 11}
```bash
=== Impact Analysis for Line 5 ===
Statement(s) at line 5:
4: block
3: if ( x > 5 )
=== IMPACTED LINES ===
Line 5
Line 6
Line 7
Line 10
Line 11
Total: 5 lines impacted
```
1. TP: {5, 6, 7, 10, 11} |TP| = 5
2. FP: {} |FP| = 0
3. FN: {} |FN| = 0
4. TN: {} |TN| = 0
### Change at Line 6 (if (x > 8))
AIS = {6, 7, 10, 11}
```bash
=== Impact Analysis for Line 6 ===
Statement(s) at line 6:
5: if ( x > 8 )
6: block
=== IMPACTED LINES ===
Line 6
Line 7
Line 10
Line 11
Total: 4 lines impacted
```
1. TP: {6, 7, 10, 11} |TP| = 4
2. FP: {} |FP| = 0
3. FN: {} |FN| = 0
4. TN: {} |TN| = 0
***
## Test7 While Loop
### Change at Line 5 (while (count < 5))
AIS = {5, 6, 7, 9}
```bash
=== Impact Analysis for Line 5 ===
Statement(s) at line 5:
3: while ( count < 5 )
4: block
=== IMPACTED LINES ===
Line 5
Line 6
Line 7
Line 9
Total: 4 lines impacted
```
1. TP: {5, 6, 7, 9} |TP| = 4
2. FP: {} |FP| = 0
3. FN: {} |FN| = 0
4. TN: {} |TN| = 0
### Change at Line 3 (int count = 0;)
AIS = {3, 5, 6, 7, 9}
```bash
=== Impact Analysis for Line 3 ===
Statement(s) at line 3:
1: int count = 0 ;
=== IMPACTED LINES ===
Line 3
Line 5
Line 6
Line 7
Line 9
Total: 5 lines impacted
```
1. TP: {3, 5, 6, 7, 9} |TP| = 5
2. FP: {} |FP| = 0
3. FN: {} |FN| = 0
4. TN: {} |TN| = 0
***
## Test8 Reassignment
### Change at Line 3 (int x = 5;)
AIS = {3, 4, 7}
```bash
=== Impact Analysis for Line 3 ===
Statement(s) at line 3:
1: int x = 5 ;
=== IMPACTED LINES ===
Line 3
Line 4
Line 7
Total: 3 lines impacted
```
1. TP: {3, 4, 7} |TP| = 3
2. FP: {} |FP| = 0
3. FN: {} |FN| = 0
4. TN: {} |TN| = 0
### Change at Line 5 (x = 10;)
AIS = {5, 6, 8}
```bash
=== Impact Analysis for Line 5 ===
Statement(s) at line 5:
3: x = 10 ;
=== IMPACTED LINES ===
Line 5
Line 6
Line 8
Total: 3 lines impacted
```
1. TP: {5, 6, 8} |TP| = 3
2. FP: {} |FP| = 0
3. FN: {} |FN| = 0
4. TN: {} |TN| = 0
***
## Test9 No Impact
### Change at Line 4 (int y = 10;)
AIS = {4, 6, 8}
```bash
=== Impact Analysis for Line 4 ===
Statement(s) at line 4:
2: int y = 10 ;
=== IMPACTED LINES ===
Line 4
Line 6
Line 8
Total: 3 lines impacted
```
1. TP: {4, 6, 8} |TP| = 3
2. FP: {} |FP| = 0
3. FN: {} |FN| = 0
4. TN: {} |TN| = 0
### Change at Line 3 (int x = 5;)
AIS = {3, 5, 7}
```bash
=== Impact Analysis for Line 3 ===
Statement(s) at line 3:
1: int x = 5 ;
=== IMPACTED LINES ===
Line 3
Line 5
Line 7
Total: 3 lines impacted
```
1. TP: {3, 5, 7} |TP| = 3
2. FP: {} |FP| = 0
3. FN: {} |FN| = 0
4. TN: {} |TN| = 0
***
## Test10 Complex Expression
### Change at Line 3 (int a = 2;)
AIS = {3, 6, 7, 8, 9}
```bash
=== Impact Analysis for Line 3 ===
Statement(s) at line 3:
1: int a = 2 ;
=== IMPACTED LINES ===
Line 3
Line 6
Line 7
Line 8
Line 9
Total: 5 lines impacted
```
1. TP: {3, 6, 7, 8, 9} |TP| = 5
2. FP: {} |FP| = 0
3. FN: {} |FN| = 0
4. TN: {} |TN| = 0
### Change at Line 8 (if (x > 5))
AIS = {8, 9}
```bash
=== Impact Analysis for Line 8 ===
Statement(s) at line 8:
6: if ( x > 5 )
7: block
=== IMPACTED LINES ===
Line 8
Line 9
Total: 2 lines impacted
```
1. TP: {8, 9} |TP| = 2
2. FP: {} |FP| = 0
3. FN: {} |FN| = 0
4. TN: {} |TN| = 0

View File

@@ -1,45 +0,0 @@
package Test
abstract class TaxCalculator {
protected double income
public TaxCalculator(double income {
this.income = income
}
public abstract double calculateTax()
public double afterTaxIncome() {
return income - calculateTax()
}
class FlatTaxCalculator extends TaxCalculator {
private static final double RATE = 0.15
public FlatTaxCalculator(double income) super(income)
public double calculateTax() {
return income * RATE
}
public class TaxApp {
static class BracketTaxCalculator extends TaxCalculator {
public BracketTaxCalculator(double income)
super(income)
public double calculateTax() {
if (income <= 10000) return income * 0.10
else if (income <= 50000) return (10000 * 0.10) + ((income - 10000) * 0.20)
else return (10000 * 0.10) + (40000 * 0.20) + ((income - 50000) * 0.30)
}
}
public static void main(String[] args) {
double income = 60000
TaxCalculator flat = new FlatTaxCalculator(income)
double flatTax = flat.calculateTax()
double flatAfterTax = flat.afterTaxIncome()
TaxCalculator bracket = new BracketTaxCalculator(income)
double bracketTax = bracket.calculateTax()
double bracketAfterTax = bracket.afterTaxIncome()
}
}

View File

@@ -1,44 +0,0 @@
package Test;
abstract class TaxCalculator {
protected double income;
public TaxCalculator(double income) {
this.income = income;
}
public abstract double calculateTax();
public double afterTaxIncome() {
return income - calculateTax();
}
}
class FlatTaxCalculator extends TaxCalculator {
private static final double RATE = 0.15;
public FlatTaxCalculator(double income) {super(income);}
public double calculateTax() {
return income * RATE;
}
}
public class TaxApp {
static class BracketTaxCalculator extends TaxCalculator {
public BracketTaxCalculator(double income) {
super(income);
}
public double calculateTax() {
if (income <= 10000) {return income * 0.10;}
else if (income <= 50000) { return (10000 * 0.10) + ((income - 10000) * 0.20);}
else { return (10000 * 0.10) + (40000 * 0.20) + ((income - 50000) * 0.30);}
}
}
public static void main(String[] args) {
double income = 60000;
TaxCalculator flat = new FlatTaxCalculator(income);
double flatTax = flat.calculateTax();
double flatAfterTax = flat.afterTaxIncome();
TaxCalculator bracket = new BracketTaxCalculator(income);
double bracketTax = bracket.calculateTax();
double bracketAfterTax = bracket.afterTaxIncome();
}
}

33
run.sh Executable file
View File

@@ -0,0 +1,33 @@
#!/bin/bash
if [ "$1" = "clean" ]; then
rm -rf bin
shift
fi
if [ "$#" -lt 1 ]; then
echo "Usage: ./run.sh <file> [line]"
echo "Example: ./run.sh examples/Example1.java 3"
exit 1
fi
# Check for antlr jar
if [ ! -f "lib/antlr-4.13.2-complete.jar" ]; then
echo "ERROR: Put antlr-4.13.2-complete.jar in lib/"
exit 1
fi
# Build if needed be
if [ ! -d "bin/pdg" ]; then
echo "Building..."
mkdir -p bin
CP="lib/antlr-4.13.2-complete.jar"
javac -d bin -cp "$CP" src/org/lsmr/cfg/*.java || exit 1
javac -d bin -cp "$CP:bin" src/pdg/PDG.java || exit 1
javac -d bin -cp "$CP:bin" src/CFGBuilder.java src/CIA.java || exit 1
echo "Build complete!"
fi
# Run
java -cp "bin:lib/antlr-4.13.2-complete.jar" CIA "$@"

BIN
src/.DS_Store vendored Normal file

Binary file not shown.

81
src/CFGBuilder.java Normal file
View File

@@ -0,0 +1,81 @@
import org.lsmr.cfg.*;
import org.antlr.v4.runtime.*;
import org.antlr.v4.runtime.tree.*;
import java.io.*;
import java.util.*;
public class CFGBuilder {
/**
* Build CFG from a Java file
*/
public ControlFlowGraph buildFromFile(String filename) throws IOException {
System.out.println("\n\tBuilding CFG from " + filename);
// Parse the file
CharStream input = CharStreams.fromFileName(filename);
Java1_4Lexer lexer = new Java1_4Lexer(input);
CommonTokenStream tokens = new CommonTokenStream(lexer);
Java1_4Parser parser = new Java1_4Parser(tokens);
parser.removeErrorListeners();
ParseTree tree = parser.compilationUnit();
// build CFG using professor's NodeBuilder
NodeBuilder builder = new NodeBuilder();
builder.visit(tree);
List<ControlFlowGraph> cfgs = builder.getCFGs();
if (cfgs.isEmpty()) {
throw new RuntimeException("No methods found in file");
}
if (cfgs.size() > 1) {
System.out.println("Note: File has " + cfgs.size() + " methods, using first method");
}
ControlFlowGraph cfg = cfgs.get(0);
System.out.println("CFG built: " + cfg.nodes().size() + " nodes, " + cfg.edges().size() + " edges");
return cfg;
}
public int getLineNumber(Node node) {
return node.getLineNumber();
}
public List<Node> findNodesAtLine(ControlFlowGraph cfg, int lineNumber) {
List<Node> result = new ArrayList<>();
for (Node node : cfg.nodes()) {
if (getLineNumber(node) == lineNumber) {
result.add(node);
}
}
return result;
}
public void printLineMapping(ControlFlowGraph cfg) {
System.out.println("\n Line Number Mapping");
Map<Integer, List<String>> lineToNodes = new TreeMap<>();
for (Node node : cfg.nodes()) {
int line = getLineNumber(node);
if (line > 0) {
lineToNodes.putIfAbsent(line, new ArrayList<>());
lineToNodes.get(line).add(node.label());
}
}
for (Map.Entry<Integer, List<String>> entry : lineToNodes.entrySet()) {
System.out.println("Line " + entry.getKey() + ":");
for (String label : entry.getValue()) {
System.out.println(" " + label);
}
}
System.out.println();
}
}

148
src/CIA.java Normal file
View File

@@ -0,0 +1,148 @@
import org.lsmr.cfg.*;
import pdg.PDG;
import java.io.*;
import java.util.*;
/**
* Change Impact Analysis (CIA) Tool
*
* This tool performs program dependence graph (PDG) analysis on Java source files
* to identify which lines of code are impacted by changes to a specific line.
*
* The analysis works by:
* 1. Building a Control Flow Graph (CFG) from the source code
* 2. Constructing a Program Dependence Graph (PDG) with control and data dependencies
* 3. Computing forward slices to determine impact
*
* Usage: java CIA <java-file> [line-number]
*/
public class CIA {
/**
* Main entry point for the Change Impact Analysis tool.
* Validates arguments and initiates the PDG analysis.
*
* @param args Command line arguments: [0] = filename, [1] = optional line number
*/
public static void main(String[] args) {
if (args.length < 1) {
System.err.println("Usage: java PDGTool <java-file> [line-number]");
System.exit(1);
}
String filename = args[0];
Integer targetLine = args.length > 1 ? Integer.parseInt(args[1]) : null;
try {
analyzePDG(filename, targetLine);
} catch (Exception e) {
System.err.println("Error: " + e.getMessage());
e.printStackTrace();
System.exit(1);
}
}
/**
* Performs PDG analysis on the specified Java file.
*
* This method orchestrates the complete analysis workflow:
* 1. Builds the Control Flow Graph (CFG)
* 2. Constructs the Program Dependence Graph (PDG)
* 3. Either displays all dependencies or computes impact for a specific line
*
* @param filename Path to the Java source file to analyze
* @param targetLine Optional line number to analyze for change impact (null for all dependencies)
* @throws IOException If file cannot be read or parsed
*/
private static void analyzePDG(String filename, Integer targetLine) throws IOException {
System.out.println("PDG Analysis Tool");
System.out.println("File: " + filename);
if (targetLine != null) {
System.out.println("Target line: " + targetLine);
}
// Step 1: Build CFG
CFGBuilder cfgBuilder = new CFGBuilder();
ControlFlowGraph cfg = cfgBuilder.buildFromFile(filename);
// Step 2: Build PDG
PDG pdg = new PDG(cfg);
// Step 3: Show results
System.out.println("\n=== Available Lines ===");
List<Integer> lines = cfg.getAllLineNumbers();
System.out.println("Lines with statements: " + lines);
// If specific line requested, compute impact
if (targetLine != null) {
computeImpact(cfg, pdg, cfgBuilder, targetLine);
} else {
// Show all dependencies
System.out.println("\n=== All Dependencies ===");
pdg.printPDG();
cfgBuilder.printLineMapping(cfg);
}
}
/**
* Computes and displays the change impact for a specific line of code.
*
* Change impact is determined by computing a forward slice from the target line,
* which identifies all statements that could be affected by modifying the target.
* This includes both direct dependencies (data flow) and indirect dependencies
* (control flow).
*
* @param cfg The Control Flow Graph of the program
* @param pdg The Program Dependence Graph containing dependency information
* @param cfgBuilder The CFG builder for line number mapping
* @param targetLine The line number to analyze for change impact
*/
private static void computeImpact(ControlFlowGraph cfg, PDG pdg,
CFGBuilder cfgBuilder, int targetLine) {
System.out.println("\n=== Impact Analysis for Line " + targetLine + " ===");
// Find nodes at target line
List<Node> nodesAtLine = cfgBuilder.findNodesAtLine(cfg, targetLine);
if (nodesAtLine.isEmpty()) {
System.out.println("WARNING: No executable statement at line " + targetLine);
return;
}
System.out.println("\nStatement(s) at line " + targetLine + ":");
for (Node node : nodesAtLine) {
System.out.println(" " + node.label());
}
// Compute forward slice: all nodes reachable via dependencies
// The forward slice represents all statements that could be affected
// by changes to the target line
Set<String> allImpacted = new HashSet<>();
for (Node node : nodesAtLine) {
Set<String> impacted = pdg.computeForwardSlice(node.label());
allImpacted.addAll(impacted);
}
// Convert to line numbers
Set<Integer> impactedLines = new TreeSet<>();
for (Node node : cfg.nodes()) {
if (allImpacted.contains(node.label())) {
int line = cfgBuilder.getLineNumber(node);
if (line > 0) {
impactedLines.add(line);
}
}
}
System.out.println("\n=== IMPACTED LINES ===");
if (impactedLines.isEmpty()) {
System.out.println(" (none)");
} else {
for (int line : impactedLines) {
System.out.println(" Line " + line);
}
System.out.println("\nTotal: " + impactedLines.size() + " lines impacted");
}
}
}

BIN
src/org/.DS_Store vendored Normal file

Binary file not shown.

BIN
src/org/lsmr/.DS_Store vendored Normal file

Binary file not shown.

BIN
src/org/lsmr/cfg/.DS_Store vendored Normal file

Binary file not shown.

View File

@@ -0,0 +1,312 @@
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<String, List<Node>> nodes = new HashMap<>();
private List<Edge> 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<Node> 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<Node> nodes() {
ArrayList<Node> result = new ArrayList<>();
for (List<Node> list : nodes.values())
result.addAll(list);
return Collections.unmodifiableList(result);
}
public List<Integer> getAllLineNumbers() {
List<Integer> lineNumbers = new ArrayList<>();
for (List<Node> listNodes : this.nodes.values()) {
for (Node n : listNodes) {
lineNumbers.add(n.getLineNumber());
}
}
return lineNumbers;
}
/**
* Accesses the set of edges defined on this graph.
*
* @return An immutable set of all edges defined on this graph.
*/
public List<Edge> 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<Node> 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<Node> findNodes(String label) {
List<Node> 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<Node> 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<String, List<Node>> nodes1, Map<String, List<Node>> nodes2) {
List<Node> list1 = new ArrayList<>();
List<Node> list2 = new ArrayList<>();
for (List<Node> nodeList : nodes1.values())
list1.addAll(nodeList);
for (List<Node> 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<Edge> edges1, List<Edge> 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();
}
}

207
src/org/lsmr/cfg/Edge.java Normal file
View File

@@ -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();
}
}

View File

@@ -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] = "<INVALID>";
}
}
}
@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<y={>}?\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);
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -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 <T> The return type of the visit operation. Use {@link Void} for
* operations with no return type.
*/
@SuppressWarnings("CheckReturnValue")
public class Java1_4ParserBaseVisitor<T> extends AbstractParseTreeVisitor<T> implements Java1_4ParserVisitor<T> {
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitIdentifier(Java1_4Parser.IdentifierContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitQualifiedIdentifier(Java1_4Parser.QualifiedIdentifierContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitLiteral(Java1_4Parser.LiteralContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitType(Java1_4Parser.TypeContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitBasicType(Java1_4Parser.BasicTypeContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitDims(Java1_4Parser.DimsContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitExpression(Java1_4Parser.ExpressionContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitAssignmentOperator(Java1_4Parser.AssignmentOperatorContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitExpression1(Java1_4Parser.Expression1Context ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitExpression1Rest(Java1_4Parser.Expression1RestContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitExpression2(Java1_4Parser.Expression2Context ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitExpression2Rest(Java1_4Parser.Expression2RestContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitInfixOp(Java1_4Parser.InfixOpContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitExpression3(Java1_4Parser.Expression3Context ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitPrefixOp(Java1_4Parser.PrefixOpContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitPostfixOp(Java1_4Parser.PostfixOpContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitPrimary(Java1_4Parser.PrimaryContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitIdentifierSuffix(Java1_4Parser.IdentifierSuffixContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitSelector(Java1_4Parser.SelectorContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitSuperSuffix(Java1_4Parser.SuperSuffixContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitArguments(Java1_4Parser.ArgumentsContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitCreator(Java1_4Parser.CreatorContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitInnerCreator(Java1_4Parser.InnerCreatorContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitArrayCreatorRest(Java1_4Parser.ArrayCreatorRestContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitClassCreatorRest(Java1_4Parser.ClassCreatorRestContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitArrayInitializer(Java1_4Parser.ArrayInitializerContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitVariableInitializer(Java1_4Parser.VariableInitializerContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitParenthesizedExpression(Java1_4Parser.ParenthesizedExpressionContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitBlock(Java1_4Parser.BlockContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitBlockStatement(Java1_4Parser.BlockStatementContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitLocalVariableDeclarationStatement(Java1_4Parser.LocalVariableDeclarationStatementContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitStatement(Java1_4Parser.StatementContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitIfStatement(Java1_4Parser.IfStatementContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitElseClause(Java1_4Parser.ElseClauseContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitForStatement(Java1_4Parser.ForStatementContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitWhileStatement(Java1_4Parser.WhileStatementContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitDoStatement(Java1_4Parser.DoStatementContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitTryStatement(Java1_4Parser.TryStatementContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitSwitchStatement(Java1_4Parser.SwitchStatementContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitSynchronizedStatement(Java1_4Parser.SynchronizedStatementContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitReturnStatement(Java1_4Parser.ReturnStatementContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitThrowStatement(Java1_4Parser.ThrowStatementContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitBreakStatement(Java1_4Parser.BreakStatementContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitContinueStatement(Java1_4Parser.ContinueStatementContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitEmptyStatement(Java1_4Parser.EmptyStatementContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitExpressionStatement(Java1_4Parser.ExpressionStatementContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitAssertStatement(Java1_4Parser.AssertStatementContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitLabeledStatement(Java1_4Parser.LabeledStatementContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitStatementExpression(Java1_4Parser.StatementExpressionContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitConstantExpression(Java1_4Parser.ConstantExpressionContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitCatches(Java1_4Parser.CatchesContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitCatchClause(Java1_4Parser.CatchClauseContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitFinallyClause(Java1_4Parser.FinallyClauseContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitSwitchBlockStatementGroup(Java1_4Parser.SwitchBlockStatementGroupContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitSwitchLabel(Java1_4Parser.SwitchLabelContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitForInit(Java1_4Parser.ForInitContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitForUpdate(Java1_4Parser.ForUpdateContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitModifier(Java1_4Parser.ModifierContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitVariableDeclarators(Java1_4Parser.VariableDeclaratorsContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitVariableDeclarator(Java1_4Parser.VariableDeclaratorContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitVariableDeclaratorId(Java1_4Parser.VariableDeclaratorIdContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitConstantDeclarator(Java1_4Parser.ConstantDeclaratorContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitCompilationUnit(Java1_4Parser.CompilationUnitContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitImportDeclaration(Java1_4Parser.ImportDeclarationContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitTypeDeclaration(Java1_4Parser.TypeDeclarationContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitClassOrInterfaceDeclaration(Java1_4Parser.ClassOrInterfaceDeclarationContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitClassDeclaration(Java1_4Parser.ClassDeclarationContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitSuperclass(Java1_4Parser.SuperclassContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitSuperinterfaces(Java1_4Parser.SuperinterfacesContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitInterfaceDeclaration(Java1_4Parser.InterfaceDeclarationContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitExtendsInterfaces(Java1_4Parser.ExtendsInterfacesContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitTypeList(Java1_4Parser.TypeListContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitClassBody(Java1_4Parser.ClassBodyContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitInterfaceBody(Java1_4Parser.InterfaceBodyContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitClassBodyDeclaration(Java1_4Parser.ClassBodyDeclarationContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitEmptyDeclaration(Java1_4Parser.EmptyDeclarationContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitInitializer(Java1_4Parser.InitializerContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitStaticInitializer(Java1_4Parser.StaticInitializerContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitMemberDeclaration(Java1_4Parser.MemberDeclarationContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitMethodDeclaration(Java1_4Parser.MethodDeclarationContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitResult(Java1_4Parser.ResultContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitThrows_(Java1_4Parser.Throws_Context ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitFieldDeclaration(Java1_4Parser.FieldDeclarationContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitConstructorDeclaration(Java1_4Parser.ConstructorDeclarationContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitConstructorBody(Java1_4Parser.ConstructorBodyContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitExplicitConstructorInvocation(Java1_4Parser.ExplicitConstructorInvocationContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitInterfaceBodyDeclaration(Java1_4Parser.InterfaceBodyDeclarationContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitInterfaceMemberDeclaration(Java1_4Parser.InterfaceMemberDeclarationContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitInterfaceMethodDeclaration(Java1_4Parser.InterfaceMethodDeclarationContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitConstantDeclaration(Java1_4Parser.ConstantDeclarationContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitQualifiedIdentifiers(Java1_4Parser.QualifiedIdentifiersContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitFormalParameters(Java1_4Parser.FormalParametersContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitFormalParameter(Java1_4Parser.FormalParameterContext ctx) { return visitChildren(ctx); }
}

View File

@@ -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 <T> The return type of the visit operation. Use {@link Void} for
* operations with no return type.
*/
public interface Java1_4ParserVisitor<T> extends ParseTreeVisitor<T> {
/**
* 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);
}

182
src/org/lsmr/cfg/Node.java Normal file
View File

@@ -0,0 +1,182 @@
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<Edge> inEdges = new HashSet<>();
private Set<Edge> outEdges = new HashSet<>();
private String label;
private int lineNumber;
Node(String label) {
if (label == null || label.length() < 1)
throw new IllegalArgumentException();
this.label = label;
}
public void setLineNumber(int lineNumber) {
this.lineNumber = lineNumber;
}
public int getLineNumber() {
return this.lineNumber;
}
/**
* 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<Edge> 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<Edge> 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();
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -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<String> {
@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);
}
}

403
src/pdg/PDG.java Normal file
View File

@@ -0,0 +1,403 @@
package pdg;
import org.lsmr.cfg.*;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Implementation notes:
* - Control dependencies computed via iterative reachability analysis
* - Data dependencies computed via reaching definitions analysis
* - Support Java 1.4 syntax with simple pattern matching
*
*/
public class PDG {
private ControlFlowGraph cfg;
private Map<String, Set<String>> controlDeps;
private Map<String, Set<String>> dataDeps;
public PDG(ControlFlowGraph cfg) {
this.cfg = cfg;
this.controlDeps = new HashMap<>();
this.dataDeps = new HashMap<>();
System.out.println("Building PDG...");
computeControlDependencies();
computeDataDependencies();
System.out.println("PDG complete!");
}
/**
* Compute control dependencies using simple reachability
*/
private void computeControlDependencies() {
System.out.println("\tComputing control dependencies...");
boolean changed = true;
while (changed) {
changed = false;
for (Node node : cfg.nodes()) {
Set<String> deps = new HashSet<>();
for (Edge inEdge : node.inEdges()) {
Node pred = inEdge.source();
// get all deps from
if (controlDeps.containsKey(pred.label())) {
deps.addAll(controlDeps.get(pred.label()));
}
// update deps if pred is a branching node liek if and while
if (pred.outEdges().size() > 1) {
deps.add(pred.label());
}
}
// compare prev iteration to current if we found changes in depns update control
// deps. else exit loop
Set<String> oldDeps = controlDeps.get(node.label());
if (oldDeps == null || !oldDeps.equals(deps)) {
controlDeps.put(node.label(), deps);
changed = true;
}
}
}
System.out.println("\t\tFound " + countDependencies(controlDeps) + " control dependencies");
}
/**
* Compute data dependencies using reaching definitions
*/
private void computeDataDependencies() {
System.out.println(" Computing data dependencies...");
// 1. Find definitions and uses for each node
Map<String, Set<String>> defs = new HashMap<>();
Map<String, Set<String>> uses = new HashMap<>();
for (Node node : cfg.nodes()) {
String label = node.label();
defs.put(label, extractDefs(label));
uses.put(label, extractUses(label));
}
System.out.println(defs.toString());
System.out.println(uses.toString());
// 2. Compute reaching definitions
Map<String, Map<String, Set<String>>> reaching = computeReachingDefinitions(defs);
// 3. Build data dependencies
for (Node node : cfg.nodes()) {
String label = node.label();
Set<String> deps = new HashSet<>();
for (String var : uses.get(label)) {
if (reaching.containsKey(label) && reaching.get(label).containsKey(var)) {
deps.addAll(reaching.get(label).get(var));
}
}
dataDeps.put(label, deps);
}
System.out.println(" Found " + countDependencies(dataDeps) + " data dependencies");
}
/**
* Extract variable definitions from a statement simple pattern matching for
* Java 1.4
*/
private Set<String> extractDefs(String statement) {
Set<String> vars = new HashSet<>();
// exclude comments
if (statement.startsWith("*") || statement.startsWith("/"))
return vars;
// used for normal assignments exclude anything else
boolean isDef = statement.contains("=") &&
!statement.contains("==") &&
!statement.contains("<=") &&
!statement.contains(">=") &&
!statement.contains("!=");
if (isDef) {
String lhs = statement.substring(0, statement.indexOf('=')).trim();
// remove left over operators after getting teh substring
if (lhs.endsWith("+") || lhs.endsWith("-") || lhs.endsWith("*") || lhs.endsWith("/") || lhs.endsWith("%")
|| lhs.endsWith("&") || lhs.endsWith("|") || lhs.endsWith("^")) {
lhs = lhs.substring(0, lhs.length() - 1).trim();
}
// for possible arrays
if (lhs.contains("[")) {
lhs = lhs.substring(0, lhs.indexOf('[')).trim();
}
// get last "word" splits by whitespace
String[] tokens = lhs.split("\\s+");
if (tokens.length > 0) {
String var = tokens[tokens.length - 1];
if (!var.isEmpty() && Character.isJavaIdentifierStart(var.charAt(0))) {
vars.add(var);
}
}
}
// Handle For Loops
if (statement.contains("for") && statement.contains("(")) {
String inside = statement.substring(statement.indexOf("(") + 1);
if (inside.contains(";")) {
String[] parts = inside.split(";");
// Init def: "int i = 0"
if (parts.length > 0 && parts[0].contains("=")) {
String part = parts[0].substring(0, parts[0].indexOf('=')).trim();
String[] tokens = part.split("\\s+");
if (tokens.length > 0) {
// retrieve last element
String var = tokens[tokens.length - 1];
vars.add(var);
}
}
// Update def for: "i++", "i--", "++i"
if (parts.length >= 3) {
String update = parts[parts.length - 1];
update = update.replaceAll("\\)", ""); // remove closing paren if present
if (update.contains("++") || update.contains("--")) {
String var = update;
if (!var.isEmpty())
vars.add(var);
}
}
}
}
return vars;
}
/**
* Extract variable uses from a statement
*/
private Set<String> extractUses(String statement) {
Set<String> vars = new HashSet<>();
// check for normal definition
boolean isDef = statement.contains("=") &&
!statement.contains("==") &&
!statement.contains("<=") &&
!statement.contains(">=") &&
!statement.contains("!=");
String searchArea = statement;
// Two cases: 1. normal def only RHS matters 2. compound def both LHS and RHS
// matter
if (isDef) {
int eqIndex = statement.indexOf('=');
// check for += -= etc. if it exists we found a compound def
boolean isCompound = eqIndex > 0 && "+-*/%&|^".indexOf(statement.charAt(eqIndex - 1)) != -1;
if (isCompound) {
// both RHS & LHS
searchArea = statement;
} else {
// only RHS
searchArea = statement.substring(eqIndex + 1); // skip anything before =
}
}
// Tokenize and filter
// fancy split on non-identifier characters to extract all variables used
String[] tokens = searchArea.split("[^a-zA-Z0-9_]+");
for (int i = 0; i < tokens.length; i++) {
String token = tokens[i];
if (token.isEmpty())
continue;
// Basic validity checks
if (Character.isJavaIdentifierStart(token.charAt(0))
&& !isKeyword(token)
&& !token.matches("\\d+")) {
// skip if its a method
boolean isMethodCall = statement.matches(".*\\b" + token + "\\s*\\(.*");
if (!isMethodCall) {
vars.add(token);
}
}
}
return vars;
}
/**
* Check if a word is a Java keyword
*/
private boolean isKeyword(String word) {
Set<String> keywords = new HashSet<>(Arrays.asList(
"if", "else", "while", "for", "do", "return", "break", "continue",
"int", "double", "float", "char", "boolean", "void", "String",
"new", "null", "true", "false", "class", "public", "private",
"static", "final", "this", "super", "try", "catch", "throw", "throws", "EXIT", "block", "ENTRY",
"THROWN"));
return keywords.contains(word);
}
/**
* Compute reaching definitions using iterative data flow analysis
*/
private Map<String, Map<String, Set<String>>> computeReachingDefinitions(
Map<String, Set<String>> defs) {
Map<String, Map<String, Set<String>>> reaching = new HashMap<>();
for (Node node : cfg.nodes()) {
reaching.put(node.label(), new HashMap<>());
}
boolean changed = true;
while (changed) {
changed = false;
for (Node node : cfg.nodes()) {
String label = node.label();
Map<String, Set<String>> oldReaching = new HashMap<>(reaching.get(label));
Map<String, Set<String>> newReaching = new HashMap<>();
for (Edge inEdge : node.inEdges()) {
Node pred = inEdge.source();
String predLabel = pred.label();
Map<String, Set<String>> predOut = new HashMap<>();
// In predecesor def
if (reaching.containsKey(predLabel)) {
for (Map.Entry<String, Set<String>> entry : reaching.get(predLabel).entrySet()) {
// create a copy of the set
predOut.put(entry.getKey(), new HashSet<>(entry.getValue()));
}
}
// kill & gen
if (defs.containsKey(predLabel)) {
for (String var : defs.get(predLabel)) {
// since new def, we update definition of x to new definition
Set<String> newDef = new HashSet<>();
newDef.add(predLabel);
predOut.put(var, newDef);
}
}
// merge
for (Map.Entry<String, Set<String>> entry : predOut.entrySet()) {
String var = entry.getKey();
newReaching.putIfAbsent(var, new HashSet<>());
newReaching.get(var).addAll(entry.getValue());
}
}
reaching.put(label, newReaching);
// nothing changed then exit
if (!mapsEqual(oldReaching, newReaching)) {
changed = true;
}
}
}
return reaching;
}
private boolean mapsEqual(Map<String, Set<String>> m1, Map<String, Set<String>> m2) {
if (m1.size() != m2.size())
return false;
for (String key : m1.keySet()) {
if (!m2.containsKey(key))
return false;
if (!m1.get(key).equals(m2.get(key)))
return false;
}
return true;
}
private int countDependencies(Map<String, Set<String>> deps) {
int count = 0;
for (Set<String> set : deps.values()) {
count += set.size();
}
return count;
}
public Set<String> getDependencies(String nodeLabel) {
Set<String> all = new HashSet<>();
if (controlDeps.containsKey(nodeLabel)) {
all.addAll(controlDeps.get(nodeLabel));
}
if (dataDeps.containsKey(nodeLabel)) {
all.addAll(dataDeps.get(nodeLabel));
}
return all;
}
public Set<String> computeForwardSlice(String nodeLabel) {
Set<String> slice = new HashSet<>();
Queue<String> worklist = new LinkedList<>();
slice.add(nodeLabel);
worklist.add(nodeLabel);
while (!worklist.isEmpty()) {
String current = worklist.poll();
for (String node : getAllNodes()) {
if (!slice.contains(node)) {
Set<String> deps = getDependencies(node);
if (deps.contains(current)) {
slice.add(node);
worklist.add(node);
}
}
}
}
return slice;
}
private Set<String> getAllNodes() {
Set<String> nodes = new HashSet<>();
for (Node node : cfg.nodes()) {
nodes.add(node.label());
}
return nodes;
}
public void printPDG() {
System.out.println("CONTROL DEPENDENCIES:");
for (Map.Entry<String, Set<String>> entry : controlDeps.entrySet()) {
if (!entry.getValue().isEmpty()) {
System.out.println(" " + entry.getKey());
for (String dep : entry.getValue()) {
System.out.println(" <- " + dep);
}
}
}
System.out.println("\nDATA DEPENDENCIES:");
for (Map.Entry<String, Set<String>> entry : dataDeps.entrySet()) {
if (!entry.getValue().isEmpty()) {
System.out.println(" " + entry.getKey());
for (String dep : entry.getValue()) {
System.out.println(" <- " + dep);
}
}
}
}
public Map<String, Set<String>> getControlDependencies() {
return new HashMap<>(controlDeps);
}
public Map<String, Set<String>> getDataDependencies() {
return new HashMap<>(dataDeps);
}
}

30
tests/Example1.java Normal file
View File

@@ -0,0 +1,30 @@
public class Example1 {
// public void test() {
// int x = 5;
// int y = x + 10;
// int z = y * 2;
// int result = z + x;
// }
// public void test1(int a) {
// int x = 5;
// int y = 0;
// if (a > 10) {
// y = x + a;
// } else {
// y = x - a;
// }
// int result = y * 2;
// }
public void test2() {
int sum = 0;
int i = 0;
while (i < 10) {
i = 2;
sum = sum + i;
i = i + 1;
}
}
}

8
tests/test1.java Normal file
View File

@@ -0,0 +1,8 @@
public class test1 {
public static void main(String[] args) {
int x = 5; // Line 3
int y = x + 2; // Line 4
int z = y * 3; // Line 5
System.out.println(z); // Line 6
}
}

12
tests/test10.java Normal file
View File

@@ -0,0 +1,12 @@
public class test10{
public static void main(String[] args) {
int a = 2; // Line 3
int b = 3; // Line 4
int c = 4; // Line 5
int result = (a + b) * c; // Line 6
int x = result / 2; // Line 7
if (x > 5) { // Line 8
System.out.println(x); // Line 9
}
}
}

11
tests/test2.java Normal file
View File

@@ -0,0 +1,11 @@
public class test2{
public static void main(String[] args) {
int x = 10; // Line 3
int y = 0; // Line 4
if (x > 5) { // Line 5
y = x * 2; // Line 6
}
int z = y + 1; // Line 8
System.out.println(z); // Line 9
}
}

10
tests/test3.java Normal file
View File

@@ -0,0 +1,10 @@
public class test3 {
public static void main(String[] args) {
int sum = 0; // Line 3
int i; // Line 4
for (i = 0; i < 5; i++) { // Line 5
sum = sum + i; // Line 6
}
System.out.println(sum); // Line 8
}
}

13
tests/test4.java Normal file
View File

@@ -0,0 +1,13 @@
public class test4{
public static void main(String[] args) {
int x = 10; // Line 3
int y = 0; // Line 4
if (x > 5) { // Line 5
y = x + 10; // Line 6
} else {
y = x - 10; // Line 8
}
int z = y * 2; // Line 10
System.out.println(z); // Line 11
}
}

9
tests/test5.java Normal file
View File

@@ -0,0 +1,9 @@
public class test5 {
public static void main(String[] args) {
int a = 5; // Line 3
int b = a + 2; // Line 4
int c = a * 3; // Line 5
int d = b + c; // Line 6
System.out.println(d); // Line 7
}
}

13
tests/test6.java Normal file
View File

@@ -0,0 +1,13 @@
public class test6{
public static void main(String[] args) {
int x = 10; // Line 3
int y = 0; // Line 4
if (x > 5) { // Line 5
if (x > 8) { // Line 6
y = x * 2; // Line 7
}
}
int z = y + 1; // Line 10
System.out.println(z); // Line 11
}
}

11
tests/test7.java Normal file
View File

@@ -0,0 +1,11 @@
public class test7 {
public static void main(String[] args) {
int count = 0; // Line 3
int sum = 0; // Line 4
while (count < 5) { // Line 5
sum = sum + count; // Line 6
count = count + 1; // Line 7
}
System.out.println(sum); // Line 9
}
}

10
tests/test8.java Normal file
View File

@@ -0,0 +1,10 @@
public class test8 {
public static void main(String[] args) {
int x = 5; // Line 3
int y = x + 1; // Line 4
x = 10; // Line 5
int z = x * 2; // Line 6
System.out.println(y); // Line 7
System.out.println(z); // Line 8
}
}

10
tests/test9.java Normal file
View File

@@ -0,0 +1,10 @@
public class test9{
public static void main(String[] args) {
int x = 5; // Line 3
int y = 10; // Line 4
int z = x + 1; // Line 5
int w = y + 2; // Line 6
System.out.println(z); // Line 7
System.out.println(w); // Line 8
}
}