mirror of
https://github.com/aNNiMON/Own-Programming-Language-Tutorial.git
synced 2024-09-20 08:44:20 +03:00
Добавлен тернарный оператор
This commit is contained in:
parent
76e1c2dd0d
commit
0669146fef
@ -11,7 +11,7 @@ import java.util.Map;
|
|||||||
*/
|
*/
|
||||||
public final class Lexer {
|
public final class Lexer {
|
||||||
|
|
||||||
private static final String OPERATOR_CHARS = "+-*/%()[]{}=<>!&|,^~";
|
private static final String OPERATOR_CHARS = "+-*/%()[]{}=<>!&|,^~?:";
|
||||||
|
|
||||||
private static final Map<String, TokenType> OPERATORS;
|
private static final Map<String, TokenType> OPERATORS;
|
||||||
static {
|
static {
|
||||||
@ -33,6 +33,8 @@ public final class Lexer {
|
|||||||
OPERATORS.put(",", TokenType.COMMA);
|
OPERATORS.put(",", TokenType.COMMA);
|
||||||
OPERATORS.put("^", TokenType.CARET);
|
OPERATORS.put("^", TokenType.CARET);
|
||||||
OPERATORS.put("~", TokenType.TILDE);
|
OPERATORS.put("~", TokenType.TILDE);
|
||||||
|
OPERATORS.put("?", TokenType.QUESTION);
|
||||||
|
OPERATORS.put(":", TokenType.COLON);
|
||||||
|
|
||||||
OPERATORS.put("!", TokenType.EXCL);
|
OPERATORS.put("!", TokenType.EXCL);
|
||||||
OPERATORS.put("&", TokenType.AMP);
|
OPERATORS.put("&", TokenType.AMP);
|
||||||
|
@ -176,7 +176,20 @@ public final class Parser {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private Expression expression() {
|
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() {
|
private Expression logicalOr() {
|
||||||
|
@ -49,6 +49,9 @@ public enum TokenType {
|
|||||||
AMP, // &
|
AMP, // &
|
||||||
AMPAMP, // &&
|
AMPAMP, // &&
|
||||||
|
|
||||||
|
QUESTION, // ?
|
||||||
|
COLON, // :
|
||||||
|
|
||||||
LPAREN, // (
|
LPAREN, // (
|
||||||
RPAREN, // )
|
RPAREN, // )
|
||||||
LBRACKET, // [
|
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(IfStatement s);
|
||||||
void visit(PrintStatement s);
|
void visit(PrintStatement s);
|
||||||
void visit(ReturnStatement s);
|
void visit(ReturnStatement s);
|
||||||
|
void visit(TernaryExpression s);
|
||||||
void visit(UnaryExpression s);
|
void visit(UnaryExpression s);
|
||||||
void visit(ValueExpression s);
|
void visit(ValueExpression s);
|
||||||
void visit(VariableExpression s);
|
void visit(VariableExpression s);
|
||||||
|
@ -110,6 +110,13 @@ public abstract class AbstractVisitor implements Visitor {
|
|||||||
s.expression.accept(this);
|
s.expression.accept(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(TernaryExpression s) {
|
||||||
|
s.condition.accept(this);
|
||||||
|
s.trueExpr.accept(this);
|
||||||
|
s.falseExpr.accept(this);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visit(UnaryExpression s) {
|
public void visit(UnaryExpression s) {
|
||||||
s.expr1.accept(this);
|
s.expr1.accept(this);
|
||||||
|
Loading…
Reference in New Issue
Block a user