Javascript 佩杰斯:唐';不允许保留关键字作为变量名
我正在用Pegjs编写我的语言,像往常一样,我的语言有一些关键词,比如Javascript 佩杰斯:唐';不允许保留关键字作为变量名,javascript,pegjs,Javascript,Pegjs,我正在用Pegjs编写我的语言,像往常一样,我的语言有一些关键词,比如true,false,if,else和今天。现在,我想声明一个变量,但是显然,变量名不能是保留关键字之一。它可以是任何字母后跟字母数字,但语言关键字除外 我做了以下工作(可在中测试): variable=c:(alpha-alphanum*) { var关键字=[“真”、“假”、“如果”、“其他”、“今天”]; var res=c[0] 对于(变量i=0;i=0){ 返回错误(“\''+res+”\''+”是一个关键字,不能用
true
,false
,if
,else
和今天
。现在,我想声明一个变量,但是显然,变量名不能是保留关键字之一。它可以是任何字母后跟字母数字,但语言关键字除外
我做了以下工作(可在中测试):
variable=c:(alpha-alphanum*)
{
var关键字=[“真”、“假”、“如果”、“其他”、“今天”];
var res=c[0]
对于(变量i=0;i=0){
返回错误(“\''+res+”\''+”是一个关键字,不能用作变量名。“);
}
返回{'dataType':'variable','dataValue':res};
}
α=[a-zA-Z]
alphanum=[a-zA-Z0-9]
布尔值=v:(“真”/“假”)
{
返回{'dataType':'boolean','dataValue':v};
}
现在true
是非法的,但是true1
不是。这很好。但是,由于我已在我的语言中的其他地方定义了布尔结构
,因此不可能重复使用该定义,而不是在变量
定义中手动重新定义不允许的关键字吗
您可以想象为什么我的解决方案容易出错。我试过几种方法,但都不管用
谢谢你的帮助 简单回答:
(请参阅上的此代码)
注意:此将丢失有用的错误报告。如果我有机会,我会尽量给出一个保留它的答案
下面代码的重要位位于变量规则的开头:!关键字
。这是一种最简单的方法,因为解析器正在向前看1个标记。如果它找到的不是关键字,则允许规则尝试匹配令牌。另一方面,如果它是一个关键字,那么!关键字
表达式(通过扩展,整个变量
规则失败
引用David Majda的话:
!表达式
尝试匹配表达式。如果匹配不成功,只返回未定义且不推进解析器位置,否则认为匹配失败。
我确信这是一个有趣的问题,因为必须(至少应该)有更好的方法来构建我的语法。也许PEGJS的“受众”是有限的?
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};
}
variable = ! keyword (alpha alphanum*)
{
return { 'dataType' : 'variable', 'dataValue': text()};
}
keyword = "true" / "false" / "if" / "else" / "today"
alpha = [a-zA-Z]
alphanum = [a-zA-Z0-9_]
boolean = ("true" / "false")
{
return { 'dataType' : 'boolean', 'dataValue': text()};
}