Add FailKeyword

This commit is contained in:
dfsek committed 2020-12-24 23:10:14 -07:00
1 parent 0780539326
commit aaa0c99524
6 files changed
+50 -4

No files matched your search

@@ -16,6 +16,7 @@ import com.dfsek.terra.api.structures.parser.lang.functions.builtin.PowFunction;
import com.dfsek.terra.api.structures.parser.lang.functions.builtin.SqrtFunction; import com.dfsek.terra.api.structures.parser.lang.functions.builtin.SqrtFunction;
import com.dfsek.terra.api.structures.parser.lang.keywords.BreakKeyword; import com.dfsek.terra.api.structures.parser.lang.keywords.BreakKeyword;
import com.dfsek.terra.api.structures.parser.lang.keywords.ContinueKeyword; import com.dfsek.terra.api.structures.parser.lang.keywords.ContinueKeyword;
import com.dfsek.terra.api.structures.parser.lang.keywords.FailKeyword;
import com.dfsek.terra.api.structures.parser.lang.keywords.IfKeyword; import com.dfsek.terra.api.structures.parser.lang.keywords.IfKeyword;
import com.dfsek.terra.api.structures.parser.lang.keywords.ReturnKeyword; import com.dfsek.terra.api.structures.parser.lang.keywords.ReturnKeyword;
import com.dfsek.terra.api.structures.parser.lang.keywords.WhileKeyword; import com.dfsek.terra.api.structures.parser.lang.keywords.WhileKeyword;
@@ -268,7 +269,7 @@ public class Parser {
Token token = tokens.get(0); Token token = tokens.get(0);
if(token.getType().equals(Token.Type.BLOCK_END)) break; // Stop parsing at block end. if(token.getType().equals(Token.Type.BLOCK_END)) break; // Stop parsing at block end.
ParserUtil.checkType(token, Token.Type.IDENTIFIER, Token.Type.IF_STATEMENT, Token.Type.WHILE_LOOP, Token.Type.NUMBER_VARIABLE, Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE, Token.Type.RETURN, Token.Type.BREAK, Token.Type.CONTINUE); ParserUtil.checkType(token, Token.Type.IDENTIFIER, Token.Type.IF_STATEMENT, Token.Type.WHILE_LOOP, Token.Type.NUMBER_VARIABLE, Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE, Token.Type.RETURN, Token.Type.BREAK, Token.Type.CONTINUE, Token.Type.FAIL);
if(token.isLoopLike()) { // Parse loop-like tokens (if, while, etc) if(token.isLoopLike()) { // Parse loop-like tokens (if, while, etc)
parsedItems.add(parseLoopLike(tokens, parsedVariables)); parsedItems.add(parseLoopLike(tokens, parsedVariables));
@@ -299,6 +300,7 @@ public class Parser {
} else if(token.getType().equals(Token.Type.RETURN)) parsedItems.add(new ReturnKeyword(tokens.remove(0).getPosition())); } else if(token.getType().equals(Token.Type.RETURN)) parsedItems.add(new ReturnKeyword(tokens.remove(0).getPosition()));
else if(token.getType().equals(Token.Type.BREAK)) parsedItems.add(new BreakKeyword(tokens.remove(0).getPosition())); else if(token.getType().equals(Token.Type.BREAK)) parsedItems.add(new BreakKeyword(tokens.remove(0).getPosition()));
else if(token.getType().equals(Token.Type.CONTINUE)) parsedItems.add(new ContinueKeyword(tokens.remove(0).getPosition())); else if(token.getType().equals(Token.Type.CONTINUE)) parsedItems.add(new ContinueKeyword(tokens.remove(0).getPosition()));
else if(token.getType().equals(Token.Type.FAIL)) parsedItems.add(new FailKeyword(tokens.remove(0).getPosition()));
else throw new UnsupportedOperationException("Unexpected token " + token.getType() + ": " + token.getPosition()); else throw new UnsupportedOperationException("Unexpected token " + token.getType() + ": " + token.getPosition());
if(!tokens.isEmpty()) ParserUtil.checkType(tokens.remove(0), Token.Type.STATEMENT_END, Token.Type.BLOCK_END); if(!tokens.isEmpty()) ParserUtil.checkType(tokens.remove(0), Token.Type.STATEMENT_END, Token.Type.BLOCK_END);
@@ -37,6 +37,6 @@ public class Block implements Item<Block.ReturnLevel> {
} }
public enum ReturnLevel { public enum ReturnLevel {
NONE, BREAK, CONTINUE, RETURN NONE, BREAK, CONTINUE, RETURN, FAIL
} }
} }
@@ -0,0 +1,30 @@
package com.dfsek.terra.api.structures.parser.lang.keywords;
import com.dfsek.terra.api.structures.parser.lang.Block;
import com.dfsek.terra.api.structures.parser.lang.Keyword;
import com.dfsek.terra.api.structures.structure.Rotation;
import com.dfsek.terra.api.structures.structure.buffer.Buffer;
import com.dfsek.terra.api.structures.tokenizer.Position;
public class FailKeyword implements Keyword<Block.ReturnLevel> {
private final Position position;
public FailKeyword(Position position) {
this.position = position;
}
@Override
public Block.ReturnLevel apply(Buffer buffer, Rotation rotation, int recursions) {
return Block.ReturnLevel.FAIL;
}
@Override
public Position getPosition() {
return position;
}
@Override
public ReturnType returnType() {
return ReturnType.VOID;
}
}
@@ -44,10 +44,18 @@ public class StructureScript {
this.id = parser.getID(); this.id = parser.getID();
} }
public void execute(Location location, Rotation rotation) { /**
* Paste the structure at a location
*
* @param location Location to paste structure
* @param rotation Rotation of structure
* @return Whether generation was successful
*/
public boolean execute(Location location, Rotation rotation) {
StructureBuffer buffer = new StructureBuffer(location); StructureBuffer buffer = new StructureBuffer(location);
block.apply(buffer, rotation, 0); Block.ReturnLevel level = block.apply(buffer, rotation, 0);
buffer.paste(); buffer.paste();
return !level.equals(Block.ReturnLevel.FAIL);
} }
public void executeInBuffer(Buffer buffer, Rotation rotation, int recursions) { public void executeInBuffer(Buffer buffer, Rotation rotation, int recursions) {
@@ -207,6 +207,10 @@ public class Token {
* Break statement * Break statement
*/ */
BREAK, BREAK,
/**
* Fail statement. Like return keyword, but specifies that generation has failed.
*/
FAIL,
/** /**
* ID declaration * ID declaration
*/ */
@@ -140,6 +140,8 @@ public class Tokenizer {
return new Token(tokenString, Token.Type.CONTINUE, new Position(reader.getLine(), reader.getIndex())); return new Token(tokenString, Token.Type.CONTINUE, new Position(reader.getLine(), reader.getIndex()));
if(tokenString.equals("break")) if(tokenString.equals("break"))
return new Token(tokenString, Token.Type.BREAK, new Position(reader.getLine(), reader.getIndex())); return new Token(tokenString, Token.Type.BREAK, new Position(reader.getLine(), reader.getIndex()));
if(tokenString.equals("fail"))
return new Token(tokenString, Token.Type.FAIL, new Position(reader.getLine(), reader.getIndex()));
if(tokenString.equals("id")) if(tokenString.equals("id"))
return new Token(tokenString, Token.Type.ID, new Position(reader.getLine(), reader.getIndex())); return new Token(tokenString, Token.Type.ID, new Position(reader.getLine(), reader.getIndex()));