Initial parser.
authorEugen Sawin <sawine@me73.com>
Mon, 16 May 2011 17:10:56 +0200
changeset 059ddda9665be
child 1 a7ca3e23ff41
Initial parser.
smm.py
     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()