10 Commits

Author SHA1 Message Date
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
54 changed files with 12188 additions and 15455 deletions

BIN
.DS_Store vendored

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

View File

@@ -1,21 +1,16 @@
## Program Dependence Graphs(PDG) for Change Impact Analysis(CIA) ### Things
1. Forward Slice => All statements that could be affected if you change a given statement.Think of it like ripple effects in water:
<img class="fullimage" alt="Program Dependence Graphs & Change Impact Analysis tool in action" src="./assets/pdg-cia-tool.gif">
When working on large software systems, even a tiny code change can have unexpected consequences. A single modified line may influence other parts of the program through hidden control or data dependencies. Understanding *what might break* after a change is one of the hardest parts of software maintenance and thats exactly the problem our project set out to solve.
For our CPSC 499 Software Analysis project, our team built a **PDG based change impact analysis tool** for Java 1.4 programs. Given a line number in the source code, the tool automatically determines which other lines may be affected by a change to that line. Instead of relying on intuition or manual inspection, we let static analysis do the heavy lifting. ### Run
The core idea behind our approach is simple: if one statement controls whether another statement executes, or if it defines a variable that another statement uses, then the second statement depends on the first. We capture these relationships using a Program Dependence Graph that combines **control dependencies** and **data dependencies**. Once the PDG is built, change impact analysis becomes a graph reachability problem starting from the changed line, we follow dependency edges to find everything that could be affected. ```bash
chmod +x run.sh
We implemented our tool using JavaParser configured for Java 1.4 to generate Abstract Syntax Trees (AST). Each statement was mapped back to its original source line so that results could be reported in a form developers actually care about: line numbers. On top of the AST, we constructed a CFG, then layered control and data dependency analysis to form the PDG. # Show all dependencies for a file
./run.sh examples/Example1.java
Control dependency analysis determines which statements depend on branching decisions, such as conditions in `if` statements or loops. Because loops introduce backward control flow, we used a **fixed point iteration** approach, repeatedly propagating dependencies until the results stabilized. Data dependency analysis was implemented using classic **reaching definitions analysis** with GEN and KILL sets, allowing us to track how variable definitions flow through the program even across branches and loops. # Analyze impact of line 3
./run.sh examples/Example1.java 3
Once the PDG was complete, impact analysis was straightforward. Given a changed line, we traversed the graph to find all reachable nodes. These nodes represent the estimated set of impacted lines. The quality of this result depends entirely on the accuracy of the dependency graph, so much of our effort went into handling edge cases like compound assignments, variable declarations with initialization, and loop-carried dependencies. ```
To evaluate the tool, we compared its output against manually analyzed ground truth across a variety of Java programs. The results were encouraging: **95% average precision**, **91% average recall**, and **85% perfect accuracy**. The tool performed especially well in data-flow-heavy scenarios, capturing transitive dependencies and loop effects with very few false positives. Most errors occurred in complex control-flow situations, which is consistent with the known limits of static analysis.
Beyond the metrics, the project taught us valuable lessons. Fixed-point algorithms are powerful but subtle, especially in the presence of loops. Mapping between ASTs, CFGs, and source code is far more difficult than it initially appears. And perhaps most importantly, static analysis is always an approximation—being explicit about its trade-offs is just as important as implementing the analysis itself.
While our tool is limited to Java 1.4 and intraprocedural analysis, the results demonstrate that **Program Dependence Graphs are a strong foundation for automated change impact analysis**. With further work, this approach could scale to larger codebases, support modern language features, and incorporate inter-procedural dependencies bringing developers one step closer to confidently answering the question: *“If I change this line, what else might break?”*

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 790 KiB

BIN
lib/.DS_Store vendored Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
lib/apfloat-1.10.1.jar Normal file

Binary file not shown.

BIN
lib/jgrapht-core-1.5.1.jar Normal file

Binary file not shown.

Binary file not shown.

BIN
lib/jgrapht-core-1.5.2.jar Normal file

Binary file not shown.

BIN
lib/jgrapht-io-1.5.1.jar Normal file

Binary file not shown.

BIN
lib/jgrapht-io-1.5.2.jar Normal file

Binary file not shown.

BIN
lib/jheaps-0.14-javadoc.jar Normal file

Binary file not shown.

