Skip to content

Commit b957569

Browse files
committed
Улучшен вывод АСД
1 parent dcc943f commit b957569

10 files changed

+65
-10
lines changed

src/com/annimon/ownlang/Main.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ public static void main(String[] args) throws IOException {
9292
} else {
9393
options.optimizationLevel = 2;
9494
}
95-
return;
95+
break;
9696

9797
case "-r":
9898
case "--repl":

src/com/annimon/ownlang/lib/UserDefinedFunction.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,9 @@ public Value execute(Value... values) {
6262

6363
@Override
6464
public String toString() {
65-
return String.format("function %s %s", arguments.toString(), body.toString());
65+
if (body instanceof ReturnStatement) {
66+
return String.format("def%s = %s", arguments, ((ReturnStatement)body).expression);
67+
}
68+
return String.format("def%s %s", arguments, body);
6669
}
6770
}

src/com/annimon/ownlang/parser/ast/Arguments.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,12 @@ public Iterator<Argument> iterator() {
4444
public String toString() {
4545
final StringBuilder result = new StringBuilder();
4646
result.append('(');
47-
for (Argument arg : arguments) {
48-
result.append(arg).append(", ");
47+
final Iterator<Argument> it = arguments.iterator();
48+
if (it.hasNext()) {
49+
result.append(it.next());
50+
while (it.hasNext()) {
51+
result.append(", ").append(it.next());
52+
}
4953
}
5054
result.append(')');
5155
return result.toString();

src/com/annimon/ownlang/parser/ast/DestructuringAssignmentStatement.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,18 @@ public <R, T> R accept(ResultVisitor<R, T> visitor, T t) {
7070

7171
@Override
7272
public String toString() {
73-
return variables.toString();
73+
final StringBuilder sb = new StringBuilder();
74+
sb.append("extract(");
75+
final Iterator<String> it = variables.iterator();
76+
if (it.hasNext()) {
77+
String variable = it.next();
78+
sb.append(variable == null ? "" : variable);
79+
while (it.hasNext()) {
80+
variable = it.next();
81+
sb.append(", ").append(variable == null ? "" : variable);
82+
}
83+
}
84+
sb.append(") = ").append(containerExpression);
85+
return sb.toString();
7486
}
7587
}

src/com/annimon/ownlang/parser/ast/FunctionDefineStatement.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@ public <R, T> R accept(ResultVisitor<R, T> visitor, T t) {
3636

3737
@Override
3838
public String toString() {
39+
if (body instanceof ReturnStatement) {
40+
return String.format("def %s%s = %s", name, arguments, ((ReturnStatement)body).expression);
41+
}
3942
return String.format("def %s%s %s", name, arguments, body);
4043
}
4144
}

src/com/annimon/ownlang/parser/ast/FunctionalExpression.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.annimon.ownlang.exceptions.UnknownFunctionException;
55
import com.annimon.ownlang.lib.*;
66
import java.util.ArrayList;
7+
import java.util.Iterator;
78
import java.util.List;
89

910
/**
@@ -78,6 +79,20 @@ public <R, T> R accept(ResultVisitor<R, T> visitor, T t) {
7879

7980
@Override
8081
public String toString() {
81-
return functionExpr + "(" + arguments.toString() + ")";
82+
final StringBuilder sb = new StringBuilder();
83+
if (functionExpr instanceof ValueExpression && ((ValueExpression)functionExpr).value.type() == Types.STRING) {
84+
sb.append(((ValueExpression)functionExpr).value.asString()).append('(');
85+
} else {
86+
sb.append(functionExpr).append('(');
87+
}
88+
final Iterator<Expression> it = arguments.iterator();
89+
if (it.hasNext()) {
90+
sb.append(it.next());
91+
while (it.hasNext()) {
92+
sb.append(", ").append(it.next());
93+
}
94+
}
95+
sb.append(')');
96+
return sb.toString();
8297
}
8398
}

src/com/annimon/ownlang/parser/ast/MapExpression.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.annimon.ownlang.lib.MapValue;
44
import com.annimon.ownlang.lib.Value;
5+
import java.util.Iterator;
56
import java.util.Map;
67

78
/**
@@ -38,6 +39,19 @@ public <R, T> R accept(ResultVisitor<R, T> visitor, T t) {
3839

3940
@Override
4041
public String toString() {
41-
return elements.toString();
42+
final StringBuilder sb = new StringBuilder();
43+
sb.append('{');
44+
Iterator<Map.Entry<Expression, Expression>> it = elements.entrySet().iterator();
45+
if (it.hasNext()) {
46+
Map.Entry<Expression, Expression> entry = it.next();
47+
sb.append(entry.getKey()).append(" : ").append(entry.getValue());
48+
while (it.hasNext()) {
49+
entry = it.next();
50+
sb.append(", ");
51+
sb.append(entry.getKey()).append(" : ").append(entry.getValue());
52+
}
53+
}
54+
sb.append('}');
55+
return sb.toString();
4256
}
4357
}

src/com/annimon/ownlang/parser/ast/PrintStatement.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public PrintStatement(Expression expression) {
1616

1717
@Override
1818
public void execute() {
19-
Console.print(expression.eval());
19+
Console.print(expression.eval().asString());
2020
}
2121

2222
@Override

src/com/annimon/ownlang/parser/ast/PrintlnStatement.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public PrintlnStatement(Expression expression) {
1616

1717
@Override
1818
public void execute() {
19-
Console.println(expression.eval());
19+
Console.println(expression.eval().asString());
2020
}
2121

2222
@Override

src/com/annimon/ownlang/parser/ast/ValueExpression.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.annimon.ownlang.lib.FunctionValue;
55
import com.annimon.ownlang.lib.NumberValue;
66
import com.annimon.ownlang.lib.StringValue;
7+
import com.annimon.ownlang.lib.Types;
78
import com.annimon.ownlang.lib.Value;
89

910
/**
@@ -47,6 +48,9 @@ public <R, T> R accept(ResultVisitor<R, T> visitor, T t) {
4748

4849
@Override
4950
public String toString() {
50-
return value.asString();
51+
if (value.type() == Types.STRING) {
52+
return "\"" + value.asString() + "\"";
53+
}
54+
return value.toString();
5155
}
5256
}

0 commit comments

Comments
 (0)