Передача конструкторов в качестве аргументов (языковой дизайн) - PullRequest
0 голосов
/ 22 февраля 2019

Я пытаюсь создать свой собственный язык и хотел бы знать, возможна ли передача конструктора, т. Е. Используемый синтаксис основан на 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 голосов
/ 22 февраля 2019

Вы спрашиваете, можете ли вы создать массив конструкторов, но похоже, что вы пытаетесь создать массив классов.В любом случае, оба варианта возможны в статически типизированных языках с некоторой поддержкой отражения.Например, в 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()
};

Опять же, если вы хотите, чтобы ваш язык был тяжелым для такого типа отражения, вы, безусловно, можете ввести более лаконичный синтаксис для достижения того же.

ИтакОтвет на ваш вопрос: да, это возможно.

...