diff --git a/src/dev/peerat/parser/java/JavaParser.java b/src/dev/peerat/parser/java/JavaParser.java index 5d4bc12..8175381 100644 --- a/src/dev/peerat/parser/java/JavaParser.java +++ b/src/dev/peerat/parser/java/JavaParser.java @@ -26,7 +26,12 @@ import dev.peerat.parser.java.Function.FunctionContainer; import dev.peerat.parser.java.Operation.OperationContainer; import dev.peerat.parser.java.Value.BiValue; import dev.peerat.parser.java.Variable.VariableContainer; +import dev.peerat.parser.java.operation.BreakOperation; +import dev.peerat.parser.java.operation.ContinueOperation; +import dev.peerat.parser.java.operation.IfOperation; import dev.peerat.parser.java.operation.ReturnOperation; +import dev.peerat.parser.java.operation.SynchronizedOperation; +import dev.peerat.parser.java.operation.ThrowOperation; import dev.peerat.parser.state.BuilderStateTree; import dev.peerat.parser.state.InitialStateTree; import dev.peerat.parser.state.RedirectStateTree; @@ -571,10 +576,16 @@ public class JavaParser extends Parser { if(parent instanceof OperationContainer) ((OperationContainer)parent).addOperation(op); return null; }); + operation.then((validator) -> validator.validate((token) -> token.getValue().equals("throw"))) - .then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))) + .then(new RedirectStateTree<>(value_container, (global, local) -> global.set(local.get()))) .then((validator) -> validator.validate((token) -> token.getValue().equals(";"))) - .end((a,b) -> a); + .end((parent,bag) -> { + ThrowOperation op = new ThrowOperation(bag.get()); + if(parent instanceof OperationContainer) ((OperationContainer)parent).addOperation(op); + return null; + }); + operation.then((validator) -> validator.validate((token) -> token.getValue().equals("do"))) .then((validator) -> validator.validate((token) -> token.getValue().equals("{"))) .end((a,b) -> a) @@ -627,15 +638,29 @@ public class JavaParser extends Parser { operation.then((validator) -> validator.validate((token) -> token.getValue().equals("continue"))) .then((validator) -> validator.validate((token) -> token.getValue().equals(";"))) - .end((a,b) -> a); + .end((parent,bag) -> { + ContinueOperation op = new ContinueOperation(); + if(parent instanceof OperationContainer) ((OperationContainer)parent).addOperation(op); + return null; + }); + operation.then((validator) -> validator.validate((token) -> token.getValue().equals("break"))) .then((validator) -> validator.validate((token) -> token.getValue().equals(";"))) - .end((a,b) -> a); + .end((parent,bag) -> { + BreakOperation op = new BreakOperation(); + if(parent instanceof OperationContainer) ((OperationContainer)parent).addOperation(op); + return null; + }); + StateTree operation_if = operation.then((validator) -> validator.validate((token) -> token.getValue().equals("if"))) .then((validator) -> validator.validate((token) -> token.getValue().equals("("))) - .then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))) + .then(new RedirectStateTree<>(value_container, (global, local) -> global.set(local.get()))) .then((validator) -> validator.validate((token) -> token.getValue().equals(")"))) - .end((a,b) -> a); + .end((parent,bag) -> { + IfOperation op = new IfOperation(bag.get()); + if(parent instanceof OperationContainer) ((OperationContainer)parent).addOperation(op); + return op; + }); operation_if.then(operation); operation_if.then((validator) -> validator.validate((token) -> token.getValue().equals("{"))) .end((a,b) -> a) @@ -736,10 +761,14 @@ public class JavaParser extends Parser { operation.then((validator) -> validator.validate((token) -> token.getValue().equals("synchronized"))) .then((validator) -> validator.validate((token) -> token.getValue().equals("("))) - .then(new RedirectStateTree<>(value_container, (global, local) -> global.set(null))) + .then(new RedirectStateTree<>(value_container, (global, local) -> global.set(local.get()))) .then((validator) -> validator.validate((token) -> token.getValue().equals(")"))) .then((validator) -> validator.validate((token) -> token.getValue().equals("{"))) - .end((a,b) -> a) + .end((parent,bag) -> { + SynchronizedOperation op = new SynchronizedOperation(bag.get()); + if(parent instanceof OperationContainer) ((OperationContainer)parent).addOperation(op); + return op; + }) .multiple(function_container) .unique((validator) -> validator.validate((token) -> token.getValue().equals("}"))) .end((a,b) -> a);