gpt4 book ai didi

javascript - 如何在不使用 eval 或构造函数的情况下用 JavaScript 编写算术表达式解析器?

转载 作者:数据小太阳 更新时间:2023-10-29 04:29:52 25 4
gpt4 key购买 nike

给定一个字符串:

 var str1 = "25*5+5*7";

如果不使用 eval 或 JavaScript 中的构造函数,我将如何编写一个名为“output”的函数来接收字符串并输出字符串的算术值,在这个案例是160?

最佳答案

这是递归解析后的完整优先表达式求值器我在对 OP 问题的评论中链接到的想法。

为此,我首先为要处理的表达式编写了一个简单的 BNF 语法:

sum =  product | sum "+" product | sum "-" product ;
product = term | product "*" term | product "/" term ;
term = "-" term | "(" sum ")" | number ;

这本身就需要一些经验才能简单直接地完成。如果你没有使用 BNF 的经验,你会发现它对于描述复杂的项目流非常有用,例如表达式、消息、编程语言......

使用该语法,我遵循了另一条消息中概述的过程生成以下代码。很明显,它是由语法以一种愚蠢的机械方式驱动的,因此如果您掌握了该语法,就很容易编写。

(未经测试。我不是 JavaScript 编码员。这肯定会包含一些语法/语义问题。我花了大约 15 分钟的时间来编码。)

var SE="Syntax Error";

function parse(str) { // returns integer expression result or SE
var text=str;
var scan=1;
return parse_sum();

function parse_sum() {
var number, number2;
if (number=parse_product()==SE) return SE;
while (true) {
skip_blanks();
if (match("+") {
number2=parse_product();
if (number2==SE) return SE;
number+=number2;
}
else if (match('-')) {
{ number2=parse_product();
if (number2==SE) return SE;
number-=number2;
}
else return number;
}
}

function parse_product() {
var number, number2;
if (number=parse_number()==SE) return SE;
while (true) {
if (match("*") {
number2=parse_term();
if (number2==SE) return SE;
number*=number2;
}
else if (match('/')) {
number2=parse_term();
if (number2==SE) return SE;
number/=number2;
}
else return number;
}
}

function parse_term() {
var number;
skip_blanks();
if (match("(")) {
number=parse_sum();
if (number=SE) return SE;
skip_blanks();
if (!match(")") return SE;
}
else if match("-") {
number= - parse_term();
}
else if (number=parse_number()==SE) return SE;
return number;
}

function skip_blanks() {
while (match(" ")) { };
return;
}

function parse_number() {
number=0;
if (is_digit()) {
while (is_digit()) {}
return number;
}
else return SE;
}

var number;
function is_digit() { // following 2 lines are likely wrong in detail but not intent
if (text[scan]>="0" && text[scan]<="9") {
number=number*10+text[scan].toInt();
return true;
}
else return false;
}

function match(c) {
if (text[scan]==c)
{ scan++; return true }
else return false;
}
}

编写此类解析器/求值器的代码很简单。参见 my SO answer on how to build a parser (链接到如何构建评估器)。

关于javascript - 如何在不使用 eval 或构造函数的情况下用 JavaScript 编写算术表达式解析器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31600121/

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