我正在用 Pegjs 编写我的语言,并且像往常一样,我的语言有一些关键字,例如true
, false
, if
,else
和today
例如。现在,我想声明一个变量,但显然,变量名不能是保留关键字之一。它可以是任何字母,后跟字母数字,语言关键字除外。
我做了以下(可在Pegjs Online中测试):
variable = c:(alpha alphanum*)
{
var keywords = ["true", "false", "if", "else", "today"];
var res = c[0]
for (var i = 0; i<c[1].length; i++) {
res=res+c[1][i]
}
if(keywords.indexOf(res)>=0) {
return error('\'' + res + '\'' + ' is a keyword and cannot be used as a variable name.');
}
return { 'dataType' : 'variable', 'dataValue' : res };
}
alpha = [a-zA-Z]
alphanum = [a-zA-Z0-9_]
boolean = v: ("true" / "false")
{
return { 'dataType' : 'boolean', 'dataValue': v};
}
现在true
是非法的,但true1
不是。这可以。但是,由于我已经boolean
在我的语言的其他地方定义了结构,是否不能重用该定义而不是手动重新定义我的variable
定义中不允许的关键字?
你可以想象为什么我的解决方案容易出错。我尝试了几件事,但没有奏效。
谢谢你的帮助!