var vars = ['a','b','c']
	,expressions = ['! ( a || b || c )', '(!a && !b && !c)'];
	
document.getElementById('getResult').addEventListener('click', ()=>{
	var len = vars.length
		,splitBy = Math.round(len/2)
		,trueSet
		,trues = []
		,falses = []
		,truthData = [];
	
	vars = document.getElementById('vars').value.split(',');
	expressions = document.getElementById('expression').value.split(',');

	
	truthData.push(truth(vars, vars, true));
	for(var i=1; i<=splitBy; i++) {
		trueSet = reduceToCombinations(permut(vars, i));
		
		trueSet.forEach((truthSrc)=>{
			trues = truth(vars, truthSrc);
			truthData.push(trues);
		});
		
		
	}
	truthData.push(truth(vars, vars));
	
	writeTruthTable(truthData);
});

function truth(set, truths, reverse) {
	var w = {};
	
	set.forEach(v=>w[v]=(truths.indexOf(v)>=0 ? true : false)^reverse);
	
	return w;
}

function reduceToCombinations(arr) {
	var i=1
		,lastEl;

	arr = arr.map(v=>{return v.split('').sort().join('')}).sort();
	
	lastEl = arr[0];
	while(i<arr.length) {
		if(arr[i] == lastEl) {
			arr.splice(i,1);
		} else {
			lastEl = arr[i];
			i++;
		}
	}
	
	arr = arr.map(v=>{return v.split('')});
	
	return arr;
}

function writeTruthTable(truthData) {
	var table = '<table cellpadding=0 cellspacing=0>'
		,keys
		,vals
		,exprRes;
		
	table += '<thead><tr>';
	vars.forEach(v=>{
		table += '<th>';
		table += v;
		table += '</th>';
	});
	expressions.forEach(v=>{
		table += '<th>';
		table += v;
		table += '</th>';
	});
	table += '</tr></thead>';
	
	truthData.forEach((v)=> {
		vals = [];
		keys = [];
		table += '<tr>';
		console.log(v);
		for(i in v){
			vals.push(v[i]);
			keys.push(i);
			table += '<td>';
			table += v[i];
			table += '</td>';
		};
		for(var i = 0; i<keys.length; i++) {
			eval(`var ${keys[i]} = ${vals[i]};`);
		}
		expressions.forEach((expr)=>{
			exprRes = eval(expr);
			table += `<td class="${exprRes}">`;
			table += exprRes ? 'T' : 'F';
			table += '</td>';
		});
		
		table += '</tr>';
	});
	
	table += '</table>';
	
	document.getElementById('result').innerHTML = table;
}

function permut(arr, c) {
	var buf = []
		,len
		,arrSlice
		,permArr
		,proArr;
	if(c<=1) {
		return arr;
	} else {
		len = arr.length;
		for(var i=0;i<len;i++) {
			arrSlice = arr.slice(0,i).concat(arr.slice(i+1));
			permArr = permut(arrSlice,c-1);
			proArr = [];
			for(var y=0; y<permArr.length; y++) {
				proArr.push([arr[i]].concat(permArr[y]).join(''));
			}
			buf.push(...proArr);
		}
	}
	return buf;
}
evalmachine.<anonymous>:4
document.getElementById('getResult').addEventListener('click', ()=>{
^

ReferenceError: document is not defined
    at evalmachine.<anonymous>:4:1
    at ContextifyScript.Script.runInThisContext (vm.js:25:33)
    at Object.runInThisContext (vm.js:97:38)
    at run ([eval]:1020:15)
    at onRunRequest ([eval]:864:18)
    at onMessage ([eval]:828:13)
    at emitTwo (events.js:106:13)
    at process.emit (events.js:191:7)
    at process.nextTick (internal/child_process.js:758:12)
    at _combinedTickCallback (internal/process/next_tick.js:73:7)
const A = () => {
    console.log('A');
    return true;
  }
  const B = () => {
    console.log('B');
    return true;
  }
  const C = () => {
    console.log('C');
    return false;
  }A() || B() && C()
  // prints "A", returns true
  (A() || B()) && C()
  // prints "A C", returns false
evalmachine.<anonymous>:12
  }A() || B() && C()
   ^

SyntaxError: Unexpected identifier
    at createScript (vm.js:56:10)
    at Object.runInThisContext (vm.js:97:10)
    at run ([eval]:1020:15)
    at onRunRequest ([eval]:864:18)
    at onMessage ([eval]:828:13)
    at emitTwo (events.js:106:13)
    at process.emit (events.js:191:7)
    at process.nextTick (internal/child_process.js:758:12)
    at _combinedTickCallback (internal/process/next_tick.js:73:7)
    at process._tickCallback (internal/process/next_tick.js:104:9)
from itertools import product

while True:
    bexp = input('\nBoolean expression: ')
    bexp = bexp.strip()
    if not bexp:
        print("\nThank you")
        break
    code = compile(bexp, '<string>', 'eval')
    names = code.co_names
    print('\n' + ' '.join(names), ':', bexp)
    for values in product(range(2), repeat=len(names)):
        env = dict(zip(names, values))
        print(' '.join(str(v) for v in values), ':', eval(code, env))
 : 1
 : 1

 : 2
 : 2

 : 3
 : 3

 : 1
 : 1

 : 1
 : 1

 : 1
 : 1

 : 1
 : 1

 : 2
 : 2

Thank you