Skip to content

Commit

Permalink
Added goto, return, and volatile.
Browse files Browse the repository at this point in the history
  • Loading branch information
wilkie committed Mar 19, 2010
1 parent 4681001 commit a71c112
Show file tree
Hide file tree
Showing 6 changed files with 195 additions and 1 deletion.
2 changes: 1 addition & 1 deletion Makefile
Expand Up @@ -41,7 +41,7 @@ DFILES_ANALYZING = analyzing/debugger.d
DFILES_CORE = core/tostring.d core/locales/en_us.d core/locales/fr_fr.d core/date.d core/locale.d core/variant.d core/list.d core/exception.d core/event.d core/library.d core/system.d core/random.d core/regex.d core/arguments.d core/definitions.d core/application.d core/time.d core/timezone.d core/unicode.d core/endian.d core/stream.d core/string.d core/main.d core/color.d
DFILES_GUI = gui/container.d gui/trackbar.d gui/radiogroup.d gui/progressbar.d gui/togglefield.d gui/listfield.d gui/listbox.d gui/vscrollbar.d gui/hscrollbar.d gui/button.d gui/textfield.d gui/window.d gui/widget.d gui/application.d
DFILES_UTILS = utils/stack.d utils/linkedlist.d utils/fibonacci.d utils/heap.d
DFILES_PARSING = parsing/d/addexprunit.d parsing/d/andexprunit.d parsing/d/assignexprunit.d parsing/d/blockstmtunit.d parsing/d/switchstmtunit.d parsing/d/casestmtunit.d parsing/d/defaultstmtunit.d parsing/d/breakstmtunit.d parsing/d/continuestmtunit.d parsing/d/cmpexprunit.d parsing/d/conditionalexprunit.d parsing/d/declarationunit.d parsing/d/expressionunit.d parsing/d/importdeclunit.d parsing/d/isexprunit.d parsing/d/lexer.d parsing/d/logicalandexprunit.d parsing/d/logicalorexprunit.d parsing/d/moduledeclunit.d parsing/d/moduleunit.d parsing/d/mulexprunit.d parsing/d/nodes.d parsing/d/orexprunit.d parsing/d/parser.d parsing/d/postfixexprunit.d parsing/d/primaryexprunit.d parsing/d/shiftexprunit.d parsing/d/staticunit.d parsing/d/declaratorunit.d parsing/d/declaratorsuffixunit.d parsing/d/declaratortypeunit.d parsing/d/tokens.d parsing/d/enumdeclunit.d parsing/d/typeunit.d parsing/d/enumbodyunit.d parsing/d/aggregatedeclunit.d parsing/d/aggregatebodyunit.d parsing/d/classbodyunit.d parsing/d/templatebodyunit.d parsing/d/interfacebodyunit.d parsing/d/classdeclunit.d parsing/d/interfacedeclunit.d parsing/d/constructorunit.d parsing/d/destructorunit.d parsing/d/parameterlistunit.d parsing/d/functionbodyunit.d parsing/d/staticifunit.d parsing/d/versionunit.d parsing/d/debugunit.d parsing/d/unittestunit.d parsing/d/parameterunit.d parsing/d/basictypeunit.d parsing/d/statementunit.d parsing/d/pragmastmtunit.d parsing/d/staticassertunit.d parsing/d/foreachstmtunit.d parsing/d/scopedstmtunit.d parsing/d/forstmtunit.d parsing/d/typedeclarationunit.d parsing/d/unaryexprunit.d parsing/d/xorexprunit.d parsing/ast.d parsing/lexer.d parsing/token.d parsing/parser.d parsing/options.d parsing/cfg.d parsing/parseunit.d
DFILES_PARSING = parsing/d/addexprunit.d parsing/d/andexprunit.d parsing/d/assignexprunit.d parsing/d/blockstmtunit.d parsing/d/switchstmtunit.d parsing/d/casestmtunit.d parsing/d/defaultstmtunit.d parsing/d/breakstmtunit.d parsing/d/continuestmtunit.d parsing/d/gotostmtunit.d parsing/d/returnstmtunit.d parsing/d/volatilestmtunit.d parsing/d/cmpexprunit.d parsing/d/conditionalexprunit.d parsing/d/declarationunit.d parsing/d/expressionunit.d parsing/d/importdeclunit.d parsing/d/isexprunit.d parsing/d/lexer.d parsing/d/logicalandexprunit.d parsing/d/logicalorexprunit.d parsing/d/moduledeclunit.d parsing/d/moduleunit.d parsing/d/mulexprunit.d parsing/d/nodes.d parsing/d/orexprunit.d parsing/d/parser.d parsing/d/postfixexprunit.d parsing/d/primaryexprunit.d parsing/d/shiftexprunit.d parsing/d/staticunit.d parsing/d/declaratorunit.d parsing/d/declaratorsuffixunit.d parsing/d/declaratortypeunit.d parsing/d/tokens.d parsing/d/enumdeclunit.d parsing/d/typeunit.d parsing/d/enumbodyunit.d parsing/d/aggregatedeclunit.d parsing/d/aggregatebodyunit.d parsing/d/classbodyunit.d parsing/d/templatebodyunit.d parsing/d/interfacebodyunit.d parsing/d/classdeclunit.d parsing/d/interfacedeclunit.d parsing/d/constructorunit.d parsing/d/destructorunit.d parsing/d/parameterlistunit.d parsing/d/functionbodyunit.d parsing/d/staticifunit.d parsing/d/versionunit.d parsing/d/debugunit.d parsing/d/unittestunit.d parsing/d/parameterunit.d parsing/d/basictypeunit.d parsing/d/statementunit.d parsing/d/pragmastmtunit.d parsing/d/staticassertunit.d parsing/d/foreachstmtunit.d parsing/d/scopedstmtunit.d parsing/d/forstmtunit.d parsing/d/typedeclarationunit.d parsing/d/unaryexprunit.d parsing/d/xorexprunit.d parsing/ast.d parsing/lexer.d parsing/token.d parsing/parser.d parsing/options.d parsing/cfg.d parsing/parseunit.d
DFILES = djehuty.d
DFILES_BINARY_CODECS = decoders/binary/decoder.d decoders/binary/base64.d decoders/binary/yEnc.d decoders/binary/deflate.d decoders/binary/zlib.d
DFILES_IMAGE_CODECS = decoders/image/decoder.d decoders/image/all.d decoders/image/bmp.d decoders/image/png.d decoders/image/gif.d decoders/image/jpeg.d
Expand Down
76 changes: 76 additions & 0 deletions parsing/d/gotostmtunit.d
@@ -0,0 +1,76 @@
/*
* expressionunit.d
*
* This module parses expressions.
*
*/

