Some parser fixes for DCD

This commit is contained in:
Hackerpilot 2013-08-16 23:48:51 +00:00
parent 2cc5152a68
commit 270cd6d9a1
5 changed files with 30 additions and 19 deletions

View file

@ -489,7 +489,7 @@ class XMLPrinter : ASTVisitor
override void visit(ForeachStatement foreachStatement) override void visit(ForeachStatement foreachStatement)
{ {
output.writeln("<foreachStatement type=\"", getTokenValue( output.writeln("<foreachStatement type=\"", getTokenValue(
foreachStatement.foreachType), "\">"); foreachStatement.type), "\">");
output.writeln("</foreachStatement>"); output.writeln("</foreachStatement>");
} }

2
main.d
View file

@ -123,7 +123,7 @@ int main(string[] args)
} }
else if (tokenCount) else if (tokenCount)
{ {
printTokenCount(stdout, tokens, to!size_t(f.size)); printTokenCount(stdout, tokens);
} }
else if (syntaxCheck) else if (syntaxCheck)
{ {

11
stats.d
View file

@ -6,6 +6,7 @@
module stats; module stats;
import std.stdio; import std.stdio;
import std.algorithm;
import stdx.d.lexer; import stdx.d.lexer;
pure nothrow bool isLineOfCode(TokenType t) pure nothrow bool isLineOfCode(TokenType t)
@ -29,15 +30,9 @@ pure nothrow bool isLineOfCode(TokenType t)
} }
} }
void printTokenCount(Tokens)(File output, ref Tokens tokens, size_t fileSize) void printTokenCount(Tokens)(File output, ref Tokens tokens)
{ {
ulong count; output.writefln("%d", tokens.count!(a => true));
while(!tokens.empty)
{
tokens.popFront();
++count;
}
output.writefln("%d", count);
} }
void printLineCount(Tokens)(File output, ref Tokens tokens) void printLineCount(Tokens)(File output, ref Tokens tokens)

View file

@ -1194,6 +1194,7 @@ public:
/** */ ExpressionStatement test; /** */ ExpressionStatement test;
/** */ Expression increment; /** */ Expression increment;
/** */ StatementNoCaseNoDefault statementNoCaseNoDefault; /** */ StatementNoCaseNoDefault statementNoCaseNoDefault;
/** */ size_t startIndex;
} }
/// ///
@ -1202,14 +1203,16 @@ class ForeachStatement : ASTNode
public: public:
override void accept(ASTVisitor visitor) override void accept(ASTVisitor visitor)
{ {
mixin (visitIfNotNull!(foreachTypeList, low, high, mixin (visitIfNotNull!(foreachType, foreachTypeList, low, high,
statementNoCaseNoDefault)); statementNoCaseNoDefault));
} }
/** */ TokenType foreachType; /** */ TokenType type;
/** */ ForeachTypeList foreachTypeList; /** */ ForeachTypeList foreachTypeList;
/** */ ForeachType foreachType;
/** */ Expression low; /** */ Expression low;
/** */ Expression high; /** */ Expression high;
/** */ StatementNoCaseNoDefault statementNoCaseNoDefault; /** */ StatementNoCaseNoDefault statementNoCaseNoDefault;
/** */ size_t startIndex;
} }
/// ///
@ -1429,6 +1432,7 @@ public:
/** */ Expression expression; /** */ Expression expression;
/** */ DeclarationOrStatement thenStatement; /** */ DeclarationOrStatement thenStatement;
/** */ DeclarationOrStatement elseStatement; /** */ DeclarationOrStatement elseStatement;
/** */ size_t startIndex;
} }
/// ///
@ -2852,6 +2856,7 @@ public:
/** */ Expression expression; /** */ Expression expression;
/** */ StatementNoCaseNoDefault statementNoCaseNoDefault; /** */ StatementNoCaseNoDefault statementNoCaseNoDefault;
/** */ size_t startIndex;
} }
/// ///

View file

