Javascript 佩杰斯:唐';不允许保留关键字作为变量名

Javascript 佩杰斯:唐';不允许保留关键字作为变量名,javascript,pegjs,Javascript,Pegjs,我正在用Pegjs编写我的语言,像往常一样,我的语言有一些关键词,比如true,false,if,else和今天。现在,我想声明一个变量,但是显然,变量名不能是保留关键字之一。它可以是任何字母后跟字母数字,但语言关键字除外 我做了以下工作(可在中测试): variable=c:(alpha-alphanum*) { var关键字=[“真”、“假”、“如果”、“其他”、“今天”]; var res=c[0] 对于(变量i=0;i=0){ 返回错误(“\''+res+”\''+”是一个关键字,不能用

我正在用Pegjs编写我的语言,像往常一样,我的语言有一些关键词,比如
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()};
    }