作者热门文章
- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
给定一个字符串:
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/
我是一名优秀的程序员,十分优秀!