temporary commit 3
This commit is contained in:
@@ -25,6 +25,8 @@ class ListenerImpl implements WCFGListener {
|
|||||||
@Getter
|
@Getter
|
||||||
private final Value result;
|
private final Value result;
|
||||||
|
|
||||||
|
private final List<ValueHolder> holders = new ArrayList<>();
|
||||||
|
|
||||||
private interface StackLevel {
|
private interface StackLevel {
|
||||||
Value getValue();
|
Value getValue();
|
||||||
}
|
}
|
||||||
@@ -74,15 +76,22 @@ class ListenerImpl implements WCFGListener {
|
|||||||
|
|
||||||
private void add2Last(Value value) {
|
private void add2Last(Value value) {
|
||||||
StackLevel last = stack.get(stack.size() - 1);
|
StackLevel last = stack.get(stack.size() - 1);
|
||||||
ArrayStackLevel asl;
|
if (last instanceof ArrayStackLevel asl) {
|
||||||
ObjectStackLevel osl;
|
|
||||||
ExpressionStackLevel esl;
|
|
||||||
if ((asl = dynamicCast(last, ArrayStackLevel.class)) != null) {
|
|
||||||
asl.value.add(value);
|
asl.value.add(value);
|
||||||
} else if ((osl = dynamicCast(last, ObjectStackLevel.class)) != null) {
|
if(value instanceof ValueHolder holder) {
|
||||||
osl.value.put(osl.currentKey, value);
|
Value arrayValue = asl.getValue();
|
||||||
|
int index = arrayValue.size() - 1;
|
||||||
|
holder.addDeleter(() -> arrayValue.set(index, holder.getDelegate()));
|
||||||
|
}
|
||||||
|
} else if (last instanceof ObjectStackLevel osl) {
|
||||||
|
String key = osl.currentKey;
|
||||||
osl.currentKey = null;
|
osl.currentKey = null;
|
||||||
} else if((esl = dynamicCast(last, ExpressionStackLevel.class)) != null) {
|
osl.value.put(key, value);
|
||||||
|
if(value instanceof ValueHolder holder) {
|
||||||
|
Value objectValue = osl.getValue();
|
||||||
|
holder.addDeleter(() -> objectValue.put(key, holder.getDelegate()));
|
||||||
|
}
|
||||||
|
} else if(last instanceof ExpressionStackLevel esl) {
|
||||||
esl.elements.add((ObjectValue) value);
|
esl.elements.add((ObjectValue) value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -117,7 +126,12 @@ class ListenerImpl implements WCFGListener {
|
|||||||
@Override
|
@Override
|
||||||
public void enterAssignment(WCFGParser.AssignmentContext ctx) {
|
public void enterAssignment(WCFGParser.AssignmentContext ctx) {
|
||||||
ObjectStackLevel osl = (ObjectStackLevel) stack.get(0);
|
ObjectStackLevel osl = (ObjectStackLevel) stack.get(0);
|
||||||
osl.currentKey = ctx.IDENTIFIER().getText();
|
String key = ctx.IDENTIFIER().getText();
|
||||||
|
osl.currentKey = key;
|
||||||
|
ValueHolder holder = new ValueHolder();
|
||||||
|
holders.add(holder);
|
||||||
|
holder.addDeleter(() -> result.put(key, holder.getDelegate()));
|
||||||
|
result.put(key, holder);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -223,4 +237,10 @@ class ListenerImpl implements WCFGListener {
|
|||||||
public void exitEveryRule(ParserRuleContext ctx) {
|
public void exitEveryRule(ParserRuleContext ctx) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void replaceHolders() {
|
||||||
|
for(ValueHolder holder : holders) {
|
||||||
|
holder.replace();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,12 +1,22 @@
|
|||||||
package net.woggioni.wson.wcfg;
|
package net.woggioni.wson.wcfg;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
import net.woggioni.wson.xface.Value;
|
import net.woggioni.wson.xface.Value;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
public class ValueHolder implements Value {
|
class ValueHolder implements Value {
|
||||||
|
private List<Runnable> deleters = new ArrayList<>();
|
||||||
|
|
||||||
|
public void addDeleter(Runnable runnable) {
|
||||||
|
deleters.add(runnable);
|
||||||
|
}
|
||||||
|
|
||||||
@Setter
|
@Setter
|
||||||
|
@Getter
|
||||||
private Value delegate = Value.Null;
|
private Value delegate = Value.Null;
|
||||||
@Override
|
@Override
|
||||||
public Type type() {
|
public Type type() {
|
||||||
@@ -107,4 +117,10 @@ public class ValueHolder implements Value {
|
|||||||
public boolean has(String key) {
|
public boolean has(String key) {
|
||||||
return delegate.has(key);
|
return delegate.has(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void replace() {
|
||||||
|
for(Runnable run : deleters) {
|
||||||
|
run.run();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -25,7 +25,8 @@ public class ParseTest {
|
|||||||
@ValueSource(strings = {
|
@ValueSource(strings = {
|
||||||
// "build.wcfg",
|
// "build.wcfg",
|
||||||
// "test.wcfg",
|
// "test.wcfg",
|
||||||
"recursive.wcfg",
|
// "recursive.wcfg",
|
||||||
|
"recursive2.wcfg",
|
||||||
})
|
})
|
||||||
public void test(String resource) {
|
public void test(String resource) {
|
||||||
try(Reader reader = new InputStreamReader(getClass().getClassLoader().getResourceAsStream(resource))) {
|
try(Reader reader = new InputStreamReader(getClass().getClassLoader().getResourceAsStream(resource))) {
|
||||||
@@ -37,6 +38,7 @@ public class ParseTest {
|
|||||||
ListenerImpl listener = new ListenerImpl(cfg);
|
ListenerImpl listener = new ListenerImpl(cfg);
|
||||||
ParseTreeWalker walker = new ParseTreeWalker();
|
ParseTreeWalker walker = new ParseTreeWalker();
|
||||||
walker.walk(listener, parser.wcfg());
|
walker.walk(listener, parser.wcfg());
|
||||||
|
listener.replaceHolders();
|
||||||
Value result = listener.getResult();
|
Value result = listener.getResult();
|
||||||
new JSONDumper(cfg).dump(result, System.out);
|
new JSONDumper(cfg).dump(result, System.out);
|
||||||
}
|
}
|
||||||
|
@@ -3,4 +3,6 @@ value1 := {
|
|||||||
"myself" : value1
|
"myself" : value1
|
||||||
};
|
};
|
||||||
|
|
||||||
value2 := [value1];
|
value2 := [value1];
|
||||||
|
|
||||||
|
value3 := [1, 2, value3, null, false];
|
1
wcfg/src/test/resources/recursive2.wcfg
Normal file
1
wcfg/src/test/resources/recursive2.wcfg
Normal file
@@ -0,0 +1 @@
|
|||||||
|
value := [1, 2, value, null, false];
|
Reference in New Issue
Block a user