예제 #1
0
    def GetParser(cls):
        # match for optional whitespacex
        token = yield
        if isinstance(token, SpaceToken): token = yield
        # match for DELETE keyword
        if (not isinstance(token, StringToken)):
            raise MismatchingParserResult(
                "DeleteParser: Expected DELETE keyword.")
        if (token.Value.lower() != "delete"):
            raise MismatchingParserResult(
                "DeleteParser: Expected DELETE keyword.")
        # match for whitespace
        token = yield
        if (not isinstance(token, SpaceToken)):
            raise MismatchingParserResult(
                "DeleteParser: Expected whitespace before filename.")

        # match for string: file; use a StringLiteralParser to parse the pattern
        parser = StringLiteral.GetParser()
        parser.send(None)

        file = None
        try:
            while True:
                token = yield
                parser.send(token)
        except MatchingParserResult as ex:
            file = ex.value.Value

        # match for optional whitespace
        token = yield
        if isinstance(token, SpaceToken): token = yield
        # match for delimiter sign: \n
        commentText = ""
        if (not isinstance(token, CharacterToken)):
            raise MismatchingParserResult(
                "DeleteParser: Expected end of line or comment")
        if (token.Value == "\n"):
            pass
        elif (token.Value == "#"):
            # match for any until line end
            while True:
                token = yield
                if (isinstance(token, CharacterToken)
                        and (token.Value == "\n")):
                    break
                commentText += token.Value
        else:
            raise MismatchingParserResult(
                "DeleteParser: Expected end of line or comment")

        # construct result
        result = cls(file, commentText)
        raise MatchingParserResult(result)
예제 #2
0
    def GetParser(cls):
        # match for optional whitespace
        token = yield
        if isinstance(token, SpaceToken): token = yield
        # match for keyword: APPENDLINE
        if (not isinstance(token, StringToken)):
            raise MismatchingParserResult(
                "AppendLineParser: Expected APPENDLINE keyword.")
        if (token.Value.lower() != "appendline"):
            raise MismatchingParserResult(
                "AppendLineParser: Expected APPENDLINE keyword.")
        # match for whitespace
        token = yield
        if (not isinstance(token, SpaceToken)):
            raise MismatchingParserResult(
                "AppendLineParser: Expected whitespace before append pattern.")

        # match for string: appendPattern; use a StringLiteralParser to parse the pattern
        parser = StringLiteral.GetParser()
        parser.send(None)
        appendPattern = None
        try:
            while True:
                token = yield
                parser.send(token)
        except MatchingParserResult as ex:
            appendPattern = ex.value.Value

        # match for optional whitespace
        token = yield
        if isinstance(token, SpaceToken): token = yield
        # match for delimiter sign: \n
        commentText = ""
        if (not isinstance(token, CharacterToken)):
            raise MismatchingParserResult(
                "AppendLineParser: Expected end of line or comment")
        if (token.Value == "\n"):
            pass
        elif (token.Value == "#"):
            # match for any until line end
            while True:
                token = yield
                if (isinstance(token, CharacterToken)
                        and (token.Value == "\n")):
                    break
                commentText += token.Value
        else:
            raise MismatchingParserResult(
                "AppendLineParser: Expected end of line or comment")

        # construct result
        result = cls(appendPattern, commentText)
        raise MatchingParserResult(result)
예제 #3
0
    def GetParser(cls):
        # match for optional whitespacex
        token = yield
        if isinstance(token, SpaceToken): token = yield
        # match for COPY keyword
        if (not isinstance(token, StringToken)):
            raise MismatchingParserResult("CopyParser: Expected COPY keyword.")
        if (token.Value.lower() != "copy"):
            raise MismatchingParserResult("CopyParser: Expected COPY keyword.")
        # match for whitespace
        token = yield
        if (not isinstance(token, SpaceToken)):
            raise MismatchingParserResult(
                "CopyParser: Expected whitespace before source filename.")

        # match for string: 		sourceFile; use a StringLiteralParser to parse the pattern
        parser = StringLiteral.GetParser()
        parser.send(None)

        sourceFile = None
        try:
            while True:
                token = yield
                parser.send(token)
        except MatchingParserResult as ex:
            sourceFile = ex.value.Value

        # match for whitespace
        token = yield
        if (not isinstance(token, SpaceToken)):
            raise MismatchingParserResult(
                "CopyParser: Expected whitespace before TO keyword.")
        # match for TO keyword
        token = yield
        if (not isinstance(token, StringToken)):
            raise MismatchingParserResult("CopyParser: Expected TO keyword.")
        if (token.Value.lower() != "to"):
            raise MismatchingParserResult("CopyParser: Expected TO keyword.")
        # match for whitespace
        token = yield
        if (not isinstance(token, SpaceToken)):
            raise MismatchingParserResult(
                "CopyParser: Expected whitespace before destination directory."
            )

        # match for string: 		destinationDirectory; use a StringLiteralParser to parse the pattern
        parser = StringLiteral.GetParser()
        parser.send(None)

        destinationDirectory = None
        try:
            while True:
                token = yield
                parser.send(token)
        except MatchingParserResult as ex:
            destinationDirectory = ex.value.Value

        # match for optional whitespace
        token = yield
        if isinstance(token, SpaceToken): token = yield
        # match for delimiter sign: \n
        commentText = ""
        if (not isinstance(token, CharacterToken)):
            raise MismatchingParserResult(
                "CopyParser: Expected end of line or comment")
        if (token.Value == "\n"):
            pass
        elif (token.Value == "#"):
            # match for any until line end
            while True:
                token = yield
                if (isinstance(token, CharacterToken)
                        and (token.Value == "\n")):
                    break
                commentText += token.Value
        else:
            raise MismatchingParserResult(
                "CopyParser: Expected end of line or comment")

        # construct result
        result = cls(sourceFile, destinationDirectory, commentText)
        raise MatchingParserResult(result)
