Ejemplo n.º 1
0
    def do_parse(self, llparser):
        start_pos = llparser.position
        count = 0
        results = []
        if self.open_token is not None:
            next_token = llparser.peek_token()
            if next_token.token_type != self.open_token:
                return ParseError("Expecting open list token '{0}' got: {1}"\
                        .format(self.open_token, next_token.token_type),
                        next_token.start_pos,
                        next_token.end_pos)
            llparser.next_token()
        while True:
            # forget parsers
            result = self.forget_parse(llparser)
            if result is not None and result.iserror:
                return result

            result = self.parser.parse(llparser)
            if result.iserror:
                break
            # result is not an error
            results.append(result)
            count += 1

            # forget parsers
            result = self.forget_parse(llparser)
            if result is not None and result.iserror:
                return result

            # separator
            if self.sep_token is not None:
                next_token = llparser.peek_token()
                if next_token.token_type != self.sep_token:
                    break
                llparser.next_token()
        # end of loop
        if self.close_token is not None: 
            next_token = llparser.peek_token()
            if next_token.token_type != self.close_token:
                return ParseError("Expecting close list token "
                                              "'{0}' got: {1}"\
                        .format(self.close_token, next_token.token_type),
                        next_token.start_pos,
                        next_token.end_pos)

            llparser.next_token()

        if count == 0 and self.minimum == 0:
            return ParseResult(None, start_pos, llparser.position)
        elif 0 < count < self.minimum:
            return ParseError('{0} element(s) is not enough '
                                  '(minimum={1})'\
                                  .format(count, self.minimum),\
                                  start_pos,\
                                  llparser.position)

        return ParseResult(results, start_pos, llparser.position)
Ejemplo n.º 2
0
 def do_parse(self, llparser):
     start_pos = llparser.position
     result = self.parser.parse(llparser)
     if result.iserror:
         return ParseResult(None, start_pos, llparser.position)
     # ok, parsed
     return result
Ejemplo n.º 3
0
 def do_parse(self, llparsing):
     start_pos = llparsing.position
     token = llparsing.peek_token()
     if token.token_type == self.__token_type:
         return ParseResult(llparsing.next_token(),
                            start_pos, llparsing.position)
     else:
         return ParseError("Expecting '{0}' token"\
                           .format(self.__token_type),
                           start_pos, llparsing.position)
Ejemplo n.º 4
0
    def do_parse(self, llparser):
        start_pos = llparser.position
        count = 0
        results = []
        while True:
            # forget parsers
            result = self.forget_parse(llparser)
            if result is not None and result.iserror:
                return result

            result = self.parser.parse(llparser)
            if result.iserror:
                if count == 0 and self.minimum == 0:
                    return ParseResult(None, start_pos, llparser.position)
                elif 0 < count < self.minimum:
                    return ParseError('{0} repetition(s) is not enough '
                                      '(minimum={1})'\
                                      .format(count, self.minimum),\
                                      start_pos,\
                                      llparser.position)
                    # TODO: stacking errors ?
                else:
                    return ParseResult(results, start_pos, llparser.position)
            results.append(result)
Ejemplo n.º 5
0
    def do_parse(self, llparser):
        start_pos = llparser.position
        results = []
        for i in range(len(self.__parsers)):
            # forget parsers
            result = self.forget_parse(llparser)
            if result is not None and result.iserror:
                return result

            # skip parsers
            skips = None
            if i in self.__skips:
                skips = self.__skips[i]
            if skips:
                for skip in skips:
                    result = skip.parse(llparser)
                    if result.iserror:
                        return result
            # element
            parser = self.__parsers[i]
            result = parser.parse(llparser)
            if result.iserror:
                return result
            results.append(result)

        # last skips
        skips = None
        if len(self.__parsers) in self.__skips:
            skips = self.__skips[len(self.__parsers)]
        if skips:
            for skip in skips:
                result = skip.parse(llparser)
                if result.iserror:
                    return result

        end_pos = llparser.position
        if len(results) == 1:
            results = results[0]
        return ParseResult(results, start_pos, end_pos)
Ejemplo n.º 6
0
    def parse(self, llparsing):
        if llparsing.debug_mode:
            llparsing.debug.enter(llparsing, self)

        result = self.forget_parse(llparsing)
        if result is not None and result.iserror:
            return result

        result = self.do_parse(llparsing)

        fresult = self.forget_parse(llparsing)
        if fresult is not None and fresult.iserror:
            return fresult

        if llparsing.debug_mode:
            llparsing.debug.leave(llparsing, self)

        if not result.iserror:
            if self.xform_result:
                result = self.xform_result(result)
            elif self.xform_content:
                result = ParseResult(self.xform_content(result),
                                     result.start_pos, result.end_pos)
        return result