Skip to content

Commit a98cef7

Browse files
committed
函数递归的问题
1 parent cf3d409 commit a98cef7

File tree

20 files changed

+433
-217
lines changed

20 files changed

+433
-217
lines changed

src/main/antlr/mcfppParser.g4

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -313,7 +313,7 @@ expression
313313

314314
//能作为语句的表达式
315315
statementExpression
316-
: (basicExpression '=' )? expression
316+
: (varWithSelector '=' )? expression
317317
;
318318

319319
//条件表达式
@@ -368,17 +368,17 @@ unaryExpression
368368

369369
//右侧计算式取出的变量
370370
rightVarExpression
371-
: basicExpression
371+
: varWithSelector
372372
;
373373

374374
//强制类型转换表达式
375375
castExpression
376376
: '(' type ')' unaryExpression
377377
;
378378

379-
basicExpression
380-
: jvmAccessExpression
381-
| varWithSelector
379+
varWithSelector
380+
: jvmAccessExpression selector*
381+
| type selector+
382382
;
383383

384384
jvmAccessExpression
@@ -395,11 +395,6 @@ primary
395395
| type
396396
;
397397

398-
varWithSelector
399-
: jvmAccessExpression selector+
400-
| type selector+
401-
;
402-
403398
var
404399
: bucketExpression
405400
| varWithSuffix
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package top.mcfpp.mni;
2+
3+
import top.mcfpp.annotations.MNIFunction;
4+
import top.mcfpp.core.lang.JsonTextConcrete;
5+
import top.mcfpp.core.lang.MCInt;
6+
import top.mcfpp.core.lang.nbt.MCString;
7+
import top.mcfpp.core.lang.nbt.MCStringConcrete;
8+
import top.mcfpp.lib.ListChatComponent;
9+
import top.mcfpp.lib.PlainChatComponent;
10+
import top.mcfpp.lib.ScoreChatComponent;
11+
import top.mcfpp.util.ValueWrapper;
12+
13+
public class MCStringConcreteData {
14+
15+
@MNIFunction(caller = "string", returnType = "text", override = true)
16+
public static void toText(MCStringConcrete caller, ValueWrapper<JsonTextConcrete> returnValue) {
17+
var l = new ListChatComponent();
18+
l.getComponents().add(new PlainChatComponent(caller.getValue().getValue()));
19+
returnValue.setValue(new JsonTextConcrete(l, "re"));
20+
}
21+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package top.mcfpp.mni;
2+
3+
import top.mcfpp.annotations.MNIFunction;
4+
import top.mcfpp.core.lang.JsonTextConcrete;
5+
import top.mcfpp.core.lang.MCInt;
6+
import top.mcfpp.core.lang.nbt.MCString;
7+
import top.mcfpp.lib.ListChatComponent;
8+
import top.mcfpp.lib.NBTChatComponent;
9+
import top.mcfpp.lib.ScoreChatComponent;
10+
import top.mcfpp.util.ValueWrapper;
11+
12+
public class MCStringData {
13+
14+
@MNIFunction(caller = "string", returnType = "text", override = true)
15+
public static void toText(MCString caller, ValueWrapper<JsonTextConcrete> returnValue) {
16+
var l = new ListChatComponent();
17+
l.getComponents().add(new NBTChatComponent(caller, false, null));
18+
returnValue.setValue(new JsonTextConcrete(l, "re"));
19+
}
20+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package top.mcfpp.mni.annotation;
2+
3+
import org.jetbrains.annotations.NotNull;
4+
import top.mcfpp.model.annotation.FunctionAnnotation;
5+
import top.mcfpp.model.function.Function;
6+
7+
public class Dynamic extends FunctionAnnotation {
8+
9+
public Dynamic() {
10+
super("Dynamic", "mcfpp.annotation");
11+
}
12+
13+
@Override
14+
public void forFunction(@NotNull Function function) {
15+
function.setAst(null);
16+
}
17+
}

src/main/kotlin/top/mcfpp/antlr/MCFPPAnnotationVisitor.kt

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
package top.mcfpp.antlr
22

33
import top.mcfpp.Project
4-
import top.mcfpp.exception.UndefinedException
54
import top.mcfpp.core.lang.MCFPPValue
5+
import top.mcfpp.exception.UndefinedException
66
import top.mcfpp.model.Namespace
77
import top.mcfpp.model.ObjectClass
88
import top.mcfpp.model.ObjectDataTemplate
99
import top.mcfpp.model.annotation.Annotation
1010
import top.mcfpp.model.field.GlobalField
11+
import top.mcfpp.model.function.FunctionParam
1112
import top.mcfpp.util.LogProcessor
1213
import top.mcfpp.util.StringHelper
1314

@@ -132,4 +133,21 @@ class MCFPPAnnotationVisitor: mcfppParserBaseVisitor<Unit>(){
132133
clazz.annotations.addAll(annotationCache)
133134
annotationCache.clear()
134135
}
136+
137+
override fun visitFunctionDeclaration(ctx: mcfppParser.FunctionDeclarationContext) {
138+
//获取函数对象
139+
val types = ctx.functionParams()?.let { FunctionParam.parseReadonlyAndNormalParamTypes(it) }
140+
//获取缓存中的对象
141+
val f = GlobalField.getFunction(
142+
Project.currNamespace,
143+
ctx.Identifier().text,
144+
types?.first?.map { it.build("") }?:ArrayList(),
145+
types?.second?.map { it.build("") }?:ArrayList()
146+
)
147+
annotationCache.forEach {
148+
it.forFunction(f)
149+
}
150+
f.annotations.addAll(annotationCache)
151+
annotationCache.clear()
152+
}
135153
}

src/main/kotlin/top/mcfpp/antlr/MCFPPExprVisitor.kt

Lines changed: 44 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -59,12 +59,13 @@ class MCFPPExprVisitor(private var defaultGenericClassType : MCFPPGenericClassTy
5959
val f = NoStackFunction("expression_${UUID.randomUUID()}",Function.currFunction)
6060
Function.currFunction = f
6161
return if(ctx.primary() != null){
62-
val q = visit(ctx.primary())
62+
currSelector = null
63+
val q = visitPrimary(ctx.primary())
6364
Function.currFunction = l
6465
l.commands.addAll(f.commands)
6566
q
6667
}else{
67-
val q = visit(ctx.conditionalOrExpression())
68+
val q = visitConditionalOrExpression(ctx.conditionalOrExpression())
6869
Function.currFunction = l
6970
l.commands.addAll(f.commands)
7071
q
@@ -81,10 +82,10 @@ class MCFPPExprVisitor(private var defaultGenericClassType : MCFPPGenericClassTy
8182
@Override
8283
override fun visitConditionalOrExpression(ctx: mcfppParser.ConditionalOrExpressionContext): Var<*> {
8384
Project.ctx = ctx
84-
visitConditionalOrExpressionRe = visit(ctx.conditionalAndExpression(0))
85+
visitConditionalOrExpressionRe = visitConditionalAndExpression(ctx.conditionalAndExpression(0))
8586
processVarCache.add(visitConditionalOrExpressionRe!!)
8687
for (i in 1 until ctx.conditionalAndExpression().size) {
87-
var b: Var<*>? = visit(ctx.conditionalAndExpression(i))
88+
var b: Var<*>? = visitConditionalAndExpression(ctx.conditionalAndExpression(i))
8889
if(b is MCFloat) b = b.toTempEntity()
8990
if(visitConditionalOrExpressionRe!! != MCFloat.ssObj){
9091
visitConditionalOrExpressionRe = visitConditionalOrExpressionRe!!.getTempVar()
@@ -106,10 +107,10 @@ class MCFPPExprVisitor(private var defaultGenericClassType : MCFPPGenericClassTy
106107
@Override
107108
override fun visitConditionalAndExpression(ctx: mcfppParser.ConditionalAndExpressionContext): Var<*> {
108109
Project.ctx = ctx
109-
visitConditionalAndExpressionRe = visit(ctx.equalityExpression(0))
110+
visitConditionalAndExpressionRe = visitEqualityExpression(ctx.equalityExpression(0))
110111
processVarCache.add(visitConditionalAndExpressionRe!!)
111112
for (i in 1 until ctx.equalityExpression().size) {
112-
val b: Var<*>? = visit(ctx.equalityExpression(i))
113+
val b: Var<*>? = visitEqualityExpression(ctx.equalityExpression(i))
113114
visitConditionalAndExpressionRe = visitConditionalAndExpressionRe!!.binaryComputation(b!!, "&&")
114115
processVarCache[processVarCache.size - 1] = visitConditionalAndExpressionRe!!
115116
}
@@ -125,9 +126,9 @@ class MCFPPExprVisitor(private var defaultGenericClassType : MCFPPGenericClassTy
125126
@Override
126127
override fun visitEqualityExpression(ctx: mcfppParser.EqualityExpressionContext): Var<*> {
127128
Project.ctx = ctx
128-
var re: Var<*> = visit(ctx.relationalExpression(0))
129+
var re: Var<*> = visitRelationalExpression(ctx.relationalExpression(0))
129130
if (ctx.relationalExpression().size != 1) {
130-
val b: Var<*> = visit(ctx.relationalExpression(1))
131+
val b: Var<*> = visitRelationalExpression(ctx.relationalExpression(1))
131132
if(!re.isTemp){
132133
re = re.getTempVar()
133134
}
@@ -144,9 +145,9 @@ class MCFPPExprVisitor(private var defaultGenericClassType : MCFPPGenericClassTy
144145
@Override
145146
override fun visitRelationalExpression(ctx: mcfppParser.RelationalExpressionContext): Var<*> {
146147
Project.ctx = ctx
147-
var re: Var<*> = visit(ctx.additiveExpression(0))
148+
var re: Var<*> = visitAdditiveExpression(ctx.additiveExpression(0))
148149
if (ctx.additiveExpression().size != 1) {
149-
val b: Var<*> = visit(ctx.additiveExpression(1))
150+
val b: Var<*> = visitAdditiveExpression(ctx.additiveExpression(1))
150151
re = re.binaryComputation(b, ctx.relationalOp().text)
151152
}
152153
return re
@@ -161,10 +162,10 @@ class MCFPPExprVisitor(private var defaultGenericClassType : MCFPPGenericClassTy
161162
@Override
162163
override fun visitAdditiveExpression(ctx: mcfppParser.AdditiveExpressionContext): Var<*> {
163164
Project.ctx = ctx
164-
visitAdditiveExpressionRe = visit(ctx.multiplicativeExpression(0))
165+
visitAdditiveExpressionRe = visitMultiplicativeExpression(ctx.multiplicativeExpression(0))
165166
processVarCache.add(visitAdditiveExpressionRe!!)
166167
for (i in 1 until ctx.multiplicativeExpression().size) {
167-
var b: Var<*>? = visit(ctx.multiplicativeExpression(i))
168+
var b: Var<*>? = visitMultiplicativeExpression(ctx.multiplicativeExpression(i))
168169
if(b is MCFloat) {
169170
b = b.toTempEntity()
170171
if(visitAdditiveExpressionRe!! != MCFloat.ssObj){
@@ -188,10 +189,10 @@ class MCFPPExprVisitor(private var defaultGenericClassType : MCFPPGenericClassTy
188189
@Override
189190
override fun visitMultiplicativeExpression(ctx: mcfppParser.MultiplicativeExpressionContext): Var<*> {
190191
Project.ctx = ctx
191-
visitMultiplicativeExpressionRe = visit(ctx.unaryExpression(0))
192+
visitMultiplicativeExpressionRe = visitUnaryExpression(ctx.unaryExpression(0))
192193
processVarCache.add(visitMultiplicativeExpressionRe!!)
193194
for (i in 1 until ctx.unaryExpression().size) {
194-
var b: Var<*>? = visit(ctx.unaryExpression(i))
195+
var b: Var<*>? = visitUnaryExpression(ctx.unaryExpression(i))
195196
if(b is MCFloat) b = b.toTempEntity()
196197
if(visitMultiplicativeExpressionRe != MCFloat.ssObj){
197198
visitMultiplicativeExpressionRe = visitMultiplicativeExpressionRe!!.getTempVar()
@@ -212,13 +213,13 @@ class MCFPPExprVisitor(private var defaultGenericClassType : MCFPPGenericClassTy
212213
override fun visitUnaryExpression(ctx: mcfppParser.UnaryExpressionContext): Var<*> {
213214
Project.ctx = ctx
214215
return if (ctx.rightVarExpression() != null) {
215-
visit(ctx.rightVarExpression())
216+
visitRightVarExpression(ctx.rightVarExpression())
216217
} else if (ctx.unaryExpression() != null) {
217-
val a: Var<*> = visit(ctx.unaryExpression())
218+
val a: Var<*> = visitUnaryExpression(ctx.unaryExpression())
218219
a.unaryComputation("!")
219220
} else {
220221
//类型强制转换
221-
visit(ctx.castExpression())
222+
visitCastExpression(ctx.castExpression())
222223
}
223224
}
224225

@@ -231,7 +232,7 @@ class MCFPPExprVisitor(private var defaultGenericClassType : MCFPPGenericClassTy
231232
@Override
232233
override fun visitCastExpression(ctx: mcfppParser.CastExpressionContext): Var<*> {
233234
Project.ctx = ctx
234-
val a: Var<*> = visit(ctx.unaryExpression())
235+
val a: Var<*> = visitUnaryExpression(ctx.unaryExpression())
235236
return a.explicitCast(MCFPPType.parseFromIdentifier(ctx.type().text, Function.currFunction.field)?: run {
236237
LogProcessor.error(TextTranslator.INVALID_TYPE_ERROR.translate(ctx.type().text))
237238
MCFPPBaseType.Any
@@ -246,29 +247,14 @@ class MCFPPExprVisitor(private var defaultGenericClassType : MCFPPGenericClassTy
246247
*/
247248
@Override
248249
override fun visitRightVarExpression(ctx: mcfppParser.RightVarExpressionContext): Var<*> {
249-
val qwq = visit(ctx.basicExpression())
250+
val qwq = visitVarWithSelector(ctx.varWithSelector())
250251
return if(qwq is PropertyVar){
251252
qwq.getter(qwq.caller)
252253
}else{
253254
qwq
254255
}
255256
}
256257

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-
272258
/**
273259
* 从类中选择一个成员。返回的成员包含了它所在的对象的信息
274260
*
@@ -278,11 +264,20 @@ class MCFPPExprVisitor(private var defaultGenericClassType : MCFPPGenericClassTy
278264
@Override
279265
override fun visitVarWithSelector(ctx: mcfppParser.VarWithSelectorContext): Var<*> {
280266
Project.ctx = ctx
267+
currSelector = null
281268
if(ctx.jvmAccessExpression() != null){
282269
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
286281
val type = MCFPPType.parseFromIdentifier(typeStr, Function.currFunction.field)
287282
if(type == null){
288283
if(ctx.selector().size == 0){
@@ -296,24 +291,24 @@ class MCFPPExprVisitor(private var defaultGenericClassType : MCFPPGenericClassTy
296291
}
297292
}
298293
for (selector in ctx.selector()){
299-
visit(selector)
294+
visitSelector(selector)
300295
}
301296
return currSelector!!
302297
}
303298

304299
override fun visitJvmAccessExpression(ctx: mcfppParser.JvmAccessExpressionContext): Var<*> {
305300
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)
308303
}else{
309-
return re
304+
re
310305
}
311306
}
312307

313308
@Override
314309
override fun visitSelector(ctx: mcfppParser.SelectorContext?): Var<*> {
315310
//进入visitVar,currSelector作为成员选择的上下文
316-
currSelector = visit(ctx!!.`var`())
311+
currSelector = visitVar(ctx!!.`var`())
317312
return currSelector!!
318313
}
319314

@@ -327,17 +322,17 @@ class MCFPPExprVisitor(private var defaultGenericClassType : MCFPPGenericClassTy
327322
Project.ctx = ctx
328323
if (ctx.`var`() != null) {
329324
//变量
330-
val qwq = visit(ctx.`var`())
325+
val qwq = visitVar(ctx.`var`())
331326
if(qwq is UnknownVar && ctx.parent !is mcfppParser.VarWithSelectorContext){
332327
LogProcessor.error(TextTranslator.VARIABLE_NOT_DEFINED.translate(qwq.identifier))
333328
}
334329
return qwq
335330
} else if (ctx.value() != null) {
336-
return visit(ctx.value())
331+
return visitValue(ctx.value())
337332
} else if (ctx.range() != null){
338333
//是范围
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) }
341336
if(left is MCNumber<*>? && right is MCNumber<*>?){
342337
if(left is MCFPPValue<*>? && right is MCFPPValue<*>?){
343338
val leftValue = left?.value.toString().toFloatOrNull()
@@ -385,13 +380,13 @@ class MCFPPExprVisitor(private var defaultGenericClassType : MCFPPGenericClassTy
385380
override fun visitVar(ctx: mcfppParser.VarContext): Var<*> {
386381
Project.ctx = ctx
387382
return if (ctx.varWithSuffix() != null) {
388-
visit(ctx.varWithSuffix())
383+
visitVarWithSuffix(ctx.varWithSuffix())
389384
} else if (ctx.bucketExpression() != null) {
390385
// '(' expression ')'
391-
visit(ctx.bucketExpression())
386+
visitBucketExpression(ctx.bucketExpression())
392387
} else {
393388
//函数调用
394-
visit(ctx.functionCall())
389+
visitFunctionCall(ctx.functionCall())
395390
}
396391
}
397392

0 commit comments

Comments
 (0)