예제 #4
0
    def GetParser(cls):
        # match for IN ... FILE clause
        # ==========================================================================
        # match for optional whitespace
        token = yield
        if isinstance(token, SpaceToken): token = yield
        # match for keyword: FILE
        if (not isinstance(token, StringToken)):
            raise MismatchingParserResult("FileParser: Expected FILE keyword.")
        if (token.Value.lower() != "file"):
            raise MismatchingParserResult("FileParser: Expected FILE keyword.")
        # match for whitespace
        token = yield
        if (not isinstance(token, SpaceToken)):
            raise MismatchingParserResult(
                "FileParser: Expected whitespace before filename.")

        # match for string: replaceFilename; use a StringLiteralParser to parse the pattern
        parser = StringLiteral.GetParser()
        parser.send(None)

        replaceFilename = None
        try:
            while True:
                token = yield
                parser.send(token)
        except MatchingParserResult as ex:
            replaceFilename = ex.value.Value

        # match for optional whitespace
        token = yield
        if isinstance(token, SpaceToken): token = yield
        # match for delimiter sign: \n
        commentText = ""
        if (not isinstance(token, CharacterToken)):
            raise MismatchingParserResult(
                "FileParser: Expected end of line or comment")
        if (token.Value == "\n"):
            pass
        elif (token.Value == "#"):
            # match for any until line end
            while True:
                token = yield
                if (isinstance(token, CharacterToken)
                        and (token.Value == "\n")):
                    break
                commentText += token.Value
        else:
            raise MismatchingParserResult(
                "FileParser: Expected end of line or comment")

        # match for inner statements
        # ==========================================================================
        # construct result
        result = cls(replaceFilename, commentText)
        parser = cls.GetRepeatParser(result.AddStatement,
                                     InFileStatements.GetParser)
        parser.send(None)

        try:
            while True:
                token = yield
                parser.send(token)
        except EmptyChoiseParserResult:
            print("ERROR in *.rules file -> fix me")
        except MatchingParserResult:
            pass

        # match for END FILE clause
        # ==========================================================================
        # match for optional whitespace
        if isinstance(token, SpaceToken): token = yield
        # match for keyword: END
        if (not isinstance(token, StringToken)):
            raise MismatchingParserResult("FileParser: Expected END keyword.")
        if (token.Value.lower() != "end"):
            raise MismatchingParserResult("FileParser: Expected END keyword.")
        # match for whitespace
        token = yield
        if (not isinstance(token, SpaceToken)):
            raise MismatchingParserResult(
                "FileParser: Expected whitespace before FILE keyword.")
        # match for keyword: FILE
        token = yield
        if (not isinstance(token, StringToken)):
            raise MismatchingParserResult("FileParser: Expected FILE keyword.")
        if (token.Value.lower() != "file"):
            raise MismatchingParserResult("FileParser: Expected FILE keyword.")
        # match for optional whitespace
        token = yield
        if isinstance(token, SpaceToken): token = yield
        # match for delimiter sign: \n
        if (not isinstance(token, CharacterToken)):
            raise MismatchingParserResult(
                "FileParser: Expected end of line or comment")
        if (token.Value == "\n"):
            pass
        elif (token.Value == "#"):
            # match for any until line end
            while True:
                token = yield
                if (isinstance(token, CharacterToken)
                        and (token.Value == "\n")):
                    break
        else:
            raise MismatchingParserResult(
                "FileParser: Expected end of line or comment")

        result.CommentText = commentText

        raise MatchingParserResult(result)
