【问题标题】:Passing Constructors as arguments(language design)将构造函数作为参数传递(语言设计)
【发布时间】:2019-07-16 07:11:51
【问题描述】:

我正在尝试创建自己的语言,并想知道传递构造函数是否是一个可能的功能,即 使用的语法基于 javascript 和其他一些语言,但对于我的选择,我正在考虑编译运行时并且想知道这个功能是否可能。采用如下结构的编译语言

// $ defines a variable declaration.
        class Token{
           static test(string){
              return this.regex.test(string)
           }
        }

        // javascript regex syntax used.
        class Identifier:Token{
          // bettere regex used 
          static regex = /[a-zA-Z]*/
        }
        class Equals: Token{
          static regex =  /=/
        }

        class Dollar: Token{
          static regex = /\$/
        }

        class MyLanguage(String code,Parser ...parsers){

          
           
          private tokens = []
          
          static tokens = [Identifier,,Dollar]
          
          init{
             tokenize();
          }
          
          get parser(){
             // parsers passed in constructor i.e kotlin syntax
             for($parser in parsers){
                 // tokens part of lang instance on tokenize success
                 parser.shouldParse(tokens)
             }
             throw "Can  not parser code"
          }
          
          tokenize(){
            // not really reasonable but not what I am using
            code = code.explode(" ")
           
            
            // find valid token and instanciate
            for($s in code){
                for($token in self.tokens){
                  // test a string against a token class i.e Identifier.test("int")
                   if(token.test(s)){
                      // instanciating class constructor
                      tokens.push(new token(code))
                   }
                }
            }
            
          }
        }

        class Parser{
             static shouldParse(tokens){
                tokens =  tokens.copy
                // do parse section validation test on tokens copy
             }
        }

        class VariableDeclarationParser : Parser{

        }
        // expected tokens 
        // Identifier Identifier Equals Number
        let lang =new Language("int a = 12",VariableDeclarationParser)

【问题讨论】:

  • class Equals extends Token { 也没有定义this.regex,使用this.constructor.regex
  • 这个问题似乎更适合Software Engineering。我不知道 SO 在语言实现之前是否处理语言设计。
  • @vlaz 这与语言设计无关。
  • @JonasWilms 我读它的方式是,OP 正在尝试创建一种新的编程语言,它(某种程度上)基于 JS,但想知道是否可以实现某个功能(传递构造函数)。老实说,我也没有真正理解这个问题,但这就是我从中得到的。我不确定给出的代码是问题的示例还是解释器/编译器/其他东西。
  • @user633183 一直在寻找类似的东西,现在真的很有帮助,非常感谢

标签: javascript language-design


【解决方案1】:

您是在询问是否可以创建一个构造函数数组,但看起来更像是在尝试创建一个类数组。无论哪种方式,只要对反射有一定的支持,这两种语言在静态类型语言中都是可能的。例如在 Java 中你可以这样写:

Class<? extends Token>[] tokens = {Identifier.class, Dollar.class};

您没有理由不能更改语法以省略.class 位。

在 Java 中也可以创建一个构造函数数组:

Constructor<? extends Token>[] tokens = {
    // get the constructor Identifier(String)
    Identifier.class.getConstructor(String.class),
    // get the constructor Dollar()
    Dollar.class.getConstructor()
};

同样,如果您希望您的语言在这种类型的反射上很重,您当然可以引入更简洁的语法来实现同样的效果。

所以你的问题的答案是:是的,有可能。

【讨论】:

  • 类 extends Token> tokens = [标识符,美元]
  • 谢谢,真的很感激这个想法让我想到了一个更好的语法 Class extends Token> tokens = [标识符,美元]
猜你喜欢
  • 2015-08-02
  • 2016-07-19
  • 2011-06-28
  • 2011-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多