@@ -59,12 +59,13 @@ class MCFPPExprVisitor(private var defaultGenericClassType : MCFPPGenericClassTy
59
59
val f = NoStackFunction (" expression_${UUID .randomUUID()} " ,Function .currFunction)
60
60
Function .currFunction = f
61
61
return if (ctx.primary() != null ){
62
- val q = visit(ctx.primary())
62
+ currSelector = null
63
+ val q = visitPrimary(ctx.primary())
63
64
Function .currFunction = l
64
65
l.commands.addAll(f.commands)
65
66
q
66
67
}else {
67
- val q = visit (ctx.conditionalOrExpression())
68
+ val q = visitConditionalOrExpression (ctx.conditionalOrExpression())
68
69
Function .currFunction = l
69
70
l.commands.addAll(f.commands)
70
71
q
@@ -81,10 +82,10 @@ class MCFPPExprVisitor(private var defaultGenericClassType : MCFPPGenericClassTy
81
82
@Override
82
83
override fun visitConditionalOrExpression (ctx : mcfppParser.ConditionalOrExpressionContext ): Var <* > {
83
84
Project .ctx = ctx
84
- visitConditionalOrExpressionRe = visit (ctx.conditionalAndExpression(0 ))
85
+ visitConditionalOrExpressionRe = visitConditionalAndExpression (ctx.conditionalAndExpression(0 ))
85
86
processVarCache.add(visitConditionalOrExpressionRe!! )
86
87
for (i in 1 until ctx.conditionalAndExpression().size) {
87
- var b: Var <* >? = visit (ctx.conditionalAndExpression(i))
88
+ var b: Var <* >? = visitConditionalAndExpression (ctx.conditionalAndExpression(i))
88
89
if (b is MCFloat ) b = b.toTempEntity()
89
90
if (visitConditionalOrExpressionRe!! != MCFloat .ssObj){
90
91
visitConditionalOrExpressionRe = visitConditionalOrExpressionRe!! .getTempVar()
@@ -106,10 +107,10 @@ class MCFPPExprVisitor(private var defaultGenericClassType : MCFPPGenericClassTy
106
107
@Override
107
108
override fun visitConditionalAndExpression (ctx : mcfppParser.ConditionalAndExpressionContext ): Var <* > {
108
109
Project .ctx = ctx
109
- visitConditionalAndExpressionRe = visit (ctx.equalityExpression(0 ))
110
+ visitConditionalAndExpressionRe = visitEqualityExpression (ctx.equalityExpression(0 ))
110
111
processVarCache.add(visitConditionalAndExpressionRe!! )
111
112
for (i in 1 until ctx.equalityExpression().size) {
112
- val b: Var <* >? = visit (ctx.equalityExpression(i))
113
+ val b: Var <* >? = visitEqualityExpression (ctx.equalityExpression(i))
113
114
visitConditionalAndExpressionRe = visitConditionalAndExpressionRe!! .binaryComputation(b!! , " &&" )
114
115
processVarCache[processVarCache.size - 1 ] = visitConditionalAndExpressionRe!!
115
116
}
@@ -125,9 +126,9 @@ class MCFPPExprVisitor(private var defaultGenericClassType : MCFPPGenericClassTy
125
126
@Override
126
127
override fun visitEqualityExpression (ctx : mcfppParser.EqualityExpressionContext ): Var <* > {
127
128
Project .ctx = ctx
128
- var re: Var <* > = visit (ctx.relationalExpression(0 ))
129
+ var re: Var <* > = visitRelationalExpression (ctx.relationalExpression(0 ))
129
130
if (ctx.relationalExpression().size != 1 ) {
130
- val b: Var <* > = visit (ctx.relationalExpression(1 ))
131
+ val b: Var <* > = visitRelationalExpression (ctx.relationalExpression(1 ))
131
132
if (! re.isTemp){
132
133
re = re.getTempVar()
133
134
}
@@ -144,9 +145,9 @@ class MCFPPExprVisitor(private var defaultGenericClassType : MCFPPGenericClassTy
144
145
@Override
145
146
override fun visitRelationalExpression (ctx : mcfppParser.RelationalExpressionContext ): Var <* > {
146
147
Project .ctx = ctx
147
- var re: Var <* > = visit (ctx.additiveExpression(0 ))
148
+ var re: Var <* > = visitAdditiveExpression (ctx.additiveExpression(0 ))
148
149
if (ctx.additiveExpression().size != 1 ) {
149
- val b: Var <* > = visit (ctx.additiveExpression(1 ))
150
+ val b: Var <* > = visitAdditiveExpression (ctx.additiveExpression(1 ))
150
151
re = re.binaryComputation(b, ctx.relationalOp().text)
151
152
}
152
153
return re
@@ -161,10 +162,10 @@ class MCFPPExprVisitor(private var defaultGenericClassType : MCFPPGenericClassTy
161
162
@Override
162
163
override fun visitAdditiveExpression (ctx : mcfppParser.AdditiveExpressionContext ): Var <* > {
163
164
Project .ctx = ctx
164
- visitAdditiveExpressionRe = visit (ctx.multiplicativeExpression(0 ))
165
+ visitAdditiveExpressionRe = visitMultiplicativeExpression (ctx.multiplicativeExpression(0 ))
165
166
processVarCache.add(visitAdditiveExpressionRe!! )
166
167
for (i in 1 until ctx.multiplicativeExpression().size) {
167
- var b: Var <* >? = visit (ctx.multiplicativeExpression(i))
168
+ var b: Var <* >? = visitMultiplicativeExpression (ctx.multiplicativeExpression(i))
168
169
if (b is MCFloat ) {
169
170
b = b.toTempEntity()
170
171
if (visitAdditiveExpressionRe!! != MCFloat .ssObj){
@@ -188,10 +189,10 @@ class MCFPPExprVisitor(private var defaultGenericClassType : MCFPPGenericClassTy
188
189
@Override
189
190
override fun visitMultiplicativeExpression (ctx : mcfppParser.MultiplicativeExpressionContext ): Var <* > {
190
191
Project .ctx = ctx
191
- visitMultiplicativeExpressionRe = visit (ctx.unaryExpression(0 ))
192
+ visitMultiplicativeExpressionRe = visitUnaryExpression (ctx.unaryExpression(0 ))
192
193
processVarCache.add(visitMultiplicativeExpressionRe!! )
193
194
for (i in 1 until ctx.unaryExpression().size) {
194
- var b: Var <* >? = visit (ctx.unaryExpression(i))
195
+ var b: Var <* >? = visitUnaryExpression (ctx.unaryExpression(i))
195
196
if (b is MCFloat ) b = b.toTempEntity()
196
197
if (visitMultiplicativeExpressionRe != MCFloat .ssObj){
197
198
visitMultiplicativeExpressionRe = visitMultiplicativeExpressionRe!! .getTempVar()
@@ -212,13 +213,13 @@ class MCFPPExprVisitor(private var defaultGenericClassType : MCFPPGenericClassTy
212
213
override fun visitUnaryExpression (ctx : mcfppParser.UnaryExpressionContext ): Var <* > {
213
214
Project .ctx = ctx
214
215
return if (ctx.rightVarExpression() != null ) {
215
- visit (ctx.rightVarExpression())
216
+ visitRightVarExpression (ctx.rightVarExpression())
216
217
} else if (ctx.unaryExpression() != null ) {
217
- val a: Var <* > = visit (ctx.unaryExpression())
218
+ val a: Var <* > = visitUnaryExpression (ctx.unaryExpression())
218
219
a.unaryComputation(" !" )
219
220
} else {
220
221
// 类型强制转换
221
- visit (ctx.castExpression())
222
+ visitCastExpression (ctx.castExpression())
222
223
}
223
224
}
224
225
@@ -231,7 +232,7 @@ class MCFPPExprVisitor(private var defaultGenericClassType : MCFPPGenericClassTy
231
232
@Override
232
233
override fun visitCastExpression (ctx : mcfppParser.CastExpressionContext ): Var <* > {
233
234
Project .ctx = ctx
234
- val a: Var <* > = visit (ctx.unaryExpression())
235
+ val a: Var <* > = visitUnaryExpression (ctx.unaryExpression())
235
236
return a.explicitCast(MCFPPType .parseFromIdentifier(ctx.type().text, Function .currFunction.field)? : run {
236
237
LogProcessor .error(TextTranslator .INVALID_TYPE_ERROR .translate(ctx.type().text))
237
238
MCFPPBaseType .Any
@@ -246,29 +247,14 @@ class MCFPPExprVisitor(private var defaultGenericClassType : MCFPPGenericClassTy
246
247
*/
247
248
@Override
248
249
override fun visitRightVarExpression (ctx : mcfppParser.RightVarExpressionContext ): Var <* > {
249
- val qwq = visit (ctx.basicExpression ())
250
+ val qwq = visitVarWithSelector (ctx.varWithSelector ())
250
251
return if (qwq is PropertyVar ){
251
252
qwq.getter(qwq.caller)
252
253
}else {
253
254
qwq
254
255
}
255
256
}
256
257
257
- /* *
258
- * 计算一个基本的表达式。可能是一个变量,也可能是一个数值
259
- * @param ctx the parse tree
260
- * @return 表达式的值
261
- */
262
- @Override
263
- override fun visitBasicExpression (ctx : mcfppParser.BasicExpressionContext ): Var <* > {
264
- Project .ctx = ctx
265
- return if (ctx.jvmAccessExpression() != null ) {
266
- visitJvmAccessExpression(ctx.jvmAccessExpression())
267
- } else {
268
- visit(ctx.varWithSelector())
269
- }
270
- }
271
-
272
258
/* *
273
259
* 从类中选择一个成员。返回的成员包含了它所在的对象的信息
274
260
*
@@ -278,11 +264,20 @@ class MCFPPExprVisitor(private var defaultGenericClassType : MCFPPGenericClassTy
278
264
@Override
279
265
override fun visitVarWithSelector (ctx : mcfppParser.VarWithSelectorContext ): Var <* > {
280
266
Project .ctx = ctx
267
+ currSelector = null
281
268
if (ctx.jvmAccessExpression() != null ){
282
269
currSelector = visitJvmAccessExpression(ctx.jvmAccessExpression())
283
- }
284
- if (currSelector is UnknownVar ){
285
- val typeStr = ctx.jvmAccessExpression()?.text? : ctx.type().text
270
+ if (currSelector is UnknownVar ){
271
+ val typeStr = ctx.jvmAccessExpression().text
272
+ val type = MCFPPType .parseFromIdentifier(typeStr, Function .currFunction.field)
273
+ if (type == null ){
274
+ LogProcessor .error(TextTranslator .VARIABLE_NOT_DEFINED .translate(currSelector!! .identifier))
275
+ }else {
276
+ currSelector = ObjectVar (type)
277
+ }
278
+ }
279
+ }else {
280
+ val typeStr = ctx.type().text
286
281
val type = MCFPPType .parseFromIdentifier(typeStr, Function .currFunction.field)
287
282
if (type == null ){
288
283
if (ctx.selector().size == 0 ){
@@ -296,24 +291,24 @@ class MCFPPExprVisitor(private var defaultGenericClassType : MCFPPGenericClassTy
296
291
}
297
292
}
298
293
for (selector in ctx.selector()){
299
- visit (selector)
294
+ visitSelector (selector)
300
295
}
301
296
return currSelector!!
302
297
}
303
298
304
299
override fun visitJvmAccessExpression (ctx : mcfppParser.JvmAccessExpressionContext ): Var <* > {
305
300
val re = visitPrimary(ctx.primary())
306
- if (ctx.Identifier () != null ){
307
- return re.getJVM(ctx.Identifier ().text)
301
+ return if (ctx.Identifier () != null ){
302
+ re.getJVM(ctx.Identifier ().text)
308
303
}else {
309
- return re
304
+ re
310
305
}
311
306
}
312
307
313
308
@Override
314
309
override fun visitSelector (ctx : mcfppParser.SelectorContext ? ): Var <* > {
315
310
// 进入visitVar,currSelector作为成员选择的上下文
316
- currSelector = visit (ctx!! .`var `())
311
+ currSelector = visitVar (ctx!! .`var `())
317
312
return currSelector!!
318
313
}
319
314
@@ -327,17 +322,17 @@ class MCFPPExprVisitor(private var defaultGenericClassType : MCFPPGenericClassTy
327
322
Project .ctx = ctx
328
323
if (ctx.`var `() != null ) {
329
324
// 变量
330
- val qwq = visit (ctx.`var `())
325
+ val qwq = visitVar (ctx.`var `())
331
326
if (qwq is UnknownVar && ctx.parent !is mcfppParser.VarWithSelectorContext ){
332
327
LogProcessor .error(TextTranslator .VARIABLE_NOT_DEFINED .translate(qwq.identifier))
333
328
}
334
329
return qwq
335
330
} else if (ctx.value() != null ) {
336
- return visit (ctx.value())
331
+ return visitValue (ctx.value())
337
332
} else if (ctx.range() != null ){
338
333
// 是范围
339
- val left = ctx.range().num1?.let { visit (it) }
340
- val right = ctx.range().num2?.let { visit (it) }
334
+ val left = ctx.range().num1?.let { visitVar (it) }
335
+ val right = ctx.range().num2?.let { visitVar (it) }
341
336
if (left is MCNumber <* >? && right is MCNumber <* >? ){
342
337
if (left is MCFPPValue <* >? && right is MCFPPValue <* >? ){
343
338
val leftValue = left?.value.toString().toFloatOrNull()
@@ -385,13 +380,13 @@ class MCFPPExprVisitor(private var defaultGenericClassType : MCFPPGenericClassTy
385
380
override fun visitVar (ctx : mcfppParser.VarContext ): Var <* > {
386
381
Project .ctx = ctx
387
382
return if (ctx.varWithSuffix() != null ) {
388
- visit (ctx.varWithSuffix())
383
+ visitVarWithSuffix (ctx.varWithSuffix())
389
384
} else if (ctx.bucketExpression() != null ) {
390
385
// '(' expression ')'
391
- visit (ctx.bucketExpression())
386
+ visitBucketExpression (ctx.bucketExpression())
392
387
} else {
393
388
// 函数调用
394
- visit (ctx.functionCall())
389
+ visitFunctionCall (ctx.functionCall())
395
390
}
396
391
}
397
392
0 commit comments