module parsing.d.gotostmtunit;

import parsing.parseunit;
import parsing.token;

import parsing.d.tokens;
import parsing.d.nodes;

import parsing.d.expressionunit;

import io.console;

import djehuty;

class GotoStmtUnit : ParseUnit {
override bool tokenFound(Token current) {
switch (current.type) {
case DToken.Semicolon:
if (this.state == 0) {
// Error.
// TODO:
}
if (this.state == 2) {
// Error.
// TODO:
}
// Done.
return false;
case DToken.Identifier:
if (this.state != 0) {
// Error
// TODO:
}
Console.putln("Goto: ", current.value);
cur_string = current.value.toString();
this.state = 1;
break;
case DToken.Default:
Console.putln("Goto: Default");
this.state = 2;
break;
case DToken.Case:
Console.putln("Goto: Case");
this.state = 2;
break;
default:
if (this.state != 2) {
// Error
// TODO:
}

lexer.push(current);
if (this.state == 3) {
// Error: Multiple expressions
// TODO:
}
auto tree = expand!(ExpressionUnit)();
this.state = 3;
break;
}
return true;
}

protected:
string cur_string = "";

static const string _common_error_msg = "";
static const string[] _common_error_usages = null;
}
51 changes: 51 additions & 0 deletions parsing/d/returnstmtunit.d
@@ -0,0 +1,51 @@
/*
* expressionunit.d
*
* This module parses expressions.
*
*/

module parsing.d.returnstmtunit;

import parsing.parseunit;
import parsing.token;

import parsing.d.tokens;
import parsing.d.nodes;

import parsing.d.expressionunit;

import io.console;

import djehuty;

class ReturnStmtUnit : ParseUnit {
override bool tokenFound(Token current) {
switch (current.type) {
case DToken.Semicolon:
// Done.
return false;

default:
if (this.state == 1) {
// Error: Multiple expressions
// TODO:
}

lexer.push(current);

// Expression follows... and then a semicolon
auto tree = expand!(ExpressionUnit)();
this.state = 1;

break;
}
return true;
}

protected:
string cur_string = "";

static const string _common_error_msg = "";
static const string[] _common_error_usages = null;
}
8 changes: 8 additions & 0 deletions parsing/d/statementunit.d
Expand Up @@ -19,7 +19,10 @@ import parsing.d.switchstmtunit;
import parsing.d.casestmtunit;
import parsing.d.defaultstmtunit;
import parsing.d.breakstmtunit;
import parsing.d.gotostmtunit;
import parsing.d.continuestmtunit;
import parsing.d.returnstmtunit;
import parsing.d.volatilestmtunit;

import io.console;

Expand Down Expand Up @@ -73,6 +76,8 @@ class StatementUnit : ParseUnit {
case DToken.Synchronized:
break;
case DToken.Volatile:
Console.putln("Volatile: ");
auto tree = expand!(VolatileStmtUnit)();
break;
case DToken.Case:
auto tree = expand!(CaseStmtUnit)();
Expand All @@ -90,8 +95,11 @@ class StatementUnit : ParseUnit {
auto tree = expand!(BreakStmtUnit)();
break;
case DToken.Goto:
auto tree = expand!(GotoStmtUnit)();
break;
case DToken.Return:
Console.putln("Return: ");
auto tree = expand!(ReturnStmtUnit)();
break;
case DToken.Throw:
break;
Expand Down
51 changes: 51 additions & 0 deletions parsing/d/volatilestmtunit.d
@@ -0,0 +1,51 @@
/*
* expressionunit.d
*
* This module parses expressions.
*
*/

module parsing.d.volatilestmtunit;

import parsing.parseunit;
import parsing.token;

import parsing.d.tokens;
import parsing.d.nodes;

import parsing.d.statementunit;

import io.console;

import djehuty;

class VolatileStmtUnit : ParseUnit {
override bool tokenFound(Token current) {
switch (current.type) {
case DToken.Semicolon:
// Done.
return false;

default:
if (this.state == 1) {
// Error: Multiple statements!?
// TODO:
}

lexer.push(current);

// Statement Follows.
auto tree = expand!(StatementUnit)();
this.state = 1;

break;
}
return true;
}

protected:
string cur_string = "";

static const string _common_error_msg = "";
static const string[] _common_error_usages = null;
}
8 changes: 8 additions & 0 deletions tests/test.d
Expand Up @@ -46,13 +46,21 @@ class FooClass {

this(int a, int b) {
switch(5) {
case 4:
goto default;
goto case 3;
goto foo;
case 6:
break;
case 7:
break foo;
default:
continue;
}
return 4;
return;
volatile;
volatile switch(3) { case 4: }
}

interface FooBarInterface {
Expand Down

0 comments on commit a71c112

Please sign in to comment.