home *** CD-ROM | disk | FTP | other *** search
- package sun.tools.java;
-
- import java.io.IOException;
- import java.io.InputStream;
- import java.util.Vector;
- import sun.tools.tree.AddExpression;
- import sun.tools.tree.AndExpression;
- import sun.tools.tree.ArrayAccessExpression;
- import sun.tools.tree.ArrayExpression;
- import sun.tools.tree.AssignAddExpression;
- import sun.tools.tree.AssignBitAndExpression;
- import sun.tools.tree.AssignBitOrExpression;
- import sun.tools.tree.AssignBitXorExpression;
- import sun.tools.tree.AssignDivideExpression;
- import sun.tools.tree.AssignExpression;
- import sun.tools.tree.AssignMultiplyExpression;
- import sun.tools.tree.AssignRemainderExpression;
- import sun.tools.tree.AssignShiftLeftExpression;
- import sun.tools.tree.AssignShiftRightExpression;
- import sun.tools.tree.AssignSubtractExpression;
- import sun.tools.tree.AssignUnsignedShiftRightExpression;
- import sun.tools.tree.BitAndExpression;
- import sun.tools.tree.BitNotExpression;
- import sun.tools.tree.BitOrExpression;
- import sun.tools.tree.BitXorExpression;
- import sun.tools.tree.BooleanExpression;
- import sun.tools.tree.BreakStatement;
- import sun.tools.tree.CaseStatement;
- import sun.tools.tree.CastExpression;
- import sun.tools.tree.CatchStatement;
- import sun.tools.tree.CharExpression;
- import sun.tools.tree.CommaExpression;
- import sun.tools.tree.CompoundStatement;
- import sun.tools.tree.ConditionalExpression;
- import sun.tools.tree.ContinueStatement;
- import sun.tools.tree.DeclarationStatement;
- import sun.tools.tree.DivideExpression;
- import sun.tools.tree.DoStatement;
- import sun.tools.tree.DoubleExpression;
- import sun.tools.tree.EqualExpression;
- import sun.tools.tree.ExprExpression;
- import sun.tools.tree.Expression;
- import sun.tools.tree.ExpressionStatement;
- import sun.tools.tree.FieldExpression;
- import sun.tools.tree.FinallyStatement;
- import sun.tools.tree.FloatExpression;
- import sun.tools.tree.ForStatement;
- import sun.tools.tree.GreaterExpression;
- import sun.tools.tree.GreaterOrEqualExpression;
- import sun.tools.tree.IdentifierExpression;
- import sun.tools.tree.IfStatement;
- import sun.tools.tree.InstanceOfExpression;
- import sun.tools.tree.IntExpression;
- import sun.tools.tree.LessExpression;
- import sun.tools.tree.LessOrEqualExpression;
- import sun.tools.tree.LocalField;
- import sun.tools.tree.LongExpression;
- import sun.tools.tree.MethodExpression;
- import sun.tools.tree.MultiplyExpression;
- import sun.tools.tree.NegativeExpression;
- import sun.tools.tree.NewArrayExpression;
- import sun.tools.tree.NewInstanceExpression;
- import sun.tools.tree.Node;
- import sun.tools.tree.NotEqualExpression;
- import sun.tools.tree.NotExpression;
- import sun.tools.tree.NullExpression;
- import sun.tools.tree.OrExpression;
- import sun.tools.tree.PositiveExpression;
- import sun.tools.tree.PostDecExpression;
- import sun.tools.tree.PostIncExpression;
- import sun.tools.tree.PreDecExpression;
- import sun.tools.tree.PreIncExpression;
- import sun.tools.tree.RemainderExpression;
- import sun.tools.tree.ReturnStatement;
- import sun.tools.tree.ShiftLeftExpression;
- import sun.tools.tree.ShiftRightExpression;
- import sun.tools.tree.Statement;
- import sun.tools.tree.StringExpression;
- import sun.tools.tree.SubtractExpression;
- import sun.tools.tree.SuperExpression;
- import sun.tools.tree.SwitchStatement;
- import sun.tools.tree.SynchronizedStatement;
- import sun.tools.tree.ThisExpression;
- import sun.tools.tree.ThrowStatement;
- import sun.tools.tree.TryStatement;
- import sun.tools.tree.TypeExpression;
- import sun.tools.tree.UnsignedShiftRightExpression;
- import sun.tools.tree.VarDeclarationStatement;
- import sun.tools.tree.WhileStatement;
-
- public class Parser extends Scanner implements ParserActions, Constants {
- ParserActions actions;
- private Node[] args;
- protected int argIndex;
- private int aCount;
- private Type[] aTypes;
- private IdentifierToken[] aNames;
- private ClassDefinition curClass;
- protected Scanner scanner;
-
- protected Parser(Environment var1, InputStream var2) throws IOException {
- super(var1, var2);
- this.args = new Node[32];
- this.aTypes = new Type[8];
- this.aNames = new IdentifierToken[this.aTypes.length];
- this.scanner = this;
- this.actions = this;
- }
-
- protected Parser(Scanner var1) throws IOException {
- super(var1.env);
- this.args = new Node[32];
- this.aTypes = new Type[8];
- this.aNames = new IdentifierToken[this.aTypes.length];
- this.scanner = var1;
- super.env = var1.env;
- super.token = var1.token;
- super.pos = var1.pos;
- this.actions = this;
- }
-
- public Parser(Scanner var1, ParserActions var2) throws IOException {
- this(var1);
- this.actions = var2;
- }
-
- public void packageDeclaration(int var1, IdentifierToken var2) {
- this.packageDeclaration(var1, var2.id);
- }
-
- protected void packageDeclaration(int var1, Identifier var2) {
- throw new RuntimeException("beginClass method is abstract");
- }
-
- public void importClass(int var1, IdentifierToken var2) {
- this.importClass(var1, var2.id);
- }
-
- protected void importClass(int var1, Identifier var2) {
- throw new RuntimeException("importClass method is abstract");
- }
-
- public void importPackage(int var1, IdentifierToken var2) {
- this.importPackage(var1, var2.id);
- }
-
- protected void importPackage(int var1, Identifier var2) {
- throw new RuntimeException("importPackage method is abstract");
- }
-
- public ClassDefinition beginClass(int var1, String var2, int var3, IdentifierToken var4, IdentifierToken var5, IdentifierToken[] var6) {
- Identifier var7 = var5 == null ? null : var5.id;
- Identifier[] var8 = null;
- if (var6 != null) {
- var8 = new Identifier[var6.length];
-
- for(int var9 = 0; var9 < var6.length; ++var9) {
- var8[var9] = var6[var9].id;
- }
- }
-
- this.beginClass(var1, var2, var3, var4.id, var7, var8);
- return this.getCurrentClass();
- }
-
- protected void beginClass(int var1, String var2, int var3, Identifier var4, Identifier var5, Identifier[] var6) {
- throw new RuntimeException("beginClass method is abstract");
- }
-
- protected ClassDefinition getCurrentClass() {
- return null;
- }
-
- public void endClass(int var1, ClassDefinition var2) {
- this.endClass(var1, var2.getName().getFlatName().getName());
- }
-
- protected void endClass(int var1, Identifier var2) {
- throw new RuntimeException("endClass method is abstract");
- }
-
- public void defineField(int var1, ClassDefinition var2, String var3, int var4, Type var5, IdentifierToken var6, IdentifierToken[] var7, IdentifierToken[] var8, Node var9) {
- Identifier[] var10 = null;
- Identifier[] var11 = null;
- if (var7 != null) {
- var10 = new Identifier[var7.length];
-
- for(int var12 = 0; var12 < var7.length; ++var12) {
- var10[var12] = var7[var12].id;
- }
- }
-
- if (var8 != null) {
- var11 = new Identifier[var8.length];
-
- for(int var13 = 0; var13 < var8.length; ++var13) {
- var11[var13] = var8[var13].id;
- }
- }
-
- this.defineField(var1, var3, var4, var5, var6.id, var10, var11, var9);
- }
-
- protected void defineField(int var1, String var2, int var3, Type var4, Identifier var5, Identifier[] var6, Identifier[] var7, Node var8) {
- throw new RuntimeException("defineField method is abstract");
- }
-
- protected final void addArgument(Node var1) {
- if (this.argIndex == this.args.length) {
- Node[] var2 = new Node[this.args.length * 2];
- System.arraycopy(this.args, 0, var2, 0, this.args.length);
- this.args = var2;
- }
-
- this.args[this.argIndex++] = var1;
- }
-
- protected final Expression[] exprArgs(int var1) {
- Expression[] var2 = new Expression[this.argIndex - var1];
- System.arraycopy(this.args, var1, var2, 0, this.argIndex - var1);
- this.argIndex = var1;
- return var2;
- }
-
- protected final Statement[] statArgs(int var1) {
- Statement[] var2 = new Statement[this.argIndex - var1];
- System.arraycopy(this.args, var1, var2, 0, this.argIndex - var1);
- this.argIndex = var1;
- return var2;
- }
-
- protected void expect(int var1) throws SyntaxError, IOException {
- if (super.token != var1) {
- switch (var1) {
- case 60:
- super.env.error(this.scanner.prevPos, "identifier.expected");
- break;
- default:
- super.env.error(this.scanner.prevPos, "token.expected", Constants.opNames[var1]);
- }
-
- throw new SyntaxError();
- } else {
- this.scan();
- }
- }
-
- protected Expression parseTypeExpression() throws SyntaxError, IOException {
- switch (super.token) {
- case 60:
- Object var1 = new IdentifierExpression(super.pos, this.scanner.idValue);
- this.scan();
-
- while(super.token == 46) {
- var1 = new FieldExpression(this.scan(), (Expression)var1, this.scanner.idValue);
- this.expect(60);
- }
-
- return (Expression)var1;
- case 70:
- return new TypeExpression(this.scan(), Type.tByte);
- case 71:
- return new TypeExpression(this.scan(), Type.tChar);
- case 72:
- return new TypeExpression(this.scan(), Type.tShort);
- case 73:
- return new TypeExpression(this.scan(), Type.tInt);
- case 74:
- return new TypeExpression(this.scan(), Type.tLong);
- case 75:
- return new TypeExpression(this.scan(), Type.tFloat);
- case 76:
- return new TypeExpression(this.scan(), Type.tDouble);
- case 77:
- return new TypeExpression(this.scan(), Type.tVoid);
- case 78:
- return new TypeExpression(this.scan(), Type.tBoolean);
- default:
- super.env.error(super.pos, "type.expected");
- throw new SyntaxError();
- }
- }
-
- protected Expression parseMethodExpression(Expression var1, Identifier var2) throws SyntaxError, IOException {
- int var3 = this.scan();
- int var4 = this.argIndex;
- if (super.token != 141) {
- this.addArgument(this.parseExpression());
-
- while(super.token == 0) {
- this.scan();
- this.addArgument(this.parseExpression());
- }
- }
-
- this.expect(141);
- return new MethodExpression(var3, var1, var2, this.exprArgs(var4));
- }
-
- protected Expression parseNewInstanceExpression(int var1, Expression var2, Expression var3) throws SyntaxError, IOException {
- int var4 = this.argIndex;
- this.expect(140);
- if (super.token != 141) {
- this.addArgument(this.parseExpression());
-
- while(super.token == 0) {
- this.scan();
- this.addArgument(this.parseExpression());
- }
- }
-
- this.expect(141);
- ClassDefinition var5 = null;
- if (super.token == 138 && !(var3 instanceof TypeExpression)) {
- int var6 = super.pos;
- super.env.innerClassesUsed(var1);
- Identifier var7 = FieldExpression.toIdentifier(var3);
- if (var7 == null) {
- super.env.error(((Node)var3).getWhere(), "type.expected");
- }
-
- Vector var8 = new Vector(1);
- Vector var9 = new Vector(0);
- var8.addElement(new IdentifierToken(Constants.idNull));
- if (super.token == 113 || super.token == 112) {
- super.env.error(super.pos, "anonymous.extends");
- this.parseInheritance(var8, var9);
- }
-
- var5 = this.parseClassBody(new IdentifierToken(var6, Constants.idNull), 196608, 56, (String)null, var8, var9, ((Node)var3).getWhere());
- }
-
- return var2 == null && var5 == null ? new NewInstanceExpression(var1, var3, this.exprArgs(var4)) : new NewInstanceExpression(var1, var3, this.exprArgs(var4), var2, var5);
- }
-
- protected Expression parseTerm() throws SyntaxError, IOException {
- switch (super.token) {
- case 29:
- int var17 = this.scan();
- switch (super.token) {
- case 65:
- int var29 = this.scanner.intValue;
- int var31 = this.scan();
- if (var29 < 0 && super.radix == 10) {
- super.env.error(var31, "overflow");
- }
-
- return new IntExpression(var31, var29);
- case 66:
- long var28 = this.scanner.longValue;
- int var32 = this.scan();
- if (var28 < 0L && super.radix == 10) {
- super.env.error(var32, "overflow");
- }
-
- return new LongExpression(var32, var28);
- case 67:
- float var27 = this.scanner.floatValue;
- return new FloatExpression(this.scan(), var27);
- case 68:
- double var26 = this.scanner.doubleValue;
- return new DoubleExpression(this.scan(), var26);
- default:
- return new PositiveExpression(var17, this.parseTerm());
- }
- case 30:
- int var16 = this.scan();
- switch (super.token) {
- case 65:
- int var25 = -this.scanner.intValue;
- return new IntExpression(this.scan(), var25);
- case 66:
- long var24 = -this.scanner.longValue;
- return new LongExpression(this.scan(), var24);
- case 67:
- float var23 = -this.scanner.floatValue;
- return new FloatExpression(this.scan(), var23);
- case 68:
- double var22 = -this.scanner.doubleValue;
- return new DoubleExpression(this.scan(), var22);
- default:
- return new NegativeExpression(var16, this.parseTerm());
- }
- case 37:
- return new NotExpression(this.scan(), this.parseTerm());
- case 38:
- return new BitNotExpression(this.scan(), this.parseTerm());
- case 49:
- int var15 = this.scan();
- int var21 = this.argIndex;
- if (super.token == 140) {
- this.scan();
- this.parseExpression();
- this.expect(141);
- super.env.error(var15, "not.supported", "new(...)");
- return new NullExpression(var15);
- } else {
- Expression var30 = this.parseTypeExpression();
- if (super.token == 142) {
- while(super.token == 142) {
- this.scan();
- this.addArgument(super.token != 143 ? this.parseExpression() : null);
- this.expect(143);
- }
-
- Expression[] var4 = this.exprArgs(var21);
- if (super.token == 138) {
- super.env.innerClassesUsed(var15);
- return new NewArrayExpression(var15, var30, var4, this.parseTerm());
- }
-
- return new NewArrayExpression(var15, var30, var4);
- }
-
- return this.parseNewInstanceExpression(var15, (Expression)null, var30);
- }
- case 50:
- return new PreIncExpression(this.scan(), this.parseTerm());
- case 51:
- return new PreDecExpression(this.scan(), this.parseTerm());
- case 60:
- Identifier var14 = this.scanner.idValue;
- int var20 = this.scan();
- if (super.token == 140) {
- return this.parseMethodExpression((Expression)null, var14);
- }
-
- return new IdentifierExpression(var20, var14);
- case 63:
- char var13 = this.scanner.charValue;
- return new CharExpression(this.scan(), var13);
- case 65:
- int var12 = this.scanner.intValue;
- int var19 = this.scan();
- if (var12 < 0 && super.radix == 10) {
- super.env.error(var19, "overflow");
- }
-
- return new IntExpression(var19, var12);
- case 66:
- long var11 = this.scanner.longValue;
- int var3 = this.scan();
- if (var11 < 0L && super.radix == 10) {
- super.env.error(var3, "overflow");
- }
-
- return new LongExpression(var3, var11);
- case 67:
- float var10 = this.scanner.floatValue;
- return new FloatExpression(this.scan(), var10);
- case 68:
- double var9 = this.scanner.doubleValue;
- return new DoubleExpression(this.scan(), var9);
- case 69:
- String var8 = this.scanner.stringValue;
- return new StringExpression(this.scan(), var8);
- case 70:
- case 71:
- case 72:
- case 73:
- case 74:
- case 75:
- case 76:
- case 77:
- case 78:
- return this.parseTypeExpression();
- case 80:
- return new BooleanExpression(this.scan(), true);
- case 81:
- return new BooleanExpression(this.scan(), false);
- case 82:
- ThisExpression var7 = new ThisExpression(this.scan());
- if (super.token == 140) {
- return this.parseMethodExpression(var7, Constants.idInit);
- }
-
- return var7;
- case 83:
- SuperExpression var6 = new SuperExpression(this.scan());
- if (super.token == 140) {
- return this.parseMethodExpression(var6, Constants.idInit);
- }
-
- return var6;
- case 84:
- return new NullExpression(this.scan());
- case 138:
- int var5 = this.scan();
- int var18 = this.argIndex;
- if (super.token != 139) {
- this.addArgument(this.parseExpression());
-
- while(super.token == 0) {
- this.scan();
- if (super.token == 139) {
- break;
- }
-
- this.addArgument(this.parseExpression());
- }
- }
-
- this.expect(139);
- return new ArrayExpression(var5, this.exprArgs(var18));
- case 140:
- int var1 = this.scan();
- Expression var2 = this.parseExpression();
- this.expect(141);
- if (((Node)var2).getOp() == 147) {
- return new CastExpression(var1, var2, this.parseTerm());
- } else {
- switch (super.token) {
- case 37:
- case 38:
- case 49:
- case 50:
- case 51:
- case 60:
- case 63:
- case 65:
- case 66:
- case 67:
- case 68:
- case 69:
- case 80:
- case 81:
- case 82:
- case 83:
- case 84:
- case 140:
- return new CastExpression(var1, var2, this.parseTerm());
- default:
- return new ExprExpression(var1, var2);
- }
- }
- default:
- super.env.error(this.scanner.prevPos, "missing.term");
- return new IntExpression(super.pos, 0);
- }
- }
-
- protected Expression parseExpression() throws SyntaxError, IOException {
- Expression var2;
- for(Expression var1 = this.parseTerm(); var1 != null; var1 = var2.order()) {
- var2 = this.parseBinaryExpression(var1);
- if (var2 == null) {
- return var1;
- }
- }
-
- return null;
- }
-
- protected Expression parseBinaryExpression(Expression var1) throws SyntaxError, IOException {
- if (var1 != null) {
- switch (super.token) {
- case 1:
- var1 = new AssignExpression(this.scan(), (Expression)var1, this.parseTerm());
- break;
- case 2:
- var1 = new AssignMultiplyExpression(this.scan(), (Expression)var1, this.parseTerm());
- break;
- case 3:
- var1 = new AssignDivideExpression(this.scan(), (Expression)var1, this.parseTerm());
- break;
- case 4:
- var1 = new AssignRemainderExpression(this.scan(), (Expression)var1, this.parseTerm());
- break;
- case 5:
- var1 = new AssignAddExpression(this.scan(), (Expression)var1, this.parseTerm());
- break;
- case 6:
- var1 = new AssignSubtractExpression(this.scan(), (Expression)var1, this.parseTerm());
- break;
- case 7:
- var1 = new AssignShiftLeftExpression(this.scan(), (Expression)var1, this.parseTerm());
- break;
- case 8:
- var1 = new AssignShiftRightExpression(this.scan(), (Expression)var1, this.parseTerm());
- break;
- case 9:
- var1 = new AssignUnsignedShiftRightExpression(this.scan(), (Expression)var1, this.parseTerm());
- break;
- case 10:
- var1 = new AssignBitAndExpression(this.scan(), (Expression)var1, this.parseTerm());
- break;
- case 11:
- var1 = new AssignBitOrExpression(this.scan(), (Expression)var1, this.parseTerm());
- break;
- case 12:
- var1 = new AssignBitXorExpression(this.scan(), (Expression)var1, this.parseTerm());
- break;
- case 14:
- var1 = new OrExpression(this.scan(), (Expression)var1, this.parseTerm());
- break;
- case 15:
- var1 = new AndExpression(this.scan(), (Expression)var1, this.parseTerm());
- break;
- case 16:
- var1 = new BitOrExpression(this.scan(), (Expression)var1, this.parseTerm());
- break;
- case 17:
- var1 = new BitXorExpression(this.scan(), (Expression)var1, this.parseTerm());
- break;
- case 18:
- var1 = new BitAndExpression(this.scan(), (Expression)var1, this.parseTerm());
- break;
- case 19:
- var1 = new NotEqualExpression(this.scan(), (Expression)var1, this.parseTerm());
- break;
- case 20:
- var1 = new EqualExpression(this.scan(), (Expression)var1, this.parseTerm());
- break;
- case 21:
- var1 = new GreaterOrEqualExpression(this.scan(), (Expression)var1, this.parseTerm());
- break;
- case 22:
- var1 = new GreaterExpression(this.scan(), (Expression)var1, this.parseTerm());
- break;
- case 23:
- var1 = new LessOrEqualExpression(this.scan(), (Expression)var1, this.parseTerm());
- break;
- case 24:
- var1 = new LessExpression(this.scan(), (Expression)var1, this.parseTerm());
- break;
- case 25:
- var1 = new InstanceOfExpression(this.scan(), (Expression)var1, this.parseTerm());
- break;
- case 26:
- var1 = new ShiftLeftExpression(this.scan(), (Expression)var1, this.parseTerm());
- break;
- case 27:
- var1 = new ShiftRightExpression(this.scan(), (Expression)var1, this.parseTerm());
- break;
- case 28:
- var1 = new UnsignedShiftRightExpression(this.scan(), (Expression)var1, this.parseTerm());
- break;
- case 29:
- var1 = new AddExpression(this.scan(), (Expression)var1, this.parseTerm());
- break;
- case 30:
- var1 = new SubtractExpression(this.scan(), (Expression)var1, this.parseTerm());
- break;
- case 31:
- var1 = new DivideExpression(this.scan(), (Expression)var1, this.parseTerm());
- break;
- case 32:
- var1 = new RemainderExpression(this.scan(), (Expression)var1, this.parseTerm());
- break;
- case 33:
- var1 = new MultiplyExpression(this.scan(), (Expression)var1, this.parseTerm());
- break;
- case 46:
- int var6 = this.scan();
- if (super.token == 82) {
- super.env.innerClassesUsed(var6);
- this.scan();
- var1 = new FieldExpression(var6, (Expression)var1, Constants.idThis);
- } else if (super.token == 49) {
- super.env.innerClassesUsed(var6);
- this.scan();
- if (super.token != 60) {
- this.expect(60);
- }
-
- var1 = this.parseNewInstanceExpression(var6, (Expression)var1, this.parseTypeExpression());
- } else if (super.token == 111) {
- super.env.innerClassesUsed(var6);
- this.scan();
- var1 = new FieldExpression(var6, (Expression)var1, Constants.idClass);
- } else if (super.token == 83) {
- super.env.innerClassesUsed(var6);
- SuperExpression var4 = new SuperExpression(this.scan(), (Expression)var1);
- if (super.token != 140) {
- this.expect(140);
- }
-
- var1 = this.parseMethodExpression(var4, Constants.idInit);
- } else {
- Identifier var8 = this.scanner.idValue;
- this.expect(60);
- if (super.token == 140) {
- var1 = this.parseMethodExpression((Expression)var1, var8);
- } else {
- var1 = new FieldExpression(var6, (Expression)var1, var8);
- }
- }
- break;
- case 50:
- var1 = new PostIncExpression(this.scan(), (Expression)var1);
- break;
- case 51:
- var1 = new PostDecExpression(this.scan(), (Expression)var1);
- break;
- case 137:
- int var5 = this.scan();
- Expression var7 = this.parseExpression();
- this.expect(136);
- var1 = new ConditionalExpression(var5, (Expression)var1, var7, this.parseExpression());
- break;
- case 142:
- int var2 = this.scan();
- Expression var3 = super.token != 143 ? this.parseExpression() : null;
- this.expect(143);
- var1 = new ArrayAccessExpression(var2, (Expression)var1, var3);
- break;
- default:
- return null;
- }
- }
-
- return (Expression)var1;
- }
-
- protected boolean recoverStatement() throws SyntaxError, IOException {
- while(true) {
- switch (super.token) {
- case -1:
- case 90:
- case 92:
- case 93:
- case 94:
- case 98:
- case 99:
- case 100:
- case 101:
- case 102:
- case 103:
- case 138:
- case 139:
- return true;
- case 77:
- case 111:
- case 114:
- case 120:
- case 121:
- case 124:
- case 125:
- case 126:
- this.expect(139);
- return false;
- case 140:
- this.match(140, 141);
- this.scan();
- break;
- case 142:
- this.match(142, 143);
- this.scan();
- break;
- default:
- this.scan();
- }
- }
- }
-
- protected Statement parseDeclaration(int var1, int var2, Expression var3) throws SyntaxError, IOException {
- int var4 = this.argIndex;
- if (super.token == 60) {
- this.addArgument(new VarDeclarationStatement(super.pos, this.parseExpression()));
-
- while(super.token == 0) {
- this.scan();
- this.addArgument(new VarDeclarationStatement(super.pos, this.parseExpression()));
- }
- }
-
- return new DeclarationStatement(var1, var2, var3, this.statArgs(var4));
- }
-
- protected void topLevelExpression(Expression var1) {
- switch (((Node)var1).getOp()) {
- case 1:
- case 2:
- case 3:
- case 4:
- case 5:
- case 6:
- case 7:
- case 8:
- case 9:
- case 10:
- case 11:
- case 12:
- case 39:
- case 40:
- case 42:
- case 44:
- case 45:
- case 47:
- return;
- default:
- super.env.error(((Node)var1).getWhere(), "invalid.expr");
- }
- }
-
- protected Statement parseStatement() throws SyntaxError, IOException {
- switch (super.token) {
- case 58:
- int var23 = this.scan();
- this.expect(60);
- this.expect(135);
- super.env.error(var23, "not.supported", "goto");
- return new CompoundStatement(var23, new Statement[0]);
- case 77:
- case 120:
- case 121:
- case 124:
- case 125:
- super.env.error(super.pos, "statement.expected");
- throw new SyntaxError();
- case 90:
- int var22 = this.scan();
- this.expect(140);
- Expression var35 = this.parseExpression();
- this.expect(141);
- Statement var41 = this.parseStatement();
- if (super.token == 91) {
- this.scan();
- return new IfStatement(var22, var35, var41, this.parseStatement());
- }
-
- return new IfStatement(var22, var35, var41, (Statement)null);
- case 91:
- super.env.error(this.scan(), "else.without.if");
- return this.parseStatement();
- case 92:
- int var21 = this.scan();
- Object var34 = null;
- Expression var40 = null;
- Object var46 = null;
- this.expect(140);
- if (super.token != 135) {
- int var47 = super.pos;
- int var49 = this.parseModifiers(16);
- if (var49 != 0) {
- super.env.innerClassesUsed(super.pos);
- }
-
- Object var51 = this.parseExpression();
- if (super.token == 60) {
- var34 = this.parseDeclaration(var47, var49, (Expression)var51);
- } else {
- if (var49 != 0) {
- this.expect(60);
- }
-
- this.topLevelExpression((Expression)var51);
-
- while(super.token == 0) {
- int var52 = this.scan();
- Expression var9 = this.parseExpression();
- this.topLevelExpression(var9);
- var51 = new CommaExpression(var52, (Expression)var51, var9);
- }
-
- var34 = new ExpressionStatement(var47, (Expression)var51);
- }
- }
-
- this.expect(135);
- if (super.token != 135) {
- var40 = this.parseExpression();
- }
-
- this.expect(135);
- if (super.token != 141) {
- var46 = this.parseExpression();
- this.topLevelExpression((Expression)var46);
-
- while(super.token == 0) {
- int var48 = this.scan();
- Expression var50 = this.parseExpression();
- this.topLevelExpression(var50);
- var46 = new CommaExpression(var48, (Expression)var46, var50);
- }
- }
-
- this.expect(141);
- return new ForStatement(var21, (Statement)var34, var40, (Expression)var46, this.parseStatement());
- case 93:
- int var20 = this.scan();
- this.expect(140);
- Expression var33 = this.parseExpression();
- this.expect(141);
- return new WhileStatement(var20, var33, this.parseStatement());
- case 94:
- int var19 = this.scan();
- Statement var32 = this.parseStatement();
- this.expect(93);
- this.expect(140);
- Expression var39 = this.parseExpression();
- this.expect(141);
- this.expect(135);
- return new DoStatement(var19, var32, var39);
- case 95:
- int var18 = this.scan();
- int var31 = this.argIndex;
- this.expect(140);
- Expression var38 = this.parseExpression();
- this.expect(141);
- this.expect(138);
-
- while(super.token != -1 && super.token != 139) {
- int var45 = this.argIndex;
-
- try {
- switch (super.token) {
- case 96:
- this.addArgument(new CaseStatement(this.scan(), this.parseExpression()));
- this.expect(136);
- break;
- case 97:
- this.addArgument(new CaseStatement(this.scan(), (Expression)null));
- this.expect(136);
- break;
- default:
- this.addArgument(this.parseStatement());
- }
- } catch (SyntaxError var10) {
- this.argIndex = var45;
- if (!this.recoverStatement()) {
- throw var10;
- }
- }
- }
-
- this.expect(139);
- return new SwitchStatement(var18, var38, this.statArgs(var31));
- case 96:
- super.env.error(super.pos, "case.without.switch");
-
- while(super.token == 96) {
- this.scan();
- this.parseExpression();
- this.expect(136);
- }
-
- return this.parseStatement();
- case 97:
- super.env.error(super.pos, "default.without.switch");
- this.scan();
- this.expect(136);
- return this.parseStatement();
- case 98:
- int var17 = this.scan();
- Identifier var30 = null;
- if (super.token == 60) {
- var30 = this.scanner.idValue;
- this.scan();
- }
-
- this.expect(135);
- return new BreakStatement(var17, var30);
- case 99:
- int var16 = this.scan();
- Identifier var29 = null;
- if (super.token == 60) {
- var29 = this.scanner.idValue;
- this.scan();
- }
-
- this.expect(135);
- return new ContinueStatement(var16, var29);
- case 100:
- int var15 = this.scan();
- Expression var28 = null;
- if (super.token != 135) {
- var28 = this.parseExpression();
- }
-
- this.expect(135);
- return new ReturnStatement(var15, var28);
- case 101:
- int var14 = this.scan();
- int var27 = this.argIndex;
- boolean var37 = false;
-
- Object var44;
- for(var44 = this.parseBlockStatement(); super.token == 102; var37 = true) {
- int var5 = super.pos;
- this.expect(102);
- this.expect(140);
- int var6 = this.parseModifiers(16);
- Expression var7 = this.parseExpression();
- IdentifierToken var8 = this.scanner.getIdToken();
- this.expect(60);
- var8.modifiers = var6;
- this.expect(141);
- this.addArgument(new CatchStatement(var5, var7, var8, this.parseBlockStatement()));
- }
-
- if (var37) {
- var44 = new TryStatement(var14, (Statement)var44, this.statArgs(var27));
- }
-
- if (super.token == 103) {
- this.scan();
- return new FinallyStatement(var14, (Statement)var44, this.parseBlockStatement());
- } else {
- if (var37) {
- return (Statement)var44;
- }
-
- super.env.error(super.pos, "try.without.catch.finally");
- return new TryStatement(var14, (Statement)var44, (Statement[])null);
- }
- case 102:
- super.env.error(super.pos, "catch.without.try");
-
- Statement var13;
- do {
- this.scan();
- this.expect(140);
- this.parseModifiers(16);
- this.parseExpression();
- this.expect(60);
- this.expect(141);
- var13 = this.parseBlockStatement();
- } while(super.token == 102);
-
- if (super.token == 103) {
- this.scan();
- var13 = this.parseBlockStatement();
- }
-
- return var13;
- case 103:
- super.env.error(super.pos, "finally.without.try");
- this.scan();
- return this.parseBlockStatement();
- case 104:
- int var12 = this.scan();
- Expression var26 = this.parseExpression();
- this.expect(135);
- return new ThrowStatement(var12, var26);
- case 111:
- case 114:
- return this.parseLocalClass(0);
- case 126:
- int var11 = this.scan();
- this.expect(140);
- Expression var25 = this.parseExpression();
- this.expect(141);
- return new SynchronizedStatement(var11, var25, this.parseBlockStatement());
- case 128:
- case 130:
- int var1 = super.pos;
- super.env.innerClassesUsed(super.pos);
- int var2 = this.parseModifiers(1040);
- switch (super.token) {
- case 60:
- case 70:
- case 71:
- case 72:
- case 73:
- case 74:
- case 75:
- case 76:
- case 78:
- if ((var2 & 1024) != 0) {
- var2 &= -1025;
- this.expect(111);
- }
-
- Expression var3 = this.parseExpression();
- if (super.token != 60) {
- this.expect(60);
- }
-
- Statement var4 = this.parseDeclaration(var1, var2, var3);
- this.expect(135);
- return var4;
- case 111:
- case 114:
- return this.parseLocalClass(var2);
- default:
- super.env.error(super.pos, "type.expected");
- throw new SyntaxError();
- }
- case 135:
- return new CompoundStatement(this.scan(), new Statement[0]);
- case 138:
- return this.parseBlockStatement();
- default:
- int var24 = super.pos;
- Expression var36 = this.parseExpression();
- if (super.token == 60) {
- Statement var43 = this.parseDeclaration(var24, 0, var36);
- this.expect(135);
- return var43;
- } else if (super.token == 136) {
- this.scan();
- Statement var42 = this.parseStatement();
- var42.setLabel(super.env, var36);
- return var42;
- } else {
- this.topLevelExpression(var36);
- this.expect(135);
- return new ExpressionStatement(var24, var36);
- }
- }
- }
-
- protected Statement parseBlockStatement() throws SyntaxError, IOException {
- if (super.token != 138) {
- super.env.error(this.scanner.prevPos, "token.expected", Constants.opNames[138]);
- return this.parseStatement();
- } else {
- int var1 = this.scan();
- int var2 = this.argIndex;
-
- while(super.token != -1 && super.token != 139) {
- int var3 = this.argIndex;
-
- try {
- this.addArgument(this.parseStatement());
- } catch (SyntaxError var5) {
- this.argIndex = var3;
- if (!this.recoverStatement()) {
- throw var5;
- }
- }
- }
-
- this.expect(139);
- return new CompoundStatement(var1, this.statArgs(var2));
- }
- }
-
- protected IdentifierToken parseName(boolean var1) throws SyntaxError, IOException {
- IdentifierToken var2 = this.scanner.getIdToken();
- this.expect(60);
- if (super.token != 46) {
- return var2;
- } else {
- StringBuffer var3;
- for(var3 = new StringBuffer(var2.id.toString()); super.token == 46; this.expect(60)) {
- this.scan();
- if (super.token == 33 && var1) {
- this.scan();
- var3.append(".*");
- break;
- }
-
- var3.append('.');
- if (super.token == 60) {
- var3.append(this.scanner.idValue);
- }
- }
-
- var2.id = Identifier.lookup(var3.toString());
- return var2;
- }
- }
-
- protected Identifier parseIdentifier(boolean var1) throws SyntaxError, IOException {
- return this.parseName(var1).id;
- }
-
- protected Type parseType() throws SyntaxError, IOException {
- Type var1;
- switch (super.token) {
- case 60:
- var1 = Type.tClass(this.parseName(false).id);
- break;
- case 70:
- this.scan();
- var1 = Type.tByte;
- break;
- case 71:
- this.scan();
- var1 = Type.tChar;
- break;
- case 72:
- this.scan();
- var1 = Type.tShort;
- break;
- case 73:
- this.scan();
- var1 = Type.tInt;
- break;
- case 74:
- this.scan();
- var1 = Type.tLong;
- break;
- case 75:
- this.scan();
- var1 = Type.tFloat;
- break;
- case 76:
- this.scan();
- var1 = Type.tDouble;
- break;
- case 77:
- this.scan();
- var1 = Type.tVoid;
- break;
- case 78:
- this.scan();
- var1 = Type.tBoolean;
- break;
- default:
- super.env.error(super.pos, "type.expected");
- throw new SyntaxError();
- }
-
- return this.parseArrayBrackets(var1);
- }
-
- protected Type parseArrayBrackets(Type var1) throws SyntaxError, IOException {
- while(super.token == 142) {
- this.scan();
- if (super.token != 143) {
- super.env.error(super.pos, "array.dim.in.decl");
- this.parseExpression();
- }
-
- this.expect(143);
- var1 = Type.tArray(var1);
- }
-
- return var1;
- }
-
- private void addArgument(int var1, Type var2, IdentifierToken var3) {
- var3.modifiers = var1;
- if (this.aCount >= this.aTypes.length) {
- Type[] var4 = new Type[this.aCount * 2];
- System.arraycopy(this.aTypes, 0, var4, 0, this.aCount);
- this.aTypes = var4;
- IdentifierToken[] var5 = new IdentifierToken[this.aCount * 2];
- System.arraycopy(this.aNames, 0, var5, 0, this.aCount);
- this.aNames = var5;
- }
-
- this.aTypes[this.aCount] = var2;
- this.aNames[this.aCount++] = var3;
- }
-
- protected int parseModifiers(int var1) throws IOException {
- int var2 = 0;
-
- while(true) {
- short var3 = 0;
- switch (super.token) {
- case 120:
- var3 = 2;
- break;
- case 121:
- var3 = 1;
- break;
- case 122:
- var3 = 4;
- case 123:
- default:
- break;
- case 124:
- var3 = 8;
- break;
- case 125:
- var3 = 128;
- break;
- case 126:
- var3 = 32;
- break;
- case 127:
- var3 = 256;
- break;
- case 128:
- var3 = 16;
- break;
- case 129:
- var3 = 64;
- break;
- case 130:
- var3 = 1024;
- }
-
- if ((var3 & var1) == 0) {
- return var2;
- }
-
- if ((var3 & var2) != 0) {
- super.env.error(super.pos, "repeated.modifier");
- }
-
- var2 |= var3;
- this.scan();
- }
- }
-
- protected void parseField() throws SyntaxError, IOException {
- if (super.token == 135) {
- this.scan();
- } else {
- String var1 = this.scanner.docComment;
- int var2 = super.pos;
- int var3 = this.parseModifiers(1535);
- if (var3 == (var3 & 8) && super.token == 138) {
- this.actions.defineField(var2, this.curClass, var1, var3, Type.tMethod(Type.tVoid), new IdentifierToken(Constants.idClassInit), (IdentifierToken[])null, (IdentifierToken[])null, this.parseStatement());
- } else if (super.token != 111 && super.token != 114) {
- var2 = super.pos;
- Type var4 = this.parseType();
- IdentifierToken var5 = null;
- switch (super.token) {
- case 60:
- var5 = this.scanner.getIdToken();
- var2 = this.scan();
- break;
- case 140:
- var5 = new IdentifierToken(Constants.idInit);
- break;
- default:
- this.expect(60);
- }
-
- if (super.token == 140) {
- this.scan();
- this.aCount = 0;
- if (super.token != 141) {
- int var14 = this.parseModifiers(16);
- Type var17 = this.parseType();
- IdentifierToken var8 = this.scanner.getIdToken();
- this.expect(60);
- var17 = this.parseArrayBrackets(var17);
- this.addArgument(var14, var17, var8);
-
- while(super.token == 0) {
- this.scan();
- var14 = this.parseModifiers(16);
- var17 = this.parseType();
- var8 = this.scanner.getIdToken();
- this.expect(60);
- var17 = this.parseArrayBrackets(var17);
- this.addArgument(var14, var17, var8);
- }
- }
-
- this.expect(141);
- var4 = this.parseArrayBrackets(var4);
- Type[] var16 = new Type[this.aCount];
- System.arraycopy(this.aTypes, 0, var16, 0, this.aCount);
- IdentifierToken[] var21 = new IdentifierToken[this.aCount];
- System.arraycopy(this.aNames, 0, var21, 0, this.aCount);
- var4 = Type.tMethod(var4, var16);
- IdentifierToken[] var23 = null;
- if (super.token == 144) {
- Vector var9 = new Vector();
- this.scan();
- var9.addElement(this.parseName(false));
-
- while(super.token == 0) {
- this.scan();
- var9.addElement(this.parseName(false));
- }
-
- var23 = new IdentifierToken[var9.size()];
- var9.copyInto(var23);
- }
-
- switch (super.token) {
- case 135:
- this.scan();
- this.actions.defineField(var2, this.curClass, var1, var3, var4, var5, var21, var23, (Node)null);
- return;
- case 138:
- this.actions.defineField(var2, this.curClass, var1, var3, var4, var5, var21, var23, this.parseStatement());
- return;
- default:
- if ((var3 & 1280) == 0) {
- this.expect(138);
- } else {
- this.expect(135);
- }
- }
- } else {
- while(true) {
- var2 = super.pos;
- Type var6 = this.parseArrayBrackets(var4);
- Expression var7 = null;
- if (super.token == 1) {
- this.scan();
- var7 = this.parseExpression();
- }
-
- this.actions.defineField(var2, this.curClass, var1, var3, var6, var5, (IdentifierToken[])null, (IdentifierToken[])null, var7);
- if (super.token != 0) {
- this.expect(135);
- return;
- }
-
- this.scan();
- var5 = this.scanner.getIdToken();
- this.expect(60);
- }
- }
- } else {
- super.env.innerClassesUsed(var2);
- this.parseNamedClass(var3, 111, var1);
- }
- }
- }
-
- protected void recoverField(ClassDefinition var1) throws SyntaxError, IOException {
- while(true) {
- switch (super.token) {
- case -1:
- case 70:
- case 71:
- case 72:
- case 73:
- case 74:
- case 75:
- case 76:
- case 77:
- case 78:
- case 120:
- case 121:
- case 124:
- case 125:
- case 126:
- case 128:
- return;
- case 110:
- case 111:
- case 114:
- case 115:
- case 139:
- this.actions.endClass(super.pos, var1);
- throw new SyntaxError();
- case 138:
- this.match(138, 139);
- this.scan();
- break;
- case 140:
- this.match(140, 141);
- this.scan();
- break;
- case 142:
- this.match(142, 143);
- this.scan();
- break;
- default:
- this.scan();
- }
- }
- }
-
- protected void parseClass() throws SyntaxError, IOException {
- String var1 = this.scanner.docComment;
- int var2 = this.parseModifiers(1599);
- this.parseNamedClass(var2, 115, var1);
- }
-
- protected Statement parseLocalClass(int var1) throws SyntaxError, IOException {
- int var2 = super.pos;
- super.env.innerClassesUsed(var2);
- ClassDefinition var3 = this.parseNamedClass(131072 | var1, 105, (String)null);
- Statement[] var4 = new Statement[]{new VarDeclarationStatement(var2, new LocalField(var3), (Expression)null)};
- TypeExpression var5 = new TypeExpression(var2, var3.getType());
- return new DeclarationStatement(var2, 0, var5, var4);
- }
-
- protected ClassDefinition parseNamedClass(int var1, int var2, String var3) throws SyntaxError, IOException {
- switch (super.token) {
- case 111:
- this.scan();
- break;
- case 114:
- this.scan();
- var1 |= 512;
- break;
- default:
- super.env.error(super.pos, "class.expected");
- }
-
- IdentifierToken var4 = this.scanner.getIdToken();
- int var5 = super.pos;
- this.expect(60);
- Vector var6 = new Vector();
- Vector var7 = new Vector();
- this.parseInheritance(var6, var7);
- return this.parseClassBody(var4, var1, var2, var3, var6, var7, var5);
- }
-
- protected void parseInheritance(Vector var1, Vector var2) throws SyntaxError, IOException {
- if (super.token == 112) {
- this.scan();
- var1.addElement(this.parseName(false));
-
- while(super.token == 0) {
- this.scan();
- var1.addElement(this.parseName(false));
- }
- }
-
- if (super.token == 113) {
- this.scan();
- var2.addElement(this.parseName(false));
-
- while(super.token == 0) {
- this.scan();
- var2.addElement(this.parseName(false));
- }
- }
-
- }
-
- protected ClassDefinition parseClassBody(IdentifierToken var1, int var2, int var3, String var4, Vector var5, Vector var6, int var7) throws SyntaxError, IOException {
- IdentifierToken var8 = null;
- if ((var2 & 512) != 0) {
- if (var6.size() > 0) {
- super.env.error(((IdentifierToken)var6.elementAt(0)).getWhere(), "intf.impl.intf");
- }
-
- var6 = var5;
- } else if (var5.size() > 0) {
- if (var5.size() > 1) {
- super.env.error(((IdentifierToken)var5.elementAt(1)).getWhere(), "multiple.inherit");
- }
-
- var8 = (IdentifierToken)var5.elementAt(0);
- }
-
- ClassDefinition var9 = this.curClass;
- IdentifierToken[] var10 = new IdentifierToken[var6.size()];
- var6.copyInto(var10);
- ClassDefinition var11 = this.actions.beginClass(var7, var4, var2, var1, var8, var10);
- this.expect(138);
-
- while(super.token != -1 && super.token != 139) {
- try {
- this.curClass = var11;
- this.parseField();
- } catch (SyntaxError var16) {
- this.recoverField(var11);
- } finally {
- this.curClass = var9;
- }
- }
-
- this.expect(139);
- this.actions.endClass(this.scanner.prevPos, var11);
- return var11;
- }
-
- protected void recoverFile() throws IOException {
- while(true) {
- switch (super.token) {
- case -1:
- return;
- case 111:
- case 114:
- return;
- case 138:
- this.match(138, 139);
- this.scan();
- break;
- case 140:
- this.match(140, 141);
- this.scan();
- break;
- case 142:
- this.match(142, 143);
- this.scan();
- break;
- default:
- this.scan();
- }
- }
- }
-
- public void parseFile() {
- try {
- try {
- if (super.token == 115) {
- int var1 = this.scan();
- IdentifierToken var2 = this.parseName(false);
- this.expect(135);
- this.actions.packageDeclaration(var1, var2);
- }
- } catch (SyntaxError var5) {
- this.recoverFile();
- }
-
- while(super.token == 110) {
- try {
- int var7 = this.scan();
- IdentifierToken var8 = this.parseName(true);
- this.expect(135);
- if (var8.id.getName().equals(Constants.idStar)) {
- var8.id = var8.id.getQualifier();
- this.actions.importPackage(var7, var8);
- } else {
- this.actions.importClass(var7, var8);
- }
- } catch (SyntaxError var4) {
- this.recoverFile();
- }
- }
-
- while(super.token != -1) {
- try {
- switch (super.token) {
- case -1:
- return;
- case 111:
- case 114:
- case 120:
- case 121:
- case 128:
- case 130:
- this.parseClass();
- break;
- case 135:
- this.scan();
- break;
- default:
- super.env.error(super.pos, "toplevel.expected");
- throw new SyntaxError();
- }
- } catch (SyntaxError var3) {
- this.recoverFile();
- }
- }
-
- } catch (IOException var6) {
- super.env.error(super.pos, "io.exception", super.env.getSource());
- }
- }
-
- public int scan() throws IOException {
- if (this.scanner != this && this.scanner != null) {
- int var1 = this.scanner.scan();
- super.token = this.scanner.token;
- super.pos = this.scanner.pos;
- return var1;
- } else {
- return super.scan();
- }
- }
-
- public void match(int var1, int var2) throws IOException {
- if (this.scanner != this) {
- this.scanner.match(var1, var2);
- super.token = this.scanner.token;
- super.pos = this.scanner.pos;
- } else {
- super.match(var1, var2);
- }
- }
- }
-