-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathTabloidToPythonListener.java
More file actions
183 lines (156 loc) · 6.61 KB
/
TabloidToPythonListener.java
File metadata and controls
183 lines (156 loc) · 6.61 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
import java.util.ArrayList;
import java.util.List;
// Listener that converts Tabloid source to Python code
public class TabloidToPythonListener extends TabloidBaseListener {
// Buffer for the generated Python code
private StringBuilder pythonCode = new StringBuilder();
// Current indentation level
private int indentLevel = 0;
// Create indentation matching the current level
private String indent() {
return " ".repeat(indentLevel);
}
// Return the generated Python code as a String
public String getPythonCode() {
return pythonCode.toString();
}
@Override
public void enterAnathesi(TabloidParser.AnathesiContext ctx) {
// Assignment
String var = ctx.ID().getText();
String expr = transformExpr(ctx.ekfrasi().getText());
pythonCode.append(indent()).append(var).append(" = ").append(expr).append("\n");
}
@Override
public void enterEktypwsi(TabloidParser.EktypwsiContext ctx) {
// Print statement
String expr = transformExpr(ctx.ekfrasi().getText());
pythonCode.append(indent()).append("print(").append(expr).append(")\n");
}
// Function return
@Override
public void enterEpistrofi(TabloidParser.EpistrofiContext ctx) {
if (ctx.ekfrasi() != null) {
String expr = transformExpr(ctx.ekfrasi().getText());
pythonCode.append(indent()).append("return ").append(expr).append("\n");
} else {
pythonCode.append(indent()).append("return\n");
}
}
// Function definition
@Override
public void enterDhmiourgiasynartishs(TabloidParser.DhmiourgiasynartishsContext ctx) {
String name = ctx.ID().getText();
List<String> params = new ArrayList<>();
for (var param : ctx.parametroi().ID()) {
params.add(param.getText());
}
pythonCode.append(indent())
.append("def ").append(name).append("(")
.append(String.join(", ", params))
.append("):\n");
indentLevel++;
// Increase indent for function body
}
// Decrease indent when the function ends
@Override
public void exitDhmiourgiasynartishs(TabloidParser.DhmiourgiasynartishsContext ctx) {
indentLevel--;
}
// If statement with condition
@Override
public void enterIf(TabloidParser.IfContext ctx) {
String left = transformExpr(ctx.synthiki().ekfrasi(0).getText());
String op = convertOperator(ctx.synthiki().sygkritis().getText());
String right = transformExpr(ctx.synthiki().ekfrasi(1).getText());
pythonCode.append(indent())
.append("if ").append(left).append(" ").append(op).append(" ").append(right).append(":\n");
indentLevel++;
}
@Override
public void exitIf(TabloidParser.IfContext ctx) {
indentLevel--;
if (ctx.getText().contains("LIES!")) {
pythonCode.append(indent()).append("else:\n");
indentLevel++;
}
}
// While loop
@Override
public void enterWhile(TabloidParser.WhileContext ctx) {
String left = transformExpr(ctx.synthiki().ekfrasi(0).getText());
String op = convertOperator(ctx.synthiki().sygkritis().getText());
String right = transformExpr(ctx.synthiki().ekfrasi(1).getText());
pythonCode.append(indent())
.append("while ").append(left).append(" ").append(op).append(" ").append(right).append(":\n");
indentLevel++;
}
@Override
public void exitWhile(TabloidParser.WhileContext ctx) {// Termatismos to while block
indentLevel--;
}
@Override
public void enterKlhsh(TabloidParser.KlhshContext ctx) {
// Function call with arguments
String funcName = ctx.ID().getText();
List<String> args = new ArrayList<>();
if (ctx.listaOrismatwn() != null) {
for (var expr : ctx.listaOrismatwn().ekfrasi()) {
args.add(transformExpr(expr.getText()));
}
}
pythonCode.append(indent())
.append(funcName).append("(")
.append(String.join(", ", args))
.append(")\n");
}
@Override
public void enterEisodos(TabloidParser.EisodosContext ctx) {
// Read user input
String var = ctx.ID().getText();
pythonCode.append(indent())
.append(var).append(" = input(\"").append(var).append(": \")\n");
}
private String convertOperator(String op) {
// Map Tabloid operators to Python
return switch (op) {
case "PLUS" -> "+";
case "MINUS" -> "-";
case "TIMES" -> "*";
case "DIVIDED BY" -> "/";
case "MODULO" -> "%";
case "AND" -> "and";
case "OR" -> "or";
case "SMALLER THAN", "LESS THAN" -> "<";
case "BIGGER THAN", "BEATS" -> ">";
case "EQUAL TO", "IS ACTUALLY" -> "==";
case "NOT EQUAL TO" -> "!=";
default -> op;
};
}
private String transformExpr(String expr) {
// Convert a Tabloid expression into Python-friendly form
expr = expr.replaceAll("(?<=[a-z])(?=[A-Z])", " ");
expr = expr.replaceAll("(?<=[A-Z])(?=[A-Z][a-z])", " ");
expr = expr.replaceAll("(?<=[a-zA-Z])(?=[0-9])", " ");
expr = expr.replaceAll("(?<=[0-9])(?=[a-zA-Z])", " ");
expr = expr.replaceAll("\\s+", " ");
// Keyword-to-operator replacements
expr = expr.replaceAll("\\bTRUE\\b|\\bTOTALLY RIGHT\\b", "True");
expr = expr.replaceAll("\\bFALSE\\b|\\bCOMPLETELY WRONG\\b", "False");
expr = expr.replaceAll("\\bSMALLER THAN\\b|\\bLESS THAN\\b", "<");
expr = expr.replaceAll("\\bBIGGER THAN\\b|\\bBEATS\\b", ">");
expr = expr.replaceAll("\\bEQUAL TO\\b|\\bIS ACTUALLY\\b", "==");
expr = expr.replaceAll("\\bNOT EQUAL TO\\b", "!=");
expr = expr.replaceAll("\\bPLUS\\b", "+");
expr = expr.replaceAll("\\bMINUS\\b", "-");
expr = expr.replaceAll("\\bTIMES\\b", "*");
expr = expr.replaceAll("\\bDIVIDED BY\\b", "/");
expr = expr.replaceAll("\\bMODULO\\b", "%");
expr = expr.replaceAll("\\bAND\\b", "and");
expr = expr.replaceAll("\\bOR\\b", "or");
// Turn "FUNCTION OF x" into "FUNCTION(x)"
expr = expr.replaceAll("\\b(\\w+)\\s+OF\\s+([^\\n\\r]+)", "$1($2)");
return expr.trim();
}
}