Optimizes expression parsing. Can now parse phobos

This commit is contained in:
Hackerpilot 2013-07-11 01:23:40 -07:00
parent 9e63e396a4
commit e91316cc9a
2 changed files with 420 additions and 285 deletions

View File

@ -84,7 +84,6 @@ abstract class ASTVisitor
/** */ void visit(DebugSpecification debugSpecification) { debugSpecification.accept(this); } /** */ void visit(DebugSpecification debugSpecification) { debugSpecification.accept(this); }
/** */ void visit(Declaration declaration) { declaration.accept(this); } /** */ void visit(Declaration declaration) { declaration.accept(this); }
/** */ void visit(DeclarationsAndStatements declarationsAndStatements) { declarationsAndStatements.accept(this); } /** */ void visit(DeclarationsAndStatements declarationsAndStatements) { declarationsAndStatements.accept(this); }
/** */ void visit(DeclarationOrInvariant declarationOrInvariant) { declarationOrInvariant.accept(this); }
/** */ void visit(Declarator declarator) { declarator.accept(this); } /** */ void visit(Declarator declarator) { declarator.accept(this); }
/** */ void visit(DefaultStatement defaultStatement) { defaultStatement.accept(this); } /** */ void visit(DefaultStatement defaultStatement) { defaultStatement.accept(this); }
/** */ void visit(DeleteExpression deleteExpression) { deleteExpression.accept(this); } /** */ void visit(DeleteExpression deleteExpression) { deleteExpression.accept(this); }
@ -232,20 +231,21 @@ interface ASTNode
immutable string DEFAULT_ACCEPT = q{void accept(ASTVisitor visitor) {}}; immutable string DEFAULT_ACCEPT = q{void accept(ASTVisitor visitor) {}};
immutable string SHIFT_SHIFT_BODY = q{ abstract class ExpressionNode : ASTNode {}
/** */ Token operator;
/** */ ShiftExpression left; mixin template BinaryExpressionBody()
/** */ ShiftExpression right; {
}; ExpressionNode left;
ExpressionNode right;
}
/// ///
class AddExpression : ASTNode class AddExpression : ExpressionNode
{ {
public: public:
mixin(DEFAULT_ACCEPT); mixin(DEFAULT_ACCEPT);
/** */ TokenType operator; /** */ TokenType operator;
/** */ AddExpression left; mixin BinaryExpressionBody;
/** */ MulExpression right;
} }
/// ///
@ -284,21 +284,19 @@ public:
} }
/// ///
class AndAndExpression : ASTNode class AndAndExpression : ExpressionNode
{ {
public: public:
mixin(DEFAULT_ACCEPT); mixin(DEFAULT_ACCEPT);
/** */ AndAndExpression left; mixin BinaryExpressionBody;
/** */ OrExpression right;
} }
/// ///
class AndExpression : ASTNode class AndExpression : ExpressionNode
{ {
public: public:
mixin(DEFAULT_ACCEPT); mixin(DEFAULT_ACCEPT);
/** */ AndExpression left; mixin BinaryExpressionBody;
/** */ CmpExpression right;
} }
/// ///
@ -343,22 +341,20 @@ public:
} }
/// ///
class AsmAddExp : ASTNode class AsmAddExp : ExpressionNode
{ {
public: public:
mixin(DEFAULT_ACCEPT); mixin(DEFAULT_ACCEPT);
/** */ TokenType operator; /** */ TokenType operator;
/** */ AsmAddExp left; mixin BinaryExpressionBody;
/** */ AsmMulExp right;
} }
/// ///
class AsmAndExp : ASTNode class AsmAndExp : ExpressionNode
{ {
public: public:
mixin(DEFAULT_ACCEPT); mixin(DEFAULT_ACCEPT);
/** */ AsmEqualExp left; mixin BinaryExpressionBody;
/** */ AsmEqualExp right;
} }
/// ///
@ -372,12 +368,11 @@ public:
} }
/// ///
class AsmEqualExp : ASTNode class AsmEqualExp : ExpressionNode
{ {
public: public:
mixin(DEFAULT_ACCEPT); mixin(DEFAULT_ACCEPT);
/** */ AsmRelExp left; mixin BinaryExpressionBody;
/** */ AsmRelExp right;
/** */ Token operator; /** */ Token operator;
} }
@ -403,41 +398,37 @@ public:
} }
/// ///
class AsmLogAndExp : ASTNode class AsmLogAndExp : ExpressionNode
{ {
public: public:
mixin(DEFAULT_ACCEPT); mixin(DEFAULT_ACCEPT);
/** */ AsmOrExp left; mixin BinaryExpressionBody;
/** */ AsmOrExp right;
} }
/// ///
class AsmLogOrExp : ASTNode class AsmLogOrExp : ExpressionNode
{ {
public: public:
mixin(DEFAULT_ACCEPT); mixin(DEFAULT_ACCEPT);
/** */ AsmLogAndExp left; mixin BinaryExpressionBody;
/** */ AsmLogAndExp right;
} }
/// ///
class AsmMulExp : ASTNode class AsmMulExp : ExpressionNode
{ {
public: public:
mixin(DEFAULT_ACCEPT); mixin(DEFAULT_ACCEPT);
/** */ TokenType operator; /** */ TokenType operator;
/** */ AsmMulExp left; mixin BinaryExpressionBody;
/** */ AsmBrExp right;
} }
/// ///
class AsmOrExp : ASTNode class AsmOrExp : ExpressionNode
{ {
public: public:
mixin(DEFAULT_ACCEPT); mixin(DEFAULT_ACCEPT);
/** */ AsmXorExp left; mixin BinaryExpressionBody;
/** */ AsmXorExp right;
} }
/// ///
@ -451,22 +442,20 @@ public:
} }
/// ///
class AsmRelExp : ASTNode class AsmRelExp : ExpressionNode
{ {
public: public:
mixin(DEFAULT_ACCEPT); mixin(DEFAULT_ACCEPT);
/** */ AsmShiftExp left; mixin BinaryExpressionBody;
/** */ AsmShiftExp right;
/** */ Token operator; /** */ Token operator;
} }
/// ///
class AsmShiftExp : ASTNode class AsmShiftExp : ExpressionNode
{ {
public: public:
mixin(DEFAULT_ACCEPT); mixin(DEFAULT_ACCEPT);
/** */ AsmAddExp left; mixin BinaryExpressionBody;
/** */ AsmAddExp right;
/** */ Token operator; /** */ Token operator;
} }
@ -504,12 +493,11 @@ class AsmXorExp : ASTNode
{ {
public: public:
mixin(DEFAULT_ACCEPT); mixin(DEFAULT_ACCEPT);
/** */ AsmAndExp left; mixin BinaryExpressionBody;
/** */ AsmAndExp right;
} }
/// ///
class AssertExpression : ASTNode class AssertExpression : ExpressionNode
{ {
public: public:
mixin(DEFAULT_ACCEPT); mixin(DEFAULT_ACCEPT);
@ -518,12 +506,12 @@ public:
} }
/// ///
class AssignExpression : ASTNode class AssignExpression : ExpressionNode
{ {
public: public:
mixin(DEFAULT_ACCEPT); mixin(DEFAULT_ACCEPT);
/** */ TernaryExpression ternaryExpression; /** */ ExpressionNode ternaryExpression;
/** */ AssignExpression assignExpression; /** */ ExpressionNode assignExpression;
/** */ TokenType operator; /** */ TokenType operator;
} }
@ -670,7 +658,7 @@ public:
mixin(DEFAULT_ACCEPT); mixin(DEFAULT_ACCEPT);
/** */ Type type; /** */ Type type;
/** */ Token identifier; /** */ Token identifier;
/** */ StatementNoCaseNoDefault statementNoCaseNoDefault; /** */ DeclarationOrStatement declarationOrStatement;
} }
/// ///
@ -686,15 +674,15 @@ public:
} }
/// ///
class CmpExpression : ASTNode class CmpExpression : ExpressionNode
{ {
public: public:
mixin(DEFAULT_ACCEPT); mixin(DEFAULT_ACCEPT);
/** */ ShiftExpression shiftExpression; /** */ ExpressionNode shiftExpression;
/** */ EqualExpression equalExpression; /** */ ExpressionNode equalExpression;
/** */ IdentityExpression identityExpression; /** */ ExpressionNode identityExpression;
/** */ RelExpression relExpression; /** */ ExpressionNode relExpression;
/** */ InExpression inExpression; /** */ ExpressionNode inExpression;
} }
/// ///
@ -723,8 +711,8 @@ class ConditionalStatement : ASTNode
public: public:
mixin(DEFAULT_ACCEPT); mixin(DEFAULT_ACCEPT);
/** */ CompileCondition compileCondition; /** */ CompileCondition compileCondition;
/** */ StatementNoCaseNoDefault trueStatement; /** */ DeclarationOrStatement trueStatement;
/** */ StatementNoCaseNoDefault falseStatement; /** */ DeclarationOrStatement falseStatement;
} }
/// ///
@ -844,21 +832,13 @@ class DeclarationsAndStatements : ASTNode
/** */ DeclarationOrStatement[] declarationsAndStatements; /** */ DeclarationOrStatement[] declarationsAndStatements;
} }
///
class DeclarationOrInvariant : ASTNode
{
mixin(DEFAULT_ACCEPT);
/** */ Declaration declaration;
/** */ Invariant invariant_;
}
/// ///
class DeclarationOrStatement : ASTNode class DeclarationOrStatement : ASTNode
{ {
public: public:
mixin(DEFAULT_ACCEPT); mixin(DEFAULT_ACCEPT);
/** */ Declaration declaration; /** */ Declaration declaration;
/** */ StatementNoCaseNoDefault statement; /** */ Statement statement;
} }
/// ///
@ -879,7 +859,7 @@ public:
} }
/// ///
class DeleteExpression : ASTNode class DeleteExpression : ExpressionNode
{ {
public: public:
mixin(DEFAULT_ACCEPT); mixin(DEFAULT_ACCEPT);
@ -948,17 +928,16 @@ public:
} }
/// ///
class EqualExpression : ASTNode class EqualExpression : ExpressionNode
{ {
public: public:
mixin(DEFAULT_ACCEPT); mixin(DEFAULT_ACCEPT);
/** */ TokenType operator; /** */ TokenType operator;
/** */ ShiftExpression left; mixin BinaryExpressionBody;
/** */ ShiftExpression right;
} }
/// ///
class Expression : ASTNode class Expression : ExpressionNode
{ {
public: public:
mixin(DEFAULT_ACCEPT); mixin(DEFAULT_ACCEPT);
@ -986,7 +965,7 @@ class Finally : ASTNode
{ {
public: public:
mixin(DEFAULT_ACCEPT); mixin(DEFAULT_ACCEPT);
/** */ StatementNoCaseNoDefault statementNoCaseNoDefault; /** */ DeclarationOrStatement declarationOrStatement;
} }
/// ///
@ -995,7 +974,7 @@ class ForStatement : ASTNode
public: public:
mixin(DEFAULT_ACCEPT); mixin(DEFAULT_ACCEPT);
/** */ DeclarationOrStatement declarationOrStatement; /** */ DeclarationOrStatement declarationOrStatement;
/** */ Expression test; /** */ ExpressionStatement test;
/** */ Expression increment; /** */ Expression increment;
/** */ StatementNoCaseNoDefault statementNoCaseNoDefault; /** */ StatementNoCaseNoDefault statementNoCaseNoDefault;
} }
@ -1051,7 +1030,7 @@ public:
} }
/// ///
class FunctionCallExpression : ASTNode class FunctionCallExpression : ExpressionNode
{ {
public: public:
mixin(DEFAULT_ACCEPT); mixin(DEFAULT_ACCEPT);
@ -1085,7 +1064,7 @@ public:
} }
/// ///
class FunctionLiteralExpression : ASTNode class FunctionLiteralExpression : ExpressionNode
{ {
public: public:
mixin(DEFAULT_ACCEPT); mixin(DEFAULT_ACCEPT);
@ -1139,13 +1118,12 @@ public:
} }
/// ///
class IdentityExpression : ASTNode class IdentityExpression : ExpressionNode
{ {
public: public:
mixin(DEFAULT_ACCEPT); mixin(DEFAULT_ACCEPT);
/** */ bool negated; /** */ bool negated;
/** */ ShiftExpression left; mixin BinaryExpressionBody;
/** */ ShiftExpression right;
} }
/// ///
@ -1153,9 +1131,11 @@ class IfStatement : ASTNode
{ {
public: public:
mixin(DEFAULT_ACCEPT); mixin(DEFAULT_ACCEPT);
/** */ Token identifier;
/** */ Type type;
/** */ Expression expression; /** */ Expression expression;
/** */ StatementNoCaseNoDefault thenStatement; /** */ DeclarationOrStatement thenStatement;
/** */ StatementNoCaseNoDefault elseStatement; /** */ DeclarationOrStatement elseStatement;
} }
/// ///
@ -1187,7 +1167,7 @@ public:
} }
/// ///
class ImportExpression : ASTNode class ImportExpression : ExpressionNode
{ {
public: public:
mixin(DEFAULT_ACCEPT); mixin(DEFAULT_ACCEPT);
@ -1205,7 +1185,7 @@ public:
} }
/// ///
class IndexExpression : ASTNode class IndexExpression : ExpressionNode
{ {
public: public:
mixin(DEFAULT_ACCEPT); mixin(DEFAULT_ACCEPT);
@ -1214,11 +1194,12 @@ public:
} }
/// ///
class InExpression : ASTNode class InExpression : ExpressionNode
{ {
public: public:
mixin(DEFAULT_ACCEPT); mixin(DEFAULT_ACCEPT);
mixin(SHIFT_SHIFT_BODY); /** */ Token operator;
mixin BinaryExpressionBody;
} }
/// ///
@ -1266,7 +1247,7 @@ public:
} }
/// ///
class IsExpression : ASTNode class IsExpression : ExpressionNode
{ {
public: public:
mixin(DEFAULT_ACCEPT); mixin(DEFAULT_ACCEPT);
@ -1301,11 +1282,11 @@ class LabeledStatement : ASTNode
public: public:
mixin(DEFAULT_ACCEPT); mixin(DEFAULT_ACCEPT);
Token identifier; Token identifier;
/** */ Statement statement; /** */ DeclarationOrStatement declarationOrStatement;
} }
/// ///
class LambdaExpression : ASTNode class LambdaExpression : ExpressionNode
{ {
public: public:
mixin(DEFAULT_ACCEPT); mixin(DEFAULT_ACCEPT);
@ -1351,7 +1332,7 @@ public:
} }
/// ///
class MixinExpression : ASTNode class MixinExpression : ExpressionNode
{ {
public: public:
mixin(DEFAULT_ACCEPT); mixin(DEFAULT_ACCEPT);
@ -1401,17 +1382,16 @@ public:
/// ///
class MulExpression : ASTNode class MulExpression : ExpressionNode
{ {
public: public:
mixin(DEFAULT_ACCEPT); mixin(DEFAULT_ACCEPT);
/** */ TokenType operator; /** */ TokenType operator;
/** */ MulExpression left; mixin BinaryExpressionBody;
/** */ UnaryExpression right;
} }
/// ///
class NewAnonClassExpression : ASTNode class NewAnonClassExpression : ExpressionNode
{ {
public: public:
mixin(DEFAULT_ACCEPT); mixin(DEFAULT_ACCEPT);
@ -1422,7 +1402,7 @@ public:
} }
/// ///
class NewExpression : ASTNode class NewExpression : ExpressionNode
{ {
public: public:
mixin(DEFAULT_ACCEPT); mixin(DEFAULT_ACCEPT);
@ -1493,21 +1473,19 @@ public:
} }
/// ///
class OrExpression : ASTNode class OrExpression : ExpressionNode
{ {
public: public:
mixin(DEFAULT_ACCEPT); mixin(DEFAULT_ACCEPT);
/** */ OrExpression left; mixin BinaryExpressionBody;
/** */ XorExpression right;
} }
/// ///
class OrOrExpression : ASTNode class OrOrExpression : ExpressionNode
{ {
public: public:
mixin(DEFAULT_ACCEPT); mixin(DEFAULT_ACCEPT);
/** */ OrOrExpression left; mixin BinaryExpressionBody;
/** */ AndAndExpression right;
} }
/// ///
@ -1549,7 +1527,7 @@ public:
} }
/// ///
class PostIncDecExpression : ASTNode class PostIncDecExpression : ExpressionNode
{ {
public: public:
mixin(DEFAULT_ACCEPT); mixin(DEFAULT_ACCEPT);
@ -1558,12 +1536,11 @@ public:
} }
/// ///
class PowExpression : ASTNode class PowExpression : ExpressionNode
{ {
public: public:
mixin(DEFAULT_ACCEPT); mixin(DEFAULT_ACCEPT);
/** */ PowExpression left; mixin BinaryExpressionBody;
/** */ UnaryExpression right;
} }
/// ///
@ -1575,7 +1552,7 @@ public:
} }
/// ///
class PragmaExpression : ASTNode class PragmaExpression : ExpressionNode
{ {
public: public:
mixin(DEFAULT_ACCEPT); mixin(DEFAULT_ACCEPT);
@ -1584,7 +1561,7 @@ public:
} }
/// ///
class PreIncDecExpression : ASTNode class PreIncDecExpression : ExpressionNode
{ {
public: public:
mixin(DEFAULT_ACCEPT); mixin(DEFAULT_ACCEPT);
@ -1593,7 +1570,7 @@ public:
} }
/// ///
class PrimaryExpression : ASTNode class PrimaryExpression : ExpressionNode
{ {
public: public:
mixin(DEFAULT_ACCEPT); mixin(DEFAULT_ACCEPT);
@ -1626,13 +1603,12 @@ public:
} }
/// ///
class RelExpression : ASTNode class RelExpression : ExpressionNode
{ {
public: public:
mixin(DEFAULT_ACCEPT); mixin(DEFAULT_ACCEPT);
/** */ TokenType operator; /** */ TokenType operator;
/** */ RelExpression left; mixin BinaryExpressionBody;
/** */ ShiftExpression right;
} }
/// ///
@ -1669,13 +1645,12 @@ public:
} }
/// ///
class ShiftExpression : ASTNode class ShiftExpression : ExpressionNode
{ {
public: public:
mixin(DEFAULT_ACCEPT); mixin(DEFAULT_ACCEPT);
/** */ TokenType operator; /** */ TokenType operator;
/** */ ShiftExpression left; mixin BinaryExpressionBody;
/** */ AddExpression right;
} }
/// ///
@ -1688,7 +1663,7 @@ public:
} }
/// ///
class SliceExpression : ASTNode class SliceExpression : ExpressionNode
{ {
public: public:
mixin(DEFAULT_ACCEPT); mixin(DEFAULT_ACCEPT);
@ -1900,7 +1875,7 @@ public:
} }
/// ///
class TemplateMixinExpression : ASTNode class TemplateMixinExpression : ExpressionNode
{ {
public: public:
mixin(DEFAULT_ACCEPT); mixin(DEFAULT_ACCEPT);
@ -1992,13 +1967,13 @@ public:
} }
/// ///
class TernaryExpression : ASTNode class TernaryExpression : ExpressionNode
{ {
public: public:
mixin(DEFAULT_ACCEPT); mixin(DEFAULT_ACCEPT);
/** */ OrOrExpression orOrExpression; /** */ ExpressionNode orOrExpression;
/** */ Expression expression; /** */ ExpressionNode expression;
/** */ TernaryExpression ternaryExpression; /** */ ExpressionNode ternaryExpression;
} }
/// ///
@ -2010,7 +1985,7 @@ public:
} }
/// ///
class TraitsExpression : ASTNode class TraitsExpression : ExpressionNode
{ {
public: public:
mixin(DEFAULT_ACCEPT); mixin(DEFAULT_ACCEPT);
@ -2023,7 +1998,7 @@ class TryStatement : ASTNode
{ {
public: public:
mixin(DEFAULT_ACCEPT); mixin(DEFAULT_ACCEPT);
/** */ StatementNoCaseNoDefault statementNoCaseNoDefault; /** */ DeclarationOrStatement declarationOrStatement;
/** */ Catches catches; /** */ Catches catches;
/** */ Finally finally_; /** */ Finally finally_;
} }
@ -2076,7 +2051,7 @@ public:
} }
/// ///
class TypeidExpression : ASTNode class TypeidExpression : ExpressionNode
{ {
public: public:
mixin(DEFAULT_ACCEPT); mixin(DEFAULT_ACCEPT);
@ -2085,7 +2060,7 @@ public:
} }
/// ///
class TypeofExpression : ASTNode class TypeofExpression : ExpressionNode
{ {
public: public:
mixin(DEFAULT_ACCEPT); mixin(DEFAULT_ACCEPT);
@ -2094,10 +2069,11 @@ public:
} }
/// ///
class UnaryExpression : ASTNode class UnaryExpression : ExpressionNode
{ {
public: public:
mixin(DEFAULT_ACCEPT); mixin(DEFAULT_ACCEPT);
/** */ Type type;
/** */ PrimaryExpression primaryExpression; /** */ PrimaryExpression primaryExpression;
/** */ Token prefix; /** */ Token prefix;
/** */ Token suffix; /** */ Token suffix;
@ -2186,10 +2162,9 @@ public:
} }
/// ///
class XorExpression : ASTNode class XorExpression : ExpressionNode
{ {
public: public:
mixin(DEFAULT_ACCEPT); mixin(DEFAULT_ACCEPT);
/** */ XorExpression left; mixin BinaryExpressionBody;
/** */ AndExpression right;
} }

File diff suppressed because it is too large Load Diff