diff --git a/src/be/jeffcheasey88/peeratcode/parser/state/generator/ParserComposantGenerator.java b/src/be/jeffcheasey88/peeratcode/parser/state/generator/ParserComposantGenerator.java index 2247f45..6211021 100644 --- a/src/be/jeffcheasey88/peeratcode/parser/state/generator/ParserComposantGenerator.java +++ b/src/be/jeffcheasey88/peeratcode/parser/state/generator/ParserComposantGenerator.java @@ -17,7 +17,9 @@ import be.jeffcheasey88.peeratcode.parser.Tokenizer; import be.jeffcheasey88.peeratcode.parser.state.RedirectStateTree; import be.jeffcheasey88.peeratcode.parser.state.StateTree; import be.jeffcheasey88.peeratcode.parser.state.generator.ParserComposantGenerator.Element.SynthaxeComposant; +import be.jeffcheasey88.peeratcode.parser.state.generator.ParserComposantGenerator.Element.SynthaxeComposant.Composant.ComposantCall; import be.jeffcheasey88.peeratcode.parser.state.generator.ParserComposantGenerator.Element.SynthaxeComposant.Composant.NamedElement; +import be.jeffcheasey88.peeratcode.parser.state.generator.ParserComposantGenerator.Element.SynthaxeComposant.Composant.Redirection; import be.jeffcheasey88.peeratcode.parser.state.generator.ParserComposantGenerator.Element.SynthaxeComposant.Composant.Validator; public class ParserComposantGenerator { @@ -83,13 +85,21 @@ public class ParserComposantGenerator { .then((v) -> v.validate( (t) -> t.getType().equals(TokenType.NAME), (bag, t) -> bag.set(t))); - leftSide.end((composant, bag) -> new NamedElement(bag)); + leftSide.end((composant, bag) -> { + Element result = new NamedElement(bag); + bag.set(result); + return result; + }); leftSide.then((v) -> v.validate((t) -> t.getValue().equals("(")) && v.validate((t) -> t.getType().equals(TokenType.NAME), (bag, t) -> bag.set("inside", t)) && v.validate((t) -> t.getValue().equals(")")) ) - .end((composant, bag) -> new NamedElement(bag)); + .end((composant, bag) -> { + Element result = new NamedElement(bag); + bag.set(result); + return result; + }); StateTree gotoValidator = new StateTree<>(); gotoValidator.then((v) -> v.validate( @@ -99,16 +109,25 @@ public class ParserComposantGenerator { .end((composant, bag) -> composant); StateTree redirection = new StateTree<>(); - redirection.then((v) -> v.validate((t) -> { - return t.getType().equals(TokenType.NAME); - })).end((composant, bag) -> composant); + redirection.then((v) -> v.validate((t) -> + t.getType().equals(TokenType.NAME), + (bag, t) -> bag.set(t) + )).end((composant, bag) -> { + Element result = new Redirection(bag); + bag.set(result); + return result; + }); StateTree methodCall = new StateTree<>(); methodCall.then((v) -> v.validate((t) -> t.getValue().equals(":"))) .then((v) -> v.validate( (t) -> t.getType().equals(TokenType.NAME), (bag, t) -> bag.set(t))) - .end((composant, bag) -> composant); + .end((composant, bag) -> { + Element result = new ComposantCall(bag); + bag.set(result); + return result; + }); StateTree operations = new StateTree<>(); StateTree operation = new StateTree<>(); @@ -129,18 +148,30 @@ public class ParserComposantGenerator { StateTree op_validator = operation.then(new RedirectStateTree<>(validator, (bag) -> "validator")); op_validator.end((composant, bag) -> { - System.out.println("+\t"+bag); + return bag.get("validator").get(); + }).then(op_childs); + op_validator.then(new RedirectStateTree<>(namedValidator, (bag) -> "namedValidator")).end((composant, bag) -> { + bag.get("namedValidator").get().child = bag.get("validator").get(); return composant; }).then(op_childs); - op_validator.then(new RedirectStateTree<>(namedValidator, (bag) -> "namedValidator")).end((composant, bag) -> composant).then(op_childs); StateTree op_call = operation.then(new RedirectStateTree<>(methodCall, (bag) -> "methodCall")); - op_call.end((composant, bag) -> composant).then(op_childs); - op_call.then(new RedirectStateTree<>(namedValidator, (bag) -> "namedValidator")).end((composant, bag) -> composant).then(op_childs); + op_call.end((composant, bag) -> { + return bag.get("methodCall").get(); + }).then(op_childs); + op_call.then(new RedirectStateTree<>(namedValidator, (bag) -> "namedValidator")).end((composant, bag) -> { + bag.get("namedValidator").get().child = bag.get("methodCall").get(); + return composant; + }).then(op_childs); StateTree op_redirect = operation.then(new RedirectStateTree<>(redirection, (bag) -> "redirection")); - op_redirect.end((composant, bag) -> composant).then(op_childs); - op_redirect.then(new RedirectStateTree<>(namedValidator, (bag) -> "namedValidator")).end((composant, bag) -> composant).then(op_childs); + op_redirect.end((composant, bag) -> { + return bag.get("redirection").get(); + }).then(op_childs); + op_redirect.then(new RedirectStateTree<>(namedValidator, (bag) -> "namedValidator")).end((composant, bag) -> { + bag.get("namedValidator").get().child = bag.get("redirection").get(); + return composant; + }).then(op_childs); StateTree suit = operations.then(new RedirectStateTree<>(operation, (bag) -> "operation")).loop(); suit.then((v) -> v.validate((t) -> t.getValue().equals(","))) @@ -234,6 +265,8 @@ public class ParserComposantGenerator { private String logic; private String name; + private Element child; + public NamedElement(Bag bag){ Token inside = bag.get("inside"); if(inside != null){ @@ -242,7 +275,11 @@ public class ParserComposantGenerator { }else{ this.name = bag.get().getValue(); } - System.out.println(logic+"("+name+")"); + } + + @Override + public String toString(){ + return child+" -> "+((logic == null) ? name : logic+"("+name+")"); } } @@ -251,18 +288,30 @@ public class ParserComposantGenerator { private String target; - public Redirection(){} + public Redirection(Bag bag){ + this.target = bag.get().getValue(); + System.out.println(this); + } + @Override + public String toString(){ + return target; + } } public static class ComposantCall extends Element{ private String name; - public ComposantCall(){ - + public ComposantCall(Bag bag){ + this.name = bag.get().getValue(); + System.out.println(this); } + @Override + public String toString(){ + return ":"+name; + } } }