mirror of
https://github.com/aNNiMON/HotaruFX.git
synced 2024-09-19 14:14:21 +03:00
Add true/false to language
This commit is contained in:
parent
1c69338a36
commit
71b94d931d
@ -34,6 +34,13 @@ public class HotaruLexer extends Lexer {
|
|||||||
OPERATORS.put("@", HotaruTokenId.AT);
|
OPERATORS.put("@", HotaruTokenId.AT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static final Map<String, HotaruTokenId> KEYWORDS;
|
||||||
|
static {
|
||||||
|
KEYWORDS = new HashMap<>();
|
||||||
|
KEYWORDS.put("true", HotaruTokenId.TRUE);
|
||||||
|
KEYWORDS.put("false", HotaruTokenId.FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
public HotaruLexer(String input) {
|
public HotaruLexer(String input) {
|
||||||
super(input);
|
super(input);
|
||||||
}
|
}
|
||||||
@ -91,7 +98,7 @@ public class HotaruLexer extends Lexer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
val word = getBuffer().toString();
|
val word = getBuffer().toString();
|
||||||
return addToken(HotaruTokenId.WORD, word);
|
return addToken(KEYWORDS.getOrDefault(word, HotaruTokenId.WORD));
|
||||||
}
|
}
|
||||||
|
|
||||||
private Token tokenizeText(char openChar) {
|
private Token tokenizeText(char openChar) {
|
||||||
|
@ -10,6 +10,9 @@ public enum HotaruTokenId {
|
|||||||
WORD(Category.IDENTIFIER),
|
WORD(Category.IDENTIFIER),
|
||||||
TEXT(Category.STRING),
|
TEXT(Category.STRING),
|
||||||
|
|
||||||
|
TRUE(Category.KEYWORD),
|
||||||
|
FALSE(Category.KEYWORD),
|
||||||
|
|
||||||
EQ(Category.OPERATOR),
|
EQ(Category.OPERATOR),
|
||||||
PLUS(Category.OPERATOR),
|
PLUS(Category.OPERATOR),
|
||||||
MINUS(Category.OPERATOR),
|
MINUS(Category.OPERATOR),
|
||||||
@ -31,7 +34,7 @@ public enum HotaruTokenId {
|
|||||||
EOF(Category.WHITESPACE);
|
EOF(Category.WHITESPACE);
|
||||||
|
|
||||||
private enum Category {
|
private enum Category {
|
||||||
NUMBER, IDENTIFIER, STRING, OPERATOR, COMMENT, WHITESPACE
|
NUMBER, IDENTIFIER, STRING, KEYWORD, OPERATOR, COMMENT, WHITESPACE
|
||||||
}
|
}
|
||||||
|
|
||||||
private final Category category;
|
private final Category category;
|
||||||
|
@ -3,6 +3,7 @@ package com.annimon.hotarufx.parser;
|
|||||||
import com.annimon.hotarufx.exceptions.ParseException;
|
import com.annimon.hotarufx.exceptions.ParseException;
|
||||||
import com.annimon.hotarufx.lexer.HotaruTokenId;
|
import com.annimon.hotarufx.lexer.HotaruTokenId;
|
||||||
import com.annimon.hotarufx.lexer.Token;
|
import com.annimon.hotarufx.lexer.Token;
|
||||||
|
import com.annimon.hotarufx.lib.NumberValue;
|
||||||
import com.annimon.hotarufx.parser.ast.*;
|
import com.annimon.hotarufx.parser.ast.*;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
@ -219,6 +220,12 @@ public class HotaruParser extends Parser {
|
|||||||
|
|
||||||
private Node value() {
|
private Node value() {
|
||||||
val current = get(0);
|
val current = get(0);
|
||||||
|
if (match(HotaruTokenId.TRUE)) {
|
||||||
|
return new ValueNode(NumberValue.ONE);
|
||||||
|
}
|
||||||
|
if (match(HotaruTokenId.FALSE)) {
|
||||||
|
return new ValueNode(NumberValue.ZERO);
|
||||||
|
}
|
||||||
if (match(HotaruTokenId.NUMBER)) {
|
if (match(HotaruTokenId.NUMBER)) {
|
||||||
return new ValueNode(createNumber(current.getText(), 10));
|
return new ValueNode(createNumber(current.getText(), 10));
|
||||||
}
|
}
|
||||||
|
@ -87,7 +87,7 @@ POLYLINE = polyline(points, {
|
|||||||
})
|
})
|
||||||
|
|
||||||
LINE = line({
|
LINE = line({
|
||||||
visible: 0,
|
visible: false,
|
||||||
startX: -600
|
startX: -600
|
||||||
startY: 300
|
startY: 300
|
||||||
endX: 600
|
endX: 600
|
||||||
@ -95,7 +95,7 @@ LINE = line({
|
|||||||
stroke: "#777",
|
stroke: "#777",
|
||||||
strokeDashOffset: 45
|
strokeDashOffset: 45
|
||||||
})
|
})
|
||||||
LINE@visible.add(100, 1)
|
LINE@visible.add(100, true)
|
||||||
LINE@strokeWidth.add(100, 0).add(140, 10)
|
LINE@strokeWidth.add(100, 0).add(140, 10)
|
||||||
|
|
||||||
arcRadius = 200
|
arcRadius = 200
|
||||||
|
@ -2,6 +2,7 @@ package com.annimon.hotarufx.parser;
|
|||||||
|
|
||||||
import com.annimon.hotarufx.exceptions.ParseException;
|
import com.annimon.hotarufx.exceptions.ParseException;
|
||||||
import com.annimon.hotarufx.lexer.HotaruLexer;
|
import com.annimon.hotarufx.lexer.HotaruLexer;
|
||||||
|
import com.annimon.hotarufx.lib.NumberValue;
|
||||||
import com.annimon.hotarufx.parser.ast.AssignNode;
|
import com.annimon.hotarufx.parser.ast.AssignNode;
|
||||||
import com.annimon.hotarufx.parser.ast.BlockNode;
|
import com.annimon.hotarufx.parser.ast.BlockNode;
|
||||||
import com.annimon.hotarufx.parser.ast.FunctionNode;
|
import com.annimon.hotarufx.parser.ast.FunctionNode;
|
||||||
@ -9,6 +10,8 @@ import com.annimon.hotarufx.parser.ast.MapNode;
|
|||||||
import com.annimon.hotarufx.parser.ast.Node;
|
import com.annimon.hotarufx.parser.ast.Node;
|
||||||
import com.annimon.hotarufx.parser.ast.ValueNode;
|
import com.annimon.hotarufx.parser.ast.ValueNode;
|
||||||
import com.annimon.hotarufx.parser.ast.VariableNode;
|
import com.annimon.hotarufx.parser.ast.VariableNode;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import lombok.val;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import static org.hamcrest.MatcherAssert.assertThat;
|
import static org.hamcrest.MatcherAssert.assertThat;
|
||||||
import static org.hamcrest.Matchers.allOf;
|
import static org.hamcrest.Matchers.allOf;
|
||||||
@ -59,6 +62,33 @@ class HotaruParserTest {
|
|||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testParseTrueFalse() {
|
||||||
|
String input = "A = true\nB = false";
|
||||||
|
Node node = p(input);
|
||||||
|
assertThat(node, instanceOf(BlockNode.class));
|
||||||
|
|
||||||
|
val block = (BlockNode) node;
|
||||||
|
assertThat(block.statements.size(), is(2));
|
||||||
|
|
||||||
|
val expectedValues = Arrays.asList(
|
||||||
|
NumberValue.fromBoolean(true),
|
||||||
|
NumberValue.fromBoolean(false)
|
||||||
|
);
|
||||||
|
val it = expectedValues.iterator();
|
||||||
|
|
||||||
|
for (Node statement : block.statements) {
|
||||||
|
assertThat(statement, instanceOf(AssignNode.class));
|
||||||
|
|
||||||
|
val assignNode = (AssignNode) statement;
|
||||||
|
assertThat(assignNode.target, instanceOf(VariableNode.class));
|
||||||
|
assertThat(assignNode.value, instanceOf(ValueNode.class));
|
||||||
|
|
||||||
|
val value = ((ValueNode) assignNode.value).value;
|
||||||
|
assertThat(value, is(it.next()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void testParseErrors() {
|
void testParseErrors() {
|
||||||
assertThrows(ParseException.class, () -> p("A ="));
|
assertThrows(ParseException.class, () -> p("A ="));
|
||||||
|
Loading…
Reference in New Issue
Block a user