将构造函数作为参数传递(语言设计)

时间:2019-02-22 08:26:43

标签: javascript language-design

我正在尝试创建自己的语言,想知道是否可以通过构造函数,即 所使用的语法基于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)

1 个答案:

答案 0 :(得分:0)

您在询问是否可以创建构造函数数组,但看起来更像是在尝试创建类数组。无论哪种方式,只要支持反射,在静态类型语言中都可以实现。例如,在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()
};

同样,如果您希望您的语言专注于这种类型的反射,则可以肯定地引入一种更简洁的语法来实现相同的效果。

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