gpt4 book ai didi

javascript - Pegjs:不允许保留关键字作为变量名

转载 作者:行者123 更新时间:2023-12-03 11:24:35 25 4
gpt4 key购买 nike

我正在用 Pegjs 编写我的语言,像往常一样,我的语言有一些关键字,例如 true , false , if , elsetoday例如。现在,我想声明一个变量,但显然,变量名不能是保留关键字之一。它可以是任何字母后跟字母数字,但语言关键字除外。

我执行了以下操作(可在 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 中不允许的关键字定义?

你可以想象为什么我的解决方案容易出错。我尝试了几件事,但没有成功。

感谢您的帮助!

最佳答案

简单答案:

(请参阅此代码的实际操作 http://peg.arcanis.fr/2VbQ5G/ )

    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()};
}

注意:这会丢失您有用的错误报告。如果有机会,我会尝试提出一个保留它的答案。

下面代码的重要部分位于variable的开头。规则:! keyword 。这是理解这一点的最简单方法,因为解析器正在向前查找 1 个标记。如果它发现的不是关键字,则它允许规则尝试匹配 token 。另一方面,如果它关键字,则! keyword表达式(并且通过扩展,整个 variable 规则失败。

引用 David Majda 的 documentation :

! expression

Try to match the expression. If the match does not succeed, just return undefined and do not advance the parser position, otherwise consider the match failed.

关于javascript - Pegjs:不允许保留关键字作为变量名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26976820/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com