@ -2142,6 +2142,7 @@ class ClassFour(A, B) if (someTest()) : Super {}}c;
mixin(traceEnterAndExit!(__FUNCTION__)); mixin(traceEnterAndExit!(__FUNCTION__));
auto node = new ForStatement; auto node = new ForStatement;
if (expect(TokenType.for_) is null) return null; if (expect(TokenType.for_) is null) return null;
node.startIndex = current().startIndex;
if (expect(TokenType.lParen) is null) return null; if (expect(TokenType.lParen) is null) return null;
if (currentIs(TokenType.semicolon)) if (currentIs(TokenType.semicolon))
@ -2174,17 +2175,19 @@ class ClassFour(A, B) if (someTest()) : Super {}}c;
ForeachStatement parseForeachStatement() ForeachStatement parseForeachStatement()
{ {
mixin(traceEnterAndExit!(__FUNCTION__)); mixin(traceEnterAndExit!(__FUNCTION__));
auto node = new ForeachStatement; ForeachStatement node = new ForeachStatement;
if (currentIsOneOf(TokenType.foreach_, TokenType.foreach_reverse_)) if (currentIsOneOf(TokenType.foreach_, TokenType.foreach_reverse_))
node.foreachType = advance().type; node.type = advance().type;
else else
{ {
error(`"foreach" or "foreach_reverse" expected`); error(`"foreach" or "foreach_reverse" expected`);
return null; return null;
} }
node.startIndex = current().startIndex;
if (expect(TokenType.lParen) is null) return null; if (expect(TokenType.lParen) is null) return null;
auto feType = parseForeachTypeList(); ForeachTypeList feType = parseForeachTypeList();
bool canBeRange = feType.items.length == 1; bool canBeRange = feType.items.length == 1;
if (expect(TokenType.semicolon) is null) return null; if (expect(TokenType.semicolon) is null) return null;
node.low = parseExpression(); node.low = parseExpression();
if (node.low is null) return null; if (node.low is null) return null;
@ -2197,8 +2200,13 @@ class ClassFour(A, B) if (someTest()) : Super {}}c;
} }
advance(); advance();
node.high = parseExpression(); node.high = parseExpression();
node.foreachType = feType.items[0];
if (node.high is null) return null; if (node.high is null) return null;
} }
else
{
node.foreachTypeList = feType;
}
if (expect(TokenType.rParen) is null) return null; if (expect(TokenType.rParen) is null) return null;
node.statementNoCaseNoDefault = parseStatementNoCaseNoDefault(); node.statementNoCaseNoDefault = parseStatementNoCaseNoDefault();
if (node.statementNoCaseNoDefault is null) return null; if (node.statementNoCaseNoDefault is null) return null;
@ -2653,6 +2661,7 @@ body {} // six
mixin(traceEnterAndExit!(__FUNCTION__)); mixin(traceEnterAndExit!(__FUNCTION__));
auto node = new IfStatement; auto node = new IfStatement;
if (expect(TokenType.if_) is null) return null; if (expect(TokenType.if_) is null) return null;
node.startIndex = current().startIndex;
if (expect(TokenType.lParen) is null) return null; if (expect(TokenType.lParen) is null) return null;
if (currentIs(TokenType.auto_)) if (currentIs(TokenType.auto_))
@ -2687,6 +2696,7 @@ body {} // six
} }
if (expect(TokenType.rParen) is null) return null; if (expect(TokenType.rParen) is null) return null;
if (currentIs(TokenType.rBrace)) return node; // this line makes DCD better
node.thenStatement = parseDeclarationOrStatement(); node.thenStatement = parseDeclarationOrStatement();
if (currentIs(TokenType.else_)) if (currentIs(TokenType.else_))
{ {
@ -5854,6 +5864,7 @@ q{doStuff(5)}c;
mixin(traceEnterAndExit!(__FUNCTION__)); mixin(traceEnterAndExit!(__FUNCTION__));
auto node = new WhileStatement; auto node = new WhileStatement;
expect(TokenType.while_); expect(TokenType.while_);
node.startIndex = current().startIndex;
expect(TokenType.lParen); expect(TokenType.lParen);
node.expression = parseExpression(); node.expression = parseExpression();
expect(TokenType.rParen); expect(TokenType.rParen);
@ -6393,7 +6404,7 @@ private:
{ {
if (index >= tokens.length) if (index >= tokens.length)
return false; return false;
for (size_t i = 0; i != types.length; ++i) for (size_t i = 0; (i < types.length) && ((index + i) < tokens.length); ++i)
{ {
if (tokens[index + i].type != types[i]) if (tokens[index + i].type != types[i])
return false; return false;
@ -6461,9 +6472,9 @@ private:
void trace(lazy string message) {} void trace(lazy string message) {}
} }
static immutable string BASIC_TYPE_CASE_RANGE = q{case bool_: .. case wchar_:}; enum string BASIC_TYPE_CASE_RANGE = q{case bool_: .. case wchar_:};
static immutable string LITERAL_CASE_RANGE = q{case doubleLiteral: .. case wstringLiteral:}; enum string LITERAL_CASE_RANGE = q{case doubleLiteral: .. case wstringLiteral:};
static immutable string SPECIAL_CASE_RANGE = q{case specialDate: .. case specialPrettyFunction:}; enum string SPECIAL_CASE_RANGE = q{case specialDate: .. case specialPrettyFunction:};
const(Token)[] tokens; const(Token)[] tokens;
int suppressMessages; int suppressMessages;
size_t index; size_t index;