mirror of
https://github.com/PolyhedralDev/Terra.git
synced 2026-02-16 10:30:42 +00:00
Add FailKeyword
This commit is contained in:
@@ -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.keywords.BreakKeyword;
|
||||
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.ReturnKeyword;
|
||||
import com.dfsek.terra.api.structures.parser.lang.keywords.WhileKeyword;
|
||||
@@ -268,7 +269,7 @@ public class Parser {
|
||||
Token token = tokens.get(0);
|
||||
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)
|
||||
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.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.FAIL)) parsedItems.add(new FailKeyword(tokens.remove(0).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);
|
||||
|
||||
@@ -37,6 +37,6 @@ public class Block implements Item<Block.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();
|
||||
}
|
||||
|
||||
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);
|
||||
block.apply(buffer, rotation, 0);
|
||||
Block.ReturnLevel level = block.apply(buffer, rotation, 0);
|
||||
buffer.paste();
|
||||
return !level.equals(Block.ReturnLevel.FAIL);
|
||||
}
|
||||
|
||||
public void executeInBuffer(Buffer buffer, Rotation rotation, int recursions) {
|
||||
|
||||
@@ -207,6 +207,10 @@ public class Token {
|
||||
* Break statement
|
||||
*/
|
||||
BREAK,
|
||||
/**
|
||||
* Fail statement. Like return keyword, but specifies that generation has failed.
|
||||
*/
|
||||
FAIL,
|
||||
/**
|
||||
* ID declaration
|
||||
*/
|
||||
|
||||
@@ -140,6 +140,8 @@ public class Tokenizer {
|
||||
return new Token(tokenString, Token.Type.CONTINUE, new Position(reader.getLine(), reader.getIndex()));
|
||||
if(tokenString.equals("break"))
|
||||
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"))
|
||||
return new Token(tokenString, Token.Type.ID, new Position(reader.getLine(), reader.getIndex()));
|
||||
|
||||
Reference in New Issue
Block a user