给出一个2值布尔代数的任意公式,例如(1V0)∧1V〜(0∧1)。如何使用JavaScript获得此公式的结果?我的意思是,老师给了一个公式,我的程序应该将结果打印为1或0。
答案 0 :(得分:1)
我想本练习的目的是学习语法分析和形式语法的基础。这是一些帮助您入门的信息。
首先,将输入分为“令牌”或符号(运算符,值,括号)。这称为“词法化”,在您的情况下相当琐碎,因为符号始终是一个字符。
然后,根据这些标记构建一个解析树或“ AST”。解析树中的每个节点都是对象operator left right
,其中left
和right
可以是值或其他节点对象。例如,
a v b ^ c
产生以下解析树
operator = v
left = a
right = {
operator = ^
left = b
right = c
}
要构建解析器,您需要为表达式定义一组正式规则,称为“语法”。布尔值的示例语法:
<b-expression>::= <b-term> [OR <b-term>]*
<b-term> ::= <not-factor> [AND <not-factor>]*
<not-factor> ::= [NOT] <b-factor>
<b-factor> ::= <b-literal> | <b-variable> | (<b-expression>)
(https://compilers.iecc.com/crenshaw/tutor6.txt)
建立AST之后,您可以使用简单的递归算法“评估”每个树节点:
evaluate(node)
if node is a value (e.g. "1"), return this value
otherwise,
L = evaluate(node.left)
R = evaluate(node.right)
V = apply node.operator to L and R
return V
希望这会有所帮助!
答案 1 :(得分:0)
您可以使用逻辑运算符,例如
并替换给定的布尔运算符。
console.log((1 || 0) && 1 || !(0 && 1));
答案 2 :(得分:0)
如果输入始终值得信赖,一种选择是将表达式转换为正确的JS语法,然后使用eval
:
const check = str => Boolean(eval(str
.replace(/v/gi, '||')
.replace(/∧/g, '&&')
.replace(/~/g, '!')
));
console.log(check('(1V0)∧1V~(0∧1)'));
console.log(check('0∧0'));
console.log(check('1∧1'));
console.log(check('1∧0'));
console.log(check('1V0'));
console.log(check('0V0'));