From c4f927e72c3a8f412e073e193d1cebeb98675a36 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 20 Dec 2020 01:43:50 -0700 Subject: [PATCH] account for dangling opening/closing brace --- .../terra/api/structures/parser/FunctionBuilder.java | 5 ++--- .../dfsek/terra/api/structures/parser/Parser.java | 12 ++++++++++-- common/src/test/java/structure/ParserTest.java | 6 ++---- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/FunctionBuilder.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/FunctionBuilder.java index b340b4bf9..0b596db84 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/FunctionBuilder.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/FunctionBuilder.java @@ -1,13 +1,12 @@ package com.dfsek.terra.api.structures.parser; import com.dfsek.terra.api.structures.parser.exceptions.ParseException; -import com.dfsek.terra.api.structures.parser.lang.Argument; import com.dfsek.terra.api.structures.parser.lang.Function; import java.util.List; -public interface FunctionBuilder { +public interface FunctionBuilder> { T build(List argumentList) throws ParseException; - List> getArguments(); + int getArguments(); } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java index ba9fe389c..d7f0700f2 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java @@ -45,6 +45,14 @@ public class Parser { } catch(TokenizerException e) { throw new ParseException("Failed to tokenize input", e); } + // Check for dangling brackets + int blockLevel = 0; + for(Token t : tokens) { + if(t.getType().equals(Token.Type.BLOCK_BEGIN)) blockLevel++; + else if(t.getType().equals(Token.Type.BLOCK_END)) blockLevel--; + if(blockLevel < 0) throw new ParseException("Dangling closing brace: " + t.getStart()); + } + if(blockLevel != 0) throw new ParseException("Dangling opening brace"); return parseBlock(tokens); } @@ -121,8 +129,8 @@ public class Parser { List arg = args.stream().map(Token::getContent).collect(Collectors.toList()); FunctionBuilder builder = functions.get(identifier.getContent()); - if(arg.size() != builder.getArguments().size()) - throw new ParseException("Expected " + builder.getArguments().size() + " arguments, found " + arg.size() + ": " + identifier.getStart()); + if(arg.size() != builder.getArguments() && builder.getArguments() != -1) + throw new ParseException("Expected " + builder.getArguments() + " arguments, found " + arg.size() + ": " + identifier.getStart()); return functions.get(identifier.getContent()).build(arg); } diff --git a/common/src/test/java/structure/ParserTest.java b/common/src/test/java/structure/ParserTest.java index 3f4cd18d3..29659085f 100644 --- a/common/src/test/java/structure/ParserTest.java +++ b/common/src/test/java/structure/ParserTest.java @@ -5,14 +5,12 @@ import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.structures.parser.FunctionBuilder; import com.dfsek.terra.api.structures.parser.Parser; import com.dfsek.terra.api.structures.parser.exceptions.ParseException; -import com.dfsek.terra.api.structures.parser.lang.Argument; import com.dfsek.terra.api.structures.parser.lang.Function; import com.dfsek.terra.api.structures.parser.lang.Item; import org.apache.commons.io.IOUtils; import org.junit.jupiter.api.Test; import java.io.IOException; -import java.util.Arrays; import java.util.List; public class ParserTest { @@ -27,8 +25,8 @@ public class ParserTest { } @Override - public List> getArguments() { - return Arrays.asList(id -> id, Double::parseDouble); + public int getArguments() { + return 2; } });