Beispiel #1
0
    def parseCommand():
        current = Parser.tokens.actual

        if current.type == "VARIABLE":
            var = n.Identifier(current.value)
            Parser.tokens.selectNext()
            current = Parser.tokens.actual

            if current.type == "ASSIGNMENT":
                Parser.tokens.selectNext()
                current = Parser.tokens.actual

                if current.value == "readline":
                    Parser.tokens.selectNext()
                    current = Parser.tokens.actual

                    if current.type == "OPEN":
                        Parser.tokens.selectNext()
                        current = Parser.tokens.actual

                        if current.type == "CLOSE":
                            Parser.tokens.selectNext()
                            nRead = n.ReadLine()
                            node = n.Assignment("ASSIGNMENT", [var, nRead])
                            current = Parser.tokens.actual

                        else:
                            raise Exception(
                                "Queria CLOSE, recebeu {}".format(current.type))
                    else:
                        raise Exception(
                            "Queria OPEN, recebeu {}".format(current.type))

                else:
                    exp = Parser.parseRelExpression()
                    node = n.Assignment("ASSIGNMENT", [var, exp])
                    current = Parser.tokens.actual

                if current.type == "ENDLINE":
                    Parser.tokens.selectNext()

                    return node

                else:
                    raise Exception(
                        "Queria ENDLINE, recebeu {}".format(current.type))
            else:
                raise Exception(
                    "Queria ASSIGNMENT, recebeu {}".format(current.type))

        elif current.type == "RESERVED":

            if current.value == "println":
                Parser.tokens.selectNext()
                current = Parser.tokens.actual

                if current.type == "OPEN":
                    Parser.tokens.selectNext()
                    exp = Parser.parseRelExpression()
                    node = n.Println("PRINT", [exp])
                    current = Parser.tokens.actual

                    if current.type == "CLOSE":
                        Parser.tokens.selectNext()
                        current = Parser.tokens.actual

                        if current.type == "ENDLINE":
                            Parser.tokens.selectNext()

                            return node

                        else:
                            raise Exception(
                                "Queria ENDLINE, recebeu {}".format(current.type))
                    else:
                        raise Exception(
                            "Queria CLOSE, recebeu {}".format(current.type))
                else:
                    raise Exception(
                        "Queria OPEN, recebeu {}".format(current.type))

            elif current.value == "if":
                Parser.tokens.selectNext()
                relExp = Parser.parseRelExpression()
                nodeIf = n.If("IF", [relExp])
                current = Parser.tokens.actual

                if current.type == "ENDLINE":
                    Parser.tokens.selectNext()
                    blockIf = Parser.parseBlock()
                    nodeIf.children.append(blockIf)
                    current = Parser.tokens.actual
                    listElseIf = []

                    if current.value == "elseif":

                        while current.value == "elseif":
                            Parser.tokens.selectNext()
                            relExp = Parser.parseRelExpression()
                            nodeElseIf = n.If("ELSEIF", [relExp])
                            current = Parser.tokens.actual

                            if current.type == "ENDLINE":
                                Parser.tokens.selectNext()
                                blockElseIf = Parser.parseBlock()
                                nodeElseIf.children.append(blockElseIf)
                                listElseIf.append(nodeElseIf)
                                current = Parser.tokens.actual
                            
                            else:
                                raise Exception(
                                    "Queria ENDLINE, recebeu {}".format(current.type))

                        if current.value == "else":
                            Parser.tokens.selectNext()
                            current = Parser.tokens.actual
                
                            if current.type == "ENDLINE":
                                Parser.tokens.selectNext()
                                blockElse = Parser.parseBlock()
                                listElseIf[-1].children.append(blockElse)

                            else:
                                raise Exception(
                                    "Queria ENDLINE, recebeu {}".format(current.type))
                        elseIfRange = range(1,len(listElseIf))
                        elseIfRange = reversed(elseIfRange)
                        for i in elseIfRange:
                            listElseIf[i-1].children.append(listElseIf[i])

                        nodeIf.children.append(listElseIf[0])

                    elif current.value == "else":
                        Parser.tokens.selectNext()
                        current = Parser.tokens.actual
                        
                        if current.type == "ENDLINE":
                            Parser.tokens.selectNext()
                            blockElse = Parser.parseBlock()
                            nodeIf.children.append(blockElse)

                        else:
                            raise Exception(
                                "Queria ENDLINE, recebeu {}".format(current.type))

                    current = Parser.tokens.actual

                    if current.value == "end":
                        Parser.tokens.selectNext()
                        current = Parser.tokens.actual

                        if current.type == "ENDLINE":
                            Parser.tokens.selectNext()

                            return nodeIf

                        else:
                            raise Exception(
                                "Queria ENDLINE, recebeu {}".format(current.type))

                    else:
                        raise Exception(
                            "Queria end, recebeu {}".format(current.value))

                else:
                    raise Exception(
                        "Queria ENDLINE, recebeu {}".format(current.type))

            elif current.value == "while":
                Parser.tokens.selectNext()
                relExp = Parser.parseRelExpression()
                node = n.While("WHILE", [relExp])
                current = Parser.tokens.actual

                if (current.type == "ENDLINE"):
                    Parser.tokens.selectNext()
                    blockWhile = Parser.parseBlock()
                    node.children.append(blockWhile)
                    current = Parser.tokens.actual

                    if current.value == "end":
                        Parser.tokens.selectNext()
                        current = Parser.tokens.actual

                        if current.type == "ENDLINE":
                            Parser.tokens.selectNext()
                            return node

                        else:
                            raise Exception(
                                "Queria ENDLINE, recebeu {}".format(current.type))

                    else:
                        raise Exception(
                            "Queria end, recebeu {}".format(current.type))

                else:
                    raise Exception(
                        "Queria ENDLINE, recebeu {}".format(current.value))
                
            elif current.value == "local":
                Parser.tokens.selectNext()
                current = Parser.tokens.actual
                if current.type == "VARIABLE":
                    var = n.Identifier(current.value)
                    Parser.tokens.selectNext()
                    current = Parser.tokens.actual
                    if current.type == "DECLARE":
                        Parser.tokens.selectNext()
                        current = Parser.tokens.actual
                        if current.type == "TYPE":
                            varType = n.Type(current.value)
                            node = n.DeclareVar("DECVAR", [var, varType])
                            Parser.tokens.selectNext()
                            current = Parser.tokens.actual
                            if current.type == "ENDLINE":
                                Parser.tokens.selectNext()
                                return node


        elif (current.type == "ENDLINE"):
            Parser.tokens.selectNext()

            return n.NoOp()

        else:
            raise Exception(
                "Queria ENDLINE - final, recebeu {}".format(current.type))