Capture base composant + named

This commit is contained in:
jeffcheasey88 2023-07-12 18:28:53 +02:00
parent da9bb2df4d
commit 6372fbea83

View file

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