mirror of
https://github.com/aNNiMON/Own-Programming-Language-Tutorial.git
synced 2024-09-20 00:34:20 +03:00
Добавлен тернарный оператор
This commit is contained in:
parent
76e1c2dd0d
commit
0669146fef
@ -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);
|
||||
|
@ -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() {
|
||||
|
@ -49,6 +49,9 @@ public enum TokenType {
|
||||
AMP, // &
|
||||
AMPAMP, // &&
|
||||
|
||||
QUESTION, // ?
|
||||
COLON, // :
|
||||
|
||||
LPAREN, // (
|
||||
RPAREN, // )
|
||||
LBRACKET, // [
|
||||
|
38
src/com/annimon/ownlang/parser/ast/TernaryExpression.java
Normal file
38
src/com/annimon/ownlang/parser/ast/TernaryExpression.java
Normal 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);
|
||||
}
|
||||
}
|
@ -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);
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user