Добавлен тернарный оператор

This commit is contained in:
Victor 2015-06-30 13:37:22 +03:00
parent 76e1c2dd0d
commit 0669146fef
6 changed files with 66 additions and 2 deletions

View File

@ -11,7 +11,7 @@ import java.util.Map;
*/
public final class Lexer {
private static final String OPERATOR_CHARS = "+-*/%()[]{}=<>!&|,^~";
private static final String OPERATOR_CHARS = "+-*/%()[]{}=<>!&|,^~?:";
private static final Map<String, TokenType> OPERATORS;
static {
@ -33,6 +33,8 @@ public final class Lexer {
OPERATORS.put(",", TokenType.COMMA);
OPERATORS.put("^", TokenType.CARET);
OPERATORS.put("~", TokenType.TILDE);
OPERATORS.put("?", TokenType.QUESTION);
OPERATORS.put(":", TokenType.COLON);
OPERATORS.put("!", TokenType.EXCL);
OPERATORS.put("&", TokenType.AMP);

View File

@ -176,7 +176,20 @@ public final class Parser {
}
private Expression expression() {
return logicalOr();
return ternary();
}
private Expression ternary() {
Expression result = logicalOr();
if (match(TokenType.QUESTION)) {
final Expression trueExpr = expression();
consume(TokenType.COLON);
final Expression falseExpr = expression();
return new TernaryExpression(result, trueExpr, falseExpr);
}
return result;
}
private Expression logicalOr() {

View File

@ -49,6 +49,9 @@ public enum TokenType {
AMP, // &
AMPAMP, // &&
QUESTION, // ?
COLON, // :
LPAREN, // (
RPAREN, // )
LBRACKET, // [

View File

@ -0,0 +1,38 @@
package com.annimon.ownlang.parser.ast;
import com.annimon.ownlang.lib.Value;
/**
*
* @author aNNiMON
*/
public final class TernaryExpression implements Expression {
public final Expression condition;
public final Expression trueExpr, falseExpr;
public TernaryExpression(Expression condition, Expression trueExpr, Expression falseExpr) {
this.condition = condition;
this.trueExpr = trueExpr;
this.falseExpr = falseExpr;
}
@Override
public Value eval() {
if (condition.eval().asNumber() != 0) {
return trueExpr.eval();
} else {
return falseExpr.eval();
}
}
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
@Override
public String toString() {
return String.format("%s ? %s : %s", condition, trueExpr, falseExpr);
}
}

View File

@ -23,6 +23,7 @@ public interface Visitor {
void visit(IfStatement s);
void visit(PrintStatement s);
void visit(ReturnStatement s);
void visit(TernaryExpression s);
void visit(UnaryExpression s);
void visit(ValueExpression s);
void visit(VariableExpression s);

View File

@ -110,6 +110,13 @@ public abstract class AbstractVisitor implements Visitor {
s.expression.accept(this);
}
@Override
public void visit(TernaryExpression s) {
s.condition.accept(this);
s.trueExpr.accept(this);
s.falseExpr.accept(this);
}
@Override
public void visit(UnaryExpression s) {
s.expr1.accept(this);