Esempio n. 1
0
def parse_datatype(current, infile):
    '''parse the datatype and return Trit object that identifies the datatype
    '''
    if isinstance (current, Keyword):
        if current.name == "trit":
            return (nextToken(infile), "trit", 0)
        next =  compareKeywords(current, Keyword("trit_vector"), infile)

        valueOne = compareTokens(next, Token("("), infile)

        if not isinstance(valueOne, Literal):
            printError(valueOne, Literal("integer"))
        elif valueOne.value <= 0:
            printError(valueOne, Literal("greater than zero"))
        valueTwo = nextToken(infile)

        length = valueOne.value + 1

        valueThree = compareTokens(valueTwo, Keyword("downto"), infile)
        if not isinstance(valueThree, Literal):
            printError(valueThree, Literal("integer"))
        elif valueThree.value != 0:
            printError(valueThree, Literal(0))
        valueFour = nextToken(infile)
        
        valueFive = compareTokens(valueFour, Token(")"), infile)
        
        # construct datatype object for trit_vector and return it
        # along with the next token
        return (valueFive, "trit_vector", length)

    printError(current, Keyword("trit|trit_vector"))
Esempio n. 2
0
def tokenizeNumber(infile, value):
    '''tokenizeNumber: identify the next integer in the file
    '''
    next = infile.read(1)
    if next.isdigit():
        value = value + next
        return tokenizeNumber(infile, value)
    else:
        infile.seek(infile.tell() - 1)
        return Literal(str(value))
Esempio n. 3
0
def interpret():
    #keep track of values

    proof = []

    #line by line values
    indent = 0
    last_indent = 0

    #error checking
    paren = 0
    incomplete = False

    for lnum, line in enumerate(lines):
        indent = 0

        #error checking?

        #parsing
        if line[-1] == '\n':
            line = line[:-1]

        while line[0] == '\t':
            indent += 1
            line = line[1:]

        line = line.split(' ')
        while '' in line:
            line.remove('')

        parts = []
        for i, part in enumerate(line):
            part = part.split('(')
            for x in xrange(len(part) - 1):
                part.insert(2 * x, '(')

            for j, p in enumerate(part):
                p = p.split(')')
                for x in xrange(len(p) - 1):
                    p.insert(2 * len(p) + 1, ')')

                for l in p:
                    if l != '':
                        parts.append(l)

        print parts

        if parts[0] == '#':
            proof.append(Literal.Literal(parts[1:], 0, False))
        elif parts[0] == '-':
            proof.append(Literal.Literal(parts[1:], indent, False))
        elif parts[0] == 'STOP':
            break
        else:
            reason = parts[-3:-1] + parts[-1].split(',')
            proof.append(Literal.Literal(parts[:-4], indent, False))

            #deal with reason dashes
            sub = []
            if '-' in reason[-1]:
                sub = [int(x) for x in l.split('-')]

            ind = indent
            brk = False
            if reason[0] == "AND":
                if reason[1] == "INTRO":
                    for l in reason[2:]:
                        if not proof[int(l) - 1].andintro(proof[-1]):
                            print "Invalid line", lnum
                            brk = True
                            break
                    if not brk:
                        proof[-1].valid = True
                        print "VALID AND INTRO", lnum
                elif reason[1] == "ELIM":
                    for l in reason[2:]:
                        if not proof[int(l) - 1].andelim(proof[-1]):
                            print "Invalid line", lnum
                            brk = True
                            break
                    if not brk:
                        proof[-1].valid = True
                        print "VALID AND ELIM", lnum
            elif reason[0] == "OR":
                if reason[1] == "INTRO":
                    for l in reason[2:]:
                        if not proof[int(l) - 1].orintro(proof[-1]):
                            print "Invalid line", lnum
                            brk = True
                            break
                    if not brk:
                        proof[-1].valid = True
                        print "VALID OR INTRO", lnum
                elif reason[1] == "ELIM":
                    for l in reason[2:]:
                        if not proof[int(l) - 1].orelim(proof[-1]):
                            print "Invalid line", lnum
                            brk = True
                            break
                    if not brk:
                        proof[-1].valid = True
                        print "VALID OR ELIM", lnum
            elif reason[0] == "THEN":
                if reason[1] == "INTRO":
                    part1 = False
                    brk = False
                    if proof[sub[0] - 1].thenintro(proof[-1], 0):
                        part1 = True
                    if part1:
                        for ln in proof[sub[0] - 1:sub[1]]:
                            print "CHECK", ln
                            if ln.indent == ind + 1:
                                if ln.thenintro(proof[-1], 1):
                                    brk = True
                                    print "brk"
                                    break
                            elif ln.indent < ind:
                                print "not brk"
                                break

                    if not brk:
                        print "Invalid line", lnum
                    else:
                        proof[-1].valid = True
                        print "VALID THEN INTRO", lnum
                elif reason[1] == "ELIM":
                    if not proof[int(reason[2]) - 1].thenelim(
                            proof[int(reason[3]) - 1], proof[-1]):
                        print "Invalid line", lnum
                    else:
                        proof[-1].valid = True
                        print "VALID THEN ELIM", lnum
            elif reason[0] == "IFF":
                if reason[1] == "INTRO":
                    if not proof[-1].iffintro(proof[int(reason[2]) - 1],
                                              proof[int(reason[3]) - 1]):
                        print "Invalid line", lnum
                    else:
                        proof[-1].valid = True
                        print "VALID IFF INTRO", lnum
                elif reason[1] == "ELIM":
                    if not proof[int(reason[2]) - 1].iffelim(
                            proof[int(reason[3]) - 1], proof[-1]):
                        print "Invalid line", lnum
                        brk = True
                        break
                    else:
                        proof[-1].valid = True
                        print "VALID IFF ELIM", lnum
            elif reason[0] == "NOT":
                if reason[
                        1] == "INTRO":  #copy then intro except leads to false (ln.equals("false")) and proof[-1] is negative of proof[sub[0] - 1]
                    part1 = False
                    brk = False
                    if proof[sub[0] - 1].notintro(proof[-1]):
                        part1 = True
                    if part1:
                        for ln in proof[sub[0] - 1:sub[1]]:
                            print "CHECK", ln
                            if ln.indent == ind + 1:
                                if ln.equals("false"):
                                    brk = True
                                    print "brk"
                                    break
                            elif ln.indent < ind:
                                print "not brk"
                                break

                    if not brk:
                        print "Invalid line", lnum
                    else:
                        proof[-1].valid = True
                        print "VALID NOT INTRO", lnum
                elif reason[1] == "ELIM":
                    if not proof[int(reason[2]) - 1].notelim(proof[-1]):
                        print "Invalid line", lnum
                        brk = True
                        break
                    else:
                        proof[-1].valid = True
                        print "VALID FALSE ELIM", lnum
            elif reason[0] == "FALSE":
                if reason[1] == "INTRO":
                    if not proof[int(reason[2]) - 1].falseintro(
                            proof[int(reason[3]) - 1]):
                        print "Invalid line", lnum
                    if not brk:
                        proof[-1].valid = True
                        print "VALID FALSE INTRO", lnum
                elif reason[1] == "ELIM":
                    if not proof[-1].falseelim(proof[int(reason[2]) - 1]):
                        print "Invalid line", lnum
                    else:
                        proof[-1].valid = True
                        print "VALID FALSE ELIM", lnum