Javascript中的语法/逻辑检查器?

Javascript中的语法/逻辑检查器?,javascript,error-handling,typechecking,syntax-checking,Javascript,Error Handling,Typechecking,Syntax Checking,我正在为一个客户端构建一个解决方案,允许他们创建非常基本的代码, 现在我已经做了一些基本的语法验证,但我仍然停留在变量验证上 我知道JSLint是使用Javascript实现这一点的,我想知道是否有人知道这样做的好方法 例如,假设用户编写了代码 moose = "barry" base = 0 if(moose == "barry"){base += 100} 然后我试图找到一种方法来澄清“if”表达式的语法是否正确,变量moose是否已初始化等等 但我不想逐字扫描, 该代码是一种专为该应用程

我正在为一个客户端构建一个解决方案,允许他们创建非常基本的代码, 现在我已经做了一些基本的语法验证,但我仍然停留在变量验证上

我知道JSLint是使用Javascript实现这一点的,我想知道是否有人知道这样做的好方法

例如,假设用户编写了代码

moose = "barry"
base = 0
if(moose == "barry"){base += 100}
然后我试图找到一种方法来澄清“if”表达式的语法是否正确,变量moose是否已初始化等等 但我不想逐字扫描, 该代码是一种专为该应用程序构建的小型语言,因此非常基础,不需要管理内存或类似的内容

我曾考虑过先按回车键拆分,然后按空格拆分,但没有什么可以说用户不会编写类似于
moose=“barry”
if(moose==“barry”)
没有什么可以说用户不会将条件的结果内联

显然,编译器和解释器在更广泛的范围内完成了这项工作,但我不确定他们是否逐个字符地完成了这项工作,以及他们是如何进行优化的

(另一个选择是我可以将其发送回PHP进行处理,然后释放浏览器的责任)

有什么建议吗

谢谢

用例是有限的,语法在这种情况下永远不会扩展,该语言是一种简单的脚本语言,使客户端能够根据用户输入创建唯一的成本。最终结果将由PHP处理,以确保最终用户无法调整计算,并确保有一定的一致性

例如,假设基本成本为1.00英镑 表单上有一个名为“额外成本”的字段,该语言允许他们操纵相对于“额外成本”字段的基本成本

所以

base=1;
如果(附加值>100&&附加值<150){base+=50}
elseif(附加==150){base*=150}
else{base+=additional;}
这是如何使用该语言的一个基本示例


谢谢你的回答, 我研究过一个解析器,创建一个解析器要比需要的复杂得多 使用1000行代码运行了几次测试,发现即使在单核P4上处理一个字符只需几秒钟,内存为512mb(远低于客户使用的容量)

我决定构建一个基于PHP的语法检查器,它将在检查信息的同时检查信息并将变量等转换为有效的PHP代码(这样就可以在以后调用它而无需重新编译)使用它而不是javascript似乎更合适,并且可以在不妨碍验证过程的情况下生成更复杂的代码

只花了一个小时,我的代码能够检查if语句的有效性,并且不会被嵌套的if、空格或奇数表达式所迷惑,剩下的要检查的东西很少,而解析器和完整的脚本语言将花费更长的时间


你们给了我很多思考,我也给了相关的答案打分,谢谢你们,Javascript有一个函数“eval”

var code = 'alert(1);';
eval(code);

它将显示警报。你可以使用“eval”来执行基本代码。

如果你真的想这样做,我的意思是如果你真的想让你的软件正常、可预测地工作,而不需要一大堆奇怪的“不这样做”的特殊情况,你就必须为你的语言编写一个真正的解析器。一旦有了它,您就可以将语言中的任何程序转换为数据结构。使用该数据结构,您将能够对代码进行各种分析,包括至少过去被称为使用定义和定义使用链分析的过程

如果你编造了一种“编程语言”,在应用程序中启用一些脚本,那么不管你认为它多么微不足道,最终还是会有人用它编写一个惊人的大程序

我不知道有任何现成的解析器生成器可以生成JavaScript解析器。递归下降解析器编写起来并不困难,但维护起来可能会很困难,而且扩展语法也会有点困难(特别是如果您没有丰富的原始版本制作经验的话)。

您可能想看看哪一个解析器生成器在Javascript中为语法生成解析器。您需要弄清楚如何使用BNF和EBNF描述您的语言。另外,JS/CC有自己的语法(有点接近实际的BNF/EBNF)来指定语法。给定语法,JS/CC将为该语法生成一个解析器

正如Pointy所说,您的另一个选择是从头开始编写自己的lexer和递归下降解析器。一旦你有了BNF/EBNF,就没那么难了。我最近用Javascript从一个EBNF编写了一个解析器(语法非常简单,所以编写一个YMMV并不难)

以回应您关于“特定于客户”的评论。我还将在这里补充我自己的经验。如果您提供的是脚本语言和脚本环境,那么没有比实际的解析器更好的方法了

通过一系列if-elses来处理特殊情况将是一场可怕的痛苦和维护噩梦。当我还是大学一年级的时候,我试着写我自己的语言。这是在我了解递归下降解析器之前,或者只是一般的解析器。我自己发现代码可以分解成令牌。在此基础上,我使用一堆if-else编写了一个极其笨拙的解析器,并将标记按空格和其他字符进行拆分(正如您所描述的)。结果很糟糕

一旦我读到递归下降解析器,我就为我的语言编写了一个语法,并且轻松地创建了一个解析器,只花了我编写原始解析器所需时间的十分之一。说真的,如果你
var code = 'alert(1);';
eval(code);