def match_to_block(match, cleaned_content, content): assert cleaned_content[match.end() - 1] == "(", "Block starts with %s" % (cleaned_content[match.end() - 1],) condition_end, condition_buffer = find_block(cleaned_content, match.end() - 1, "(", ")") block_content = content[match.end():condition_end - 1] brace_match = BRACE_PATTERN.match(cleaned_content[condition_end:]) line = len(content[:match.end()].splitlines()) ifelse_block = IfElseStatement(match.start(), line, content=block_content) if not brace_match: ifelse_block.ignored = True return ifelse_block buffer_start = condition_end + brace_match.end() - 1 alternatives = [] try: while True: buffer_end, block_buffer = find_block(cleaned_content, buffer_start, "{", "}") alternatives.append(IfElseAlternative(ifelse_block.start, buffer_start + 1, buffer_end, content[buffer_start + 1:buffer_end - 1])) ifelse_match = IFELSE_START_PATTERN.match(cleaned_content[buffer_end:]) else_match = ELSE_START_PATTERN.match(cleaned_content[buffer_end:]) if ifelse_match != None: condition_end, unused = find_block(cleaned_content, buffer_end + ifelse_match.end() - 1, "(", ")") brace_match = BRACE_PATTERN.match(cleaned_content[condition_end:]) if not brace_match: raise BrokenStatement() buffer_start = condition_end + brace_match.end() - 1 elif else_match != None: buffer_start = buffer_end + else_match.end() - 1 else: break except BrokenStatement: ifelse_block.ignored = True else: ifelse_block.ignored = False for a in alternatives: ifelse_block.alternatives.append(a) finally: return ifelse_block
def match_to_block(match, content): label = eval(content[match.start('label'):match.end('label')].strip()) maybe_block = MaybeStatement(MaybeStatement.BLOCK, match.start(), label) maybe_block.line = len(content[:match.start()].splitlines()) + 1 buffer_start = match.end() - 1 value = 0 while True: buffer_end, block_buffer = find_block(content, buffer_start, "{", "}") maybe_block.alternatives.append(MaybeAlternative(value, maybe_block.start, buffer_start + 1, buffer_end, block_buffer[1:-1])) value += 1 or_match = ALTERNATIVE_START_PATTERN.match(content[buffer_end:]) if or_match != None: buffer_start = buffer_end + or_match.end() - 1 else: break maybe_block.end = buffer_end maybe_block.content = content[maybe_block.start:maybe_block.end] return maybe_block