Mercurial > projects > dil
changeset 123:0f55c0ac6589
- Added method parseVersionDeclaration().
- Simplified parseDebugDeclaration().
- Added an assert statement to parseDeclarationsBlock().
author | aziz |
---|---|
date | Mon, 09 Jul 2007 21:04:02 +0000 |
parents | 9849a263f148 |
children | d4c4cea6ee7f |
files | trunk/src/Declarations.d trunk/src/Parser.d |
diffstat | 2 files changed, 102 insertions(+), 33 deletions(-) [+] |
line wrap: on
line diff
--- a/trunk/src/Declarations.d Mon Jul 09 20:24:03 2007 +0000 +++ b/trunk/src/Declarations.d Mon Jul 09 21:04:02 2007 +0000 @@ -213,3 +213,23 @@ this.elseDecls = elseDecls; } } + +class VersionDeclaration : Declaration +{ + int levelSpec; + string identSpec; + int levelCond; + string identCond; + Declaration[] decls, elseDecls; + + this(int levelSpec, string identSpec, int levelCond, string identCond, Declaration[] decls, Declaration[] elseDecls) + { + super(decls.length != 0); + this.levelSpec = levelSpec; + this.identSpec = identSpec; + this.levelCond = levelCond; + this.identCond = identCond; + this.decls = decls; + this.elseDecls = elseDecls; + } +}
--- a/trunk/src/Parser.d Mon Jul 09 20:24:03 2007 +0000 +++ b/trunk/src/Parser.d Mon Jul 09 21:04:02 2007 +0000 @@ -184,6 +184,7 @@ case T.Colon: nT(); decls = parseDeclarationDefinitions(); + assert(token.type == T.RBrace || token.type == T.EOF); break; default: decls ~= parseDeclarationDefinition(); @@ -599,60 +600,108 @@ string identCond; // debug ( Identifier ) Declaration[] decls, elseDecls; - if (token.type == T.Assign) + void parseIdentOrInt(ref string ident, ref int level) { nT(); if (token.type == T.Int32) - levelSpec = token.int_; + level = token.int_; else if (token.type == T.Identifier) - identSpec = token.identifier; + ident = token.identifier; else errorIfNot(T.Identifier); // TODO: better error msg nT(); + } + + if (token.type == T.Assign) + { + parseIdentOrInt(identSpec, levelSpec); require(T.Semicolon); } else { - // '(' (Identifier | Integer) ')' + // Condition: + // Integer + // Identifier + // ( Condition ) if (token.type == T.LParen) { - nT(); - if (token.type == T.Int32) - levelCond = token.int_; - else if (token.type == T.Identifier) - identCond = token.identifier; - else - errorIfNot(T.Identifier); // TODO: better error msg - nT(); + parseIdentOrInt(identCond, levelCond); require(T.RParen); } - if (token.type == T.Colon) - { - // debug: - // "debug" '(' (Identifier | Integer) ')': - nT(); - decls = parseDeclarationDefinitions(); - } - else + // debug DeclarationsBlock + // debug ( Condition ) DeclarationsBlock + decls = parseDeclarationsBlock(); + + // else DeclarationsBlock + // debug without condition and else statement makes no sense + if (token.type == T.Else && (levelCond != -1 || identCond.length != 0)) { - // debug DeclarationsBlock - // "debug" '(' (Identifier | Integer) ')' DeclarationsBlock - decls = parseDeclarationsBlock(); + nT(); + //if (token.type == T.Colon) + // TODO: avoid "else:"? + elseDecls = parseDeclarationsBlock(); + } +// else + // TODO: issue error msg + } + + return new DebugDeclaration(levelSpec, identSpec, levelCond, identCond, decls, elseDecls); + } + + Declaration parseVersionDeclaration() + { + assert(token.type == T.Debug); + + nT(); // Skip debug keyword. + + int levelSpec = -1; // version = Integer ; + string identSpec; // version = Identifier ; + int levelCond = -1; // version ( Integer ) + string identCond; // version ( Identifier ) + Declaration[] decls, elseDecls; - // else DeclarationsBlock - // debug without condition and else statement makes no sense - if (token.type == T.Else && (levelCond != -1 || identCond.length != 0)) - { - nT(); - //if (token.type == T.Colon) - // TODO: avoid "else:"? - elseDecls = parseDeclarationsBlock(); - } + 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 + errorIfNot(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 ) DeclarationsBlock + decls = parseDeclarationsBlock(); + + // else DeclarationsBlock + if (token.type == T.Else) + { + nT(); + //if (token.type == T.Colon) + // TODO: avoid "else:"? + elseDecls = parseDeclarationsBlock(); } } - return new DebugDeclaration(levelSpec, identSpec, levelCond, identCond, decls, elseDecls); + return new VersionDeclaration(levelSpec, identSpec, levelCond, identCond, decls, elseDecls); } /+++++++++++++++++++++++++++++