我正在尝试创建自己的语言,想知道是否可以通过构造函数,即 所使用的语法基于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)
答案 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()
};
同样,如果您希望您的语言专注于这种类型的反射,则可以肯定地引入一种更简洁的语法来实现相同的效果。
所以您的问题的答案是:是的,有可能。