예제 #5
0
    def GetParser(cls):
        multiLine = False
        dotAll = False
        caseInsensitive = False

        # match for optional whitespace
        token = yield
        if isinstance(token, SpaceToken): token = yield
        # match for keyword: REPLACE
        if (not isinstance(token, StringToken)):
            raise MismatchingParserResult(
                "ReplaceParser: Expected REPLACE keyword.")
        if (token.Value.lower() != "replace"):
            raise MismatchingParserResult(
                "ReplaceParser: Expected REPLACE keyword.")
        # match for whitespace
        token = yield
        if (not isinstance(token, SpaceToken)):
            raise MismatchingParserResult(
                "ReplaceParser: Expected whitespace before search pattern.")

        # match for string: searchPattern; use a StringLiteralParser to parse the pattern
        parser = StringLiteral.GetParser()
        parser.send(None)
        searchPattern = None
        try:
            while True:
                token = yield
                parser.send(token)
        except MatchingParserResult as ex:
            searchPattern = ex.value.Value

        # match for whitespace
        token = yield
        if (not isinstance(token, SpaceToken)):
            raise MismatchingParserResult(
                "ReplaceParser: Expected whitespace before WITH keyword.")
        # match for WITH keyword
        token = yield
        if (not isinstance(token, StringToken)):
            raise MismatchingParserResult(
                "ReplaceParser: Expected WITH keyword.")
        if (token.Value.lower() != "with"):
            raise MismatchingParserResult(
                "ReplaceParser: Expected WITH keyword.")
        # match for whitespace
        token = yield
        if (not isinstance(token, SpaceToken)):
            raise MismatchingParserResult(
                "ReplaceParser: Expected whitespace before replace pattern.")

        # match for string: replacePattern; use a StringLiteralParser to parse the pattern
        parser = StringLiteral.GetParser()
        parser.send(None)

        replacePattern = None
        try:
            while True:
                token = yield
                parser.send(token)
        except MatchingParserResult as ex:
            replacePattern = ex.value.Value

        # match for optional whitespace
        token = yield
        if isinstance(token, SpaceToken): token = yield
        # match for line end, comment or OPTIONS keyword
        if isinstance(token, StringToken):
            if (token.Value.lower() == "options"):
                # match for whitespace
                token = yield
                if (not isinstance(token, SpaceToken)):
                    raise MismatchingParserResult(
                        "ReplaceParser: Expected whitespace before MULTILINE, DOTALL or CASEINSENSITIVE keyword."
                    )
                token = yield  # first keyword
                for _ in range(3):
                    # match for 				MULTILINE, DOTALL or CASEINSENSITIVE keyword
                    if (not isinstance(token, StringToken)):
                        raise MismatchingParserResult(
                            "ReplaceParser: Expected MULTILINE, DOTALL or CASEINSENSITIVE keyword."
                        )
                    if (token.Value.lower() == "multiline"):
                        multiLine = True
                    elif (token.Value.lower() == "dotall"):
                        dotAll = True
                    elif (token.Value.lower() == "caseinsensitive"):
                        caseInsensitive = True
                    else:
                        raise MismatchingParserResult(
                            "ReplaceParser: Expected MULTILINE, DOTALL or CASEINSENSITIVE keyword."
                        )
                    # match for optional whitespace
                    token = yield
                    if isinstance(token, SpaceToken): token = yield
                    if (not isinstance(token, CharacterToken)):
                        raise MismatchingParserResult(
                            "ReplaceParser: Expected more options, end of line or comment."
                        )
                    if (token.Value == ","):
                        # match for optional whitespace, before going into the next iteration
                        token = yield
                        if isinstance(token, SpaceToken): token = yield
                        continue  # with 'token' set to next keyword
                    else:
                        break

        # match for delimiter sign: \n or #
        commentText = ""
        if (not isinstance(token, CharacterToken)):
            raise MismatchingParserResult(
                "ReplaceParser: Expected end of line or comment")
        if (token.Value == "\n"):
            pass
        elif (token.Value == "#"):
            # match for any until line end
            while True:
                token = yield
                if (isinstance(token, CharacterToken)
                        and (token.Value == "\n")):
                    break
                commentText += token.Value
        else:
            raise MismatchingParserResult(
                "ReplaceParser: Expected end of line or comment")

        # construct result
        result = cls(searchPattern, replacePattern, caseInsensitive, multiLine,
                     dotAll, commentText)
        raise MatchingParserResult(result)