-1

我想知道以下语法是否可用于编译语言?请不要提供 java,因为它需要 JVM。该设计相当于工厂设计模式,因为我们在正常情况下一旦通过某些测试就初始化一个类,我们使用大量 if-else 语句,即当我们有一系列类时,我们即 10 个类,代码变得笨拙我正在尝试创建一种已转译或编译的语言尚未决定,并且会研究目前正在使用 kotlin-native 和 llvm(尚未排序的 llvm 集成)的已编译语言的功能,它正在启动,这就是我想要考虑使用的。

class A{
   
}

class B extends A{
  
}



class C extends A{
   
}

class D extends A{
   
}

class E extends A{
   
}

class F extends A{
   
}

class G extends A{
   
}

class H extends A{
   
}

class I extends A{
   
}

class J extends A{
   
}

class K extends A{
   
}
function getClass(test){
    if(test == 1){
      return new B()
    }else if (test == 2){
      return new C()
    }else if (test == 3){
      return new D()
    }else if (test == 4){
      return new E()
    }else if (test == 5){
      return new F()
    }else if (test == 6){
      return new G()
    }else if (test == 7){
      return new H()
    }else if (test == 8){
      return new I()
    }else if (test == 9){
      return new J()
    }else if (test == 10){
      return new K()
    }
}

let klass = getClass(10)

console.log(`Found class ${klass.constructor.name}`)

class A {    
    static test(test) {
        return test === this.index;
    }
}


class B extends A{}

B.index = 1

class C extends A{}

C.index = 2

class D extends A{}

D.index = 3

class E extends A{}

E.index = 4

class F extends A{}

F.index = 5

class G extends A{}

G.index = 6

class H extends A{}

H.index = 7

class I extends A{}

I.index = 8

class J extends A{}

J.index = 9

class K extends A{}

K.index = 10

let klasses = [B, C,D,E,F,G,H,I,G,K];

let klass = new A();

let test = 7;

for (let i = 0; i < klasses.length; i++) {
    try {
      if(klasses[i].test(test)){
          klass =  new klasses[i]()
      }
    } catch (e) {
        console.log(e)
    }
}


console.log(`Found class ${klass.constructor.name}`);

4

1 回答 1

1

你能澄清你的问题吗?您之前的问题如何在任何编译语言中实现以下语法?最好是 Kotlin,C++实际上对我来说似乎更清晰。您能否向我们提供有关您正在努力实现的高级目标的信息?

您是否正在尝试设计一种新语言?您是否正在尝试选择一种语言来实现新语言的解析器?

按照您的代码,您正在尝试设计一种语言,其中类按声明顺序保存为列表,然后您希望能够通过以某种方式迭代列表来实例化所有这些类,并且这些类应该是能知道自己在列表中的索引作他用吗?

那是你想要做的吗?

在大多数语言中,类不能保存在数组中。它们不是真实的物体。但是有些,如 Smalltalk、Objective-C、Self 或 TADS,为每个包含附加数据的类隐式创建一个对象(C++ 有一种萎缩形式,称为“运行时类型信息”或 RTTI)。

如果您的实现语言不这样做,则您必须自己做。创建包含创建正确子类对象的函数的对象(并且可能包含一些其他信息,例如列表中的类名或索引,以便您可以再次找到它),并将该“制造商”对象添加到全局列表中。然后只需使用这个工厂对象的全局列表来创建您的实例。

你不是说你是如何创造你的语言的。您是否正在编写一个工具,以您的语言读取文本文件并将其转换为现有语言的源文件?然后,该工具只需要为一些额外的类创建源代码(例如,对于class B,它还将创建一个class B_Maker是 的子类class A_Maker,但创建一个新的类型对象B,然后它会创建一些init()包含代码的函数创建每个制造商的新对象并将它们添加到全局列表中)。

如果您正在修改 LLVM 或其他一些现有的编译器链,或者尝试从头开始执行此操作,则基本方法将是相同的(除非您可以扩展每个类已经存在的对象),但您不会不是生成源代码,而是生成一些其他的数据结构,这些数据结构最终会编译出等价的代码。

给我们更多的背景信息,我们也许可以提供帮助。

于 2019-03-31T12:40:45.393 回答