我将为客户构建一个解决方案,允许他们创建非常基本的代码。我已经完成了一些基本语法验证,但卡在了变量验证上。
我知道JSLint使用Javascript来实现这一点,我想知道是否有好的方法来做到这一点。
例如,假设用户编写了以下代码:
然后我试图找到一种方法来澄清“if”表达式是否符合正确的语法,变量moose是否已经初始化等等,但我不想逐个字符扫描来完成这个任务。代码是专门为这个应用程序构建的迷你语言,因此非常基础,不需要管理内存或其他任何东西。
我曾考虑过先按回车符拆分,然后再按空格拆分,但无法保证用户不会写类似于“moose =“barry””或“if(moose ==“barry”)”的内容,并且无法保证用户不会将条件结果保留在同一行内。
显然,编译器和解释器在更广泛的范围内执行此操作,但我不确定它们是否逐个字符执行此操作,如果确实如此,它们如何优化?
(另一个选择是将其发送回PHP进行处理,这将使浏览器免除责任)
有什么建议吗?
谢谢
在这种情况下,用例是有限的,语法永远不会扩展,在这种情况下,语言是一个简单的脚本语言,以便客户能够根据他们的用户输入创建独特的成本,最终结果将由PHP处理,以确保计算不能被最终用户调整并确保有一定的一致性。
例如,假设有1.00英镑的基础成本,并且表单上有一个名为“附加成本”的字段,语言将允许他们相对于“附加成本”字段操作基础成本。
我知道JSLint使用Javascript来实现这一点,我想知道是否有好的方法来做到这一点。
例如,假设用户编写了以下代码:
moose = "barry"
base = 0
if(moose == "barry"){base += 100}
然后我试图找到一种方法来澄清“if”表达式是否符合正确的语法,变量moose是否已经初始化等等,但我不想逐个字符扫描来完成这个任务。代码是专门为这个应用程序构建的迷你语言,因此非常基础,不需要管理内存或其他任何东西。
我曾考虑过先按回车符拆分,然后再按空格拆分,但无法保证用户不会写类似于“moose =“barry””或“if(moose ==“barry”)”的内容,并且无法保证用户不会将条件结果保留在同一行内。
显然,编译器和解释器在更广泛的范围内执行此操作,但我不确定它们是否逐个字符执行此操作,如果确实如此,它们如何优化?
(另一个选择是将其发送回PHP进行处理,这将使浏览器免除责任)
有什么建议吗?
谢谢
在这种情况下,用例是有限的,语法永远不会扩展,在这种情况下,语言是一个简单的脚本语言,以便客户能够根据他们的用户输入创建独特的成本,最终结果将由PHP处理,以确保计算不能被最终用户调整并确保有一定的一致性。
例如,假设有1.00英镑的基础成本,并且表单上有一个名为“附加成本”的字段,语言将允许他们相对于“附加成本”字段操作基础成本。
base = 1;
if(additional > 100 && additional < 150){base += 50}
elseif(additional == 150){base *= 150}
else{base += additional;}
这是一个基本示例,展示了语言的使用方式。
感谢您提供的所有答案, 我已经调查了一个解析器,发现创建一个解析器比所需的要复杂得多。 在运行了几个测试并处理了数千行代码后,即使在单核P4和512mb内存的情况下,逐个字符地处理只需要几秒钟的时间(这远远少于客户使用的)。
我决定构建一个基于PHP的语法检查器,它将在检查信息并将变量等转换为有效的PHP代码时进行检查(以便稍后可以直接调用而无需重新编译),使用此方法而不是javascript,这似乎更合适,并且允许出现更复杂的代码而不会妨碍验证过程。
仅花费了一个小时,我就编写了能够检查if语句的有效性并不会被嵌套的if、空格或奇怪的表达式所困惑的代码,剩下的工作很少,而一个解析器和完整的脚本语言则需要更长的时间。
你们给了我很多思考的东西,我已经评价了相关的答案,谢谢。
+=
运算符。 - meder omuraliev