# HG changeset patch # User Eugen Sawin # Date 1305641284 -7200 # Node ID 8dd28f6bf42795c54c7aa8d85a0aaf5b253f0cf3 # Parent c7ca4a177c908772a1c9dd542821ce954cebefa2 Cleaned up. diff -r c7ca4a177c90 -r 8dd28f6bf427 smm.py --- a/smm.py Tue May 17 14:05:25 2011 +0200 +++ b/smm.py Tue May 17 16:08:04 2011 +0200 @@ -9,21 +9,29 @@ import token def main(): - args = parse_arguments() - scanner = Scanner(TOKENS) - parser = Parser(SYNTAX, scanner) - #(accepted, out, tree_nodes) = parser.parse(args.formula) - #tree = SyntaxTree(out, tree_nodes) - #print tree.root p = Variable(["p"]) q = Variable(["q"]) r = Variable(["r"]) - formula = Imp([Eq([p, q]), r]) - #formula = Not([Or([p, q])]) - #formula = Not([Not([p])]) + formula1 = Imp([Eq([p, q]), r]) + formula2 = Not([Or([p, q])]) + formula3 = Not([Not([p])]) + use = formula1 + + args = parse_arguments() + if (args.formula): + scanner = Scanner(TOKENS) + parser = Parser(SYNTAX, scanner) + (accepted, out, tree_nodes) = parser.parse(args.formula) + if not accepted: + print EXCUSE + return + tree = SyntaxTree(out, tree_nodes) + formula = tree.root + print formula print "reduced" print reduce(formula) + print reduce(formula) def reduce(formula): map = {IMP: lambda (a, b): Or([Not([a]), b]), @@ -39,9 +47,7 @@ if not isinstance(formula, Operator) or formula.id not in map: return formula return map[formula.id](values()) - - - + NOT = "~" AND = "&" OR = "|" @@ -64,9 +70,7 @@ out = str(self.values[0]) if self.arity == 1: out = self.id + str(self.values[0]) - elif self.arity == 2: - #print self.id - #print self.values + elif self.arity == 2: out = "(" + str(self.values[0]) + " " + self.id + " " + str(self.values[1]) + ")" return out @@ -247,15 +251,10 @@ class SyntaxTree(object): def __init__(self, seq, tree_nodes): seq.reverse() - tree_nodes.reverse() - print tree_nodes - print seq - self.root = self.compile(seq, tree_nodes)[0] - print self.root + tree_nodes.reverse() + self.root = self.compile(seq, tree_nodes)[0] def compile(self, seq, tree_nodes): - stack = [] - waiting = [] - print seq + stack = [] while len(seq): s = seq.pop() if s == 0: @@ -278,45 +277,17 @@ elif s == 7: stack.append(Imp(self.compile(seq, tree_nodes))) elif s == 8: - stack.append(Eq(self.compile(seq, tree_nodes))) - print stack - return stack - - def compile_(self, tree_nodes): - table = [] - unfinished = [] - node = None - print tree_nodes - for n, v in (tree_nodes): - print - print n - if n.arity >= 0: - if len(table) < n.arity: - print "appending unfinished ", n - unfinished.append(n) - else: - args = table[:n.arity] - if n.arity == 0: - args = [v] - table = table[n.arity:] - node = n(args) - table.append(node) - if len(unfinished) and unfinished[-1].arity <= len(table): - n = unfinished[-1] - print "finishing ", n - args = table[:n.arity] - table = table[n.arity:] - node = n(args) - table.append(node) - unfinished.pop() - return table[0] + stack.append(Eq(self.compile(seq, tree_nodes))) + return stack from argparse import ArgumentParser def parse_arguments(): parser = ArgumentParser(description="Parses simple modal logic syntax.") - parser.add_argument("formula", help="your formula") + parser.add_argument("-f", "--formula", help="your formula") return parser.parse_args() + +EXCUSE = """The formula was not accepted by the parser, because the parser doesn't like you or the rest of the world. It seems to have some real issues with formulae with inner nesting and generally suffers from its hasty implementation. The parser would like to thank you for your coorporation by providing the formula within the code file itself. Thank you.""" if __name__ == "__main__": main()