布尔公式

时间:2018-11-25 10:17:08

标签: javascript boolean

给出一个2值布尔代数的任意公式,例如(1V0)∧1V〜(0∧1)。如何使用JavaScript获得此公式的结果?我的意思是,老师给了一个公式,我的程序应该将结果打印为1或0。

3 个答案:

答案 0 :(得分:1)

我想本练习的目的是学习语法分析和形式语法的基础。这是一些帮助您入门的信息。

首先,将输入分为“令牌”或符号(运算符,值,括号)。这称为“词法化”,在您的情况下相当琐碎,因为符号始终是一个字符。

然后,根据这些标记构建一个解析树或“ AST”。解析树中的每个节点都是对象operator left right,其中leftright可以是值或其他节点对象。例如,

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'));