Урок 8. break, continue, цикл do/while

This commit is contained in:
Victor 2015-06-12 21:46:13 +03:00
parent 40949f3e29
commit 3a4ea7b3b1
9 changed files with 116 additions and 16 deletions

View File

@ -13,10 +13,18 @@ if (40 < 50 || 50 > 60) {
print "true1\n"
print "true2\n"
i = 0
print "do while"
do {
print "i = " + i + "\n"
i = i + 1
} while (i < 10)
i = 0
print "while"
while (i < 10) {
print "i = " + i + "\n"
i = i + 1
}
print "for"
for i = 0, i < 10, i = i + 1 {
print "i = " + i + "\n"
}

View File

@ -150,6 +150,9 @@ public final class Lexer {
case "else": addToken(TokenType.ELSE); break;
case "while": addToken(TokenType.WHILE); break;
case "for": addToken(TokenType.FOR); break;
case "do": addToken(TokenType.DO); break;
case "break": addToken(TokenType.BREAK); break;
case "continue": addToken(TokenType.CONTINUE); break;
default:
addToken(TokenType.WORD, word);
break;

View File

@ -1,19 +1,6 @@
package com.annimon.ownlang.parser;
import com.annimon.ownlang.parser.ast.PrintStatement;
import com.annimon.ownlang.parser.ast.AssignmentStatement;
import com.annimon.ownlang.parser.ast.BinaryExpression;
import com.annimon.ownlang.parser.ast.BlockStatement;
import com.annimon.ownlang.parser.ast.ConditionalExpression;
import com.annimon.ownlang.parser.ast.VariableExpression;
import com.annimon.ownlang.parser.ast.Expression;
import com.annimon.ownlang.parser.ast.ForStatement;
import com.annimon.ownlang.parser.ast.IfStatement;
import com.annimon.ownlang.parser.ast.ValueExpression;
import com.annimon.ownlang.parser.ast.Statement;
import com.annimon.ownlang.parser.ast.UnaryExpression;
import com.annimon.ownlang.parser.ast.WhileStatement;
import java.util.ArrayList;
import com.annimon.ownlang.parser.ast.*;
import java.util.List;
/**
@ -66,6 +53,15 @@ public final class Parser {
if (match(TokenType.WHILE)) {
return whileStatement();
}
if (match(TokenType.DO)) {
return doWhileStatement();
}
if (match(TokenType.BREAK)) {
return new BreakStatement();
}
if (match(TokenType.CONTINUE)) {
return new ContinueStatement();
}
if (match(TokenType.FOR)) {
return forStatement();
}
@ -101,6 +97,13 @@ public final class Parser {
return new WhileStatement(condition, statement);
}
private Statement doWhileStatement() {
final Statement statement = statementOrBlock();
consume(TokenType.WHILE);
final Expression condition = expression();
return new DoWhileStatement(condition, statement);
}
private Statement forStatement() {
final Statement initialization = assignmentStatement();
consume(TokenType.COMMA);

View File

@ -17,6 +17,9 @@ public enum TokenType {
ELSE,
WHILE,
FOR,
DO,
BREAK,
CONTINUE,
PLUS,
MINUS,

View File

@ -0,0 +1,18 @@
package com.annimon.ownlang.parser.ast;
/**
*
* @author aNNiMON
*/
public final class BreakStatement extends RuntimeException implements Statement {
@Override
public void execute() {
throw this;
}
@Override
public String toString() {
return "break";
}
}

View File

@ -0,0 +1,18 @@
package com.annimon.ownlang.parser.ast;
/**
*
* @author aNNiMON
*/
public final class ContinueStatement extends RuntimeException implements Statement {
@Override
public void execute() {
throw this;
}
@Override
public String toString() {
return "continue";
}
}

View File

@ -0,0 +1,35 @@
package com.annimon.ownlang.parser.ast;
/**
*
* @author aNNiMON
*/
public final class DoWhileStatement implements Statement {
private final Expression condition;
private final Statement statement;
public DoWhileStatement(Expression condition, Statement statement) {
this.condition = condition;
this.statement = statement;
}
@Override
public void execute() {
do {
try {
statement.execute();
} catch (BreakStatement bs) {
break;
} catch (ContinueStatement cs) {
// continue;
}
}
while (condition.eval().asNumber() != 0);
}
@Override
public String toString() {
return "do " + statement + " while " + condition;
}
}

View File

@ -21,7 +21,13 @@ public final class ForStatement implements Statement {
@Override
public void execute() {
for (initialization.execute(); termination.eval().asNumber() != 0; increment.execute()) {
statement.execute();
try {
statement.execute();
} catch (BreakStatement bs) {
break;
} catch (ContinueStatement cs) {
// continue;
}
}
}

View File

@ -17,7 +17,13 @@ public final class WhileStatement implements Statement {
@Override
public void execute() {
while (condition.eval().asNumber() != 0) {
statement.execute();
try {
statement.execute();
} catch (BreakStatement bs) {
break;
} catch (ContinueStatement cs) {
// continue;
}
}
}