mirror of
https://github.com/PolyhedralDev/Terra.git
synced 2026-10-26 14:00:14 +00:00
Add FailKeyword
This commit is contained in:
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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+30
@@ -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()));
|
||||||
|
|||||||
Reference in new issue
Block a user