BIN
lib/jheaps-0.14.jar Normal file

Binary file not shown.

27
run.sh Executable file
View File

@@ -0,0 +1,27 @@
#!/bin/bash
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/PDGTool.java || exit 1
echo "Build complete!"
fi
# Run
java -cp "bin:lib/antlr-4.13.2-complete.jar" PDGTool "$@"

BIN
src/.DS_Store vendored Normal file

Binary file not shown.

80
src/CFGBuilder.java Normal file
View File

@@ -0,0 +1,80 @@
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();
}
}

106
src/CIA.java Normal file
View File

@@ -0,0 +1,106 @@
import org.lsmr.cfg.*;
import pdg.PDG;
import java.io.*;
import java.util.*;
/**
* PDG Tool: Change Impact Analysis
* Usage: java PDGTool <java-file> [line-number]
*/
public class CIA {
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);
}
}
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);
}
}
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
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);
}
}

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

@@ -0,0 +1,316 @@
package pdg;
import org.lsmr.cfg.*;
import java.util.*;
/**
* Simple Program Dependence Graph (PDG)
* Computes control and data dependencies for a CFG
*/
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...");
for (Node node : cfg.nodes()) {
Set<String> deps = new HashSet<>();
for (Edge inEdge : node.inEdges()) {
Node pred = inEdge.source();
if (pred.outEdges().size() > 1) {
deps.add(pred.label());
if (controlDeps.containsKey(pred.label())) {
deps.addAll(controlDeps.get(pred.label()));
}
}
}
controlDeps.put(node.label(), deps);
}
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));
}
// 2. Compute reaching definitions
Map<String, Map<String, Set<String>>> reaching = computeReachingDefinitions(defs);
// TODO: check what happens whena node has multiple variable definitions
// 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<>();
// Skip special nodes
if (statement.startsWith("*"))
return vars;
if (statement.contains("=") && !statement.contains("==")) {
String[] parts = statement.split("=");
if (parts.length > 0) {
String lhs = parts[0].trim();
String[] tokens = lhs.split("\\s+");
if (tokens.length > 0) {
String varName = tokens[tokens.length - 1];
varName = varName.replaceAll("[\\[\\].();,]", "");
if (!varName.isEmpty() && Character.isJavaIdentifierStart(varName.charAt(0))) {
vars.add(varName);
}
}
}
}
if (statement.contains("for") && statement.contains("(")) {
String forPart = statement.substring(statement.indexOf("("));
String[] forParts = forPart.split(";");
if (forParts.length >= 3) {
if (forParts[0].contains("=")) {
String[] initParts = forParts[0].split("=");
if (initParts.length > 0) {
String var = initParts[0].trim().replaceAll("[^a-zA-Z0-9_]", "");
if (!var.isEmpty())
vars.add(var);
}
}
String update = forParts[forParts.length - 1];
if (update.contains("++") || update.contains("--")) {
String var = update.replaceAll("[^a-zA-Z0-9_]", "");
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<>();
if (statement.startsWith("*"))
return vars;
String[] tokens = statement.split("[\\s+\\-*/=<>!&|(){}\\[\\];,.]");
for (String token : tokens) {
token = token.trim();
if (!token.isEmpty() &&
Character.isJavaIdentifierStart(token.charAt(0)) &&
!isKeyword(token) &&
!token.matches("\\d+")) {
vars.add(token);
}
}
vars.removeAll(extractDefs(statement));
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"));
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;
int iterations = 0;
while (changed && iterations < 100) {
changed = false;
iterations++;
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();
if (reaching.containsKey(predLabel)) {
for (Map.Entry<String, Set<String>> entry : reaching.get(predLabel).entrySet()) {
String var = entry.getKey();
newReaching.putIfAbsent(var, new HashSet<>());
newReaching.get(var).addAll(entry.getValue());
}
}
// Add predecessor's definitions
for (String var : defs.get(predLabel)) {
newReaching.putIfAbsent(var, new HashSet<>());
newReaching.get(var).clear();
newReaching.get(var).add(predLabel);
}
}
reaching.put(label, newReaching);
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);
}
}

29
tests/Example1.java Normal file
View File

@@ -0,0 +1,29 @@
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) {
sum = sum + i;
i = i + 1;
}
}
}