Initial parser.
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/smm.py Mon May 16 17:10:56 2011 +0200
1.3 @@ -0,0 +1,71 @@
1.4 +"""
1.5 +Name:
1.6 +
1.7 +Author: Eugen Sawin <sawine@informatik.uni-freiburg.de>
1.8 +"""
1.9 +from os import path
1.10 +import os
1.11 +import re
1.12 +import token
1.13 +
1.14 +NOT = "~"
1.15 +AND = "&"
1.16 +OR = "|"
1.17 +IMP = "->"
1.18 +EQ = "<->"
1.19 +BOX = "[]"
1.20 +DIAMOND = "<>"
1.21 +P = "p"
1.22 +
1.23 +TOKENS = {re.compile("~"): NOT,
1.24 + re.compile("&"): AND,
1.25 + re.compile("\|"): OR,
1.26 + re.compile("->"): IMP,
1.27 + re.compile("<->"): EQ,
1.28 + re.compile("\[\]"): BOX,
1.29 + re.compile("<>"): DIAMOND,
1.30 + re.compile("[a-z]+"): P}
1.31 +
1.32 +class Scanner(object):
1.33 + def __init__(self, tokens, source=None):
1.34 + self.tokens = tokens
1.35 + self.reset(source)
1.36 + def next(self):
1.37 + while self.i < len(self.source):
1.38 + for p, token in self.tokens.iteritems():
1.39 + m = p.match(self.source[self.i:])
1.40 + if m:
1.41 + self.i += m.end(0)
1.42 + value = m.group(0)
1.43 + return (token, value)
1.44 + self.i += 1
1.45 + def reset(self, source):
1.46 + self.i = 0
1.47 + self.source = source
1.48 +
1.49 +class Parser(object):
1.50 + def __init__(self, scanner):
1.51 + self.scanner = scanner
1.52 + def parse(self, source):
1.53 + self.scanner.reset(source)
1.54 + token = self.scanner.next()
1.55 + while token:
1.56 + print token
1.57 + token = self.scanner.next()
1.58 +
1.59 +
1.60 +def main():
1.61 + args = parse_arguments()
1.62 + scanner = Scanner(TOKENS)
1.63 + parser = Parser(scanner)
1.64 + parser.parse(args.formula)
1.65 +
1.66 +from argparse import ArgumentParser
1.67 +
1.68 +def parse_arguments():
1.69 + parser = ArgumentParser(description="Parses Simple Modal Logic syntax.")
1.70 + parser.add_argument("formula", help="your formula")
1.71 + return parser.parse_args()
1.72 +
1.73 +if __name__ == "__main__":
1.74 + main()