# HG changeset patch # User aziz # Date 1184442421 0 # Node ID d0712601fa4754b81e001a2d6941d4f5d89fe2b2 # Parent b1060d432e5e7afc6142d7f8143aa9fa82f848f4 - Implemented parseDebugStatement() and parseVersionStatement(). diff -r b1060d432e5e -r d0712601fa47 trunk/src/Parser.d --- a/trunk/src/Parser.d Sat Jul 14 18:50:03 2007 +0000 +++ b/trunk/src/Parser.d Sat Jul 14 19:47:01 2007 +0000 @@ -762,7 +762,7 @@ decls = parseDeclarationsBlock(); // else DeclarationsBlock - // debug without condition and else statement makes no sense + // debug without condition and else body makes no sense if (token.type == T.Else && (levelCond != -1 || identCond.length != 0)) { nT(); @@ -1215,6 +1215,12 @@ goto case_Declaration; } assert(0); + case T.Debug: + s = parseDebugStatement(); + break; + case T.Version: + s = parseVersionStatement(); + break; case T.Enum: d = parseEnumDeclaration(); goto case_DeclarationStatement; @@ -1710,6 +1716,119 @@ return new StaticAssertStatement(condition, message); } + Statement parseDebugStatement() + { + assert(token.type == T.Debug); + nT(); // Skip debug keyword. + +// int levelSpec = -1; // debug = Integer ; +// string identSpec; // debug = Identifier ; + int levelCond = -1; // debug ( Integer ) + string identCond; // debug ( Identifier ) + Statement debugBody, elseBody; + + void parseIdentOrInt(ref string ident, ref int level) + { + nT(); + if (token.type == T.Int32) + level = token.int_; + else if (token.type == T.Identifier) + ident = token.identifier; + else + expected(T.Identifier); // TODO: better error msg + nT(); + } + +// if (token.type == T.Assign) +// { +// parseIdentOrInt(identSpec, levelSpec); +// require(T.Semicolon); +// } +// else + { + // Condition: + // Integer + // Identifier + + // ( Condition ) + if (token.type == T.LParen) + { + parseIdentOrInt(identCond, levelCond); + require(T.RParen); + } + + // debug Statement + // debug ( Condition ) Statement + debugBody = parseNoScopeStatement(); + + // else Statement + if (token.type == T.Else) + { + // debug without condition and else body makes no sense + //if (levelCond == -1 && identCond.length == 0) + // TODO: issue error msg + nT(); + elseBody = parseNoScopeStatement(); + } + } + + return new DebugStatement(/+levelSpec, identSpec,+/ levelCond, identCond, debugBody, elseBody); + } + + Statement parseVersionStatement() + { + assert(token.type == T.Version); + + nT(); // Skip version keyword. + +// int levelSpec = -1; // version = Integer ; +// string identSpec; // version = Identifier ; + int levelCond = -1; // version ( Integer ) + string identCond; // version ( Identifier ) + Statement versionBody, elseBody; + + void parseIdentOrInt(ref string ident, ref int level) + { + nT(); + if (token.type == T.Int32) + level = token.int_; + else if (token.type == T.Identifier) + ident = token.identifier; + else + expected(T.Identifier); // TODO: better error msg + nT(); + } + +// if (token.type == T.Assign) +// { +// parseIdentOrInt(identSpec, levelSpec); +// require(T.Semicolon); +// } +// else + { + // Condition: + // Integer + // Identifier + + // ( Condition ) + require(T.LParen); + parseIdentOrInt(identCond, levelCond); + require(T.RParen); + + // version ( Condition ) Statement + versionBody = parseNoScopeStatement(); + + // else Statement + if (token.type == T.Else) + { + nT(); + elseBody = parseNoScopeStatement(); + } + } + + return new VersionStatement(/+levelSpec, identSpec,+/ levelCond, identCond, versionBody, elseBody); + } + /+++++++++++++++++++++++++++++ + Assembler parsing methods + +++++++++++++++++++++++++++++/ diff -r b1060d432e5e -r d0712601fa47 trunk/src/Statements.d --- a/trunk/src/Statements.d Sat Jul 14 18:50:03 2007 +0000 +++ b/trunk/src/Statements.d Sat Jul 14 19:47:01 2007 +0000 @@ -338,3 +338,31 @@ this.message = message; } } + +class DebugStatement : Statement +{ + int levelCond; + string identCond; + Statement debugBody, elseBody; + this(int levelCond, string identCond, Statement debugBody, Statement elseBody) + { + this.levelCond = levelCond; + this.identCond = identCond; + this.debugBody = debugBody; + this.elseBody = elseBody; + } +} + +class VersionStatement : Statement +{ + int levelCond; + string identCond; + Statement versionBody, elseBody; + this(int levelCond, string identCond, Statement versionBody, Statement elseBody) + { + this.levelCond = levelCond; + this.identCond = identCond; + this.versionBody = versionBody; + this.elseBody = elseBody; + } +}