From 63db22e50caddb75792b67534547cb3ac7ccff61 Mon Sep 17 00:00:00 2001 From: "Jay Freeman (saurik)" Date: Tue, 1 Dec 2015 23:43:24 -0800 Subject: [PATCH] Flex drove me crazy with "you just got jammed" :/. --- jammed.py | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100755 jammed.py diff --git a/jammed.py b/jammed.py new file mode 100755 index 0000000..7215564 --- /dev/null +++ b/jammed.py @@ -0,0 +1,91 @@ +#!/usr/bin/python + +import re +import sys + +tables = dict() +defines = dict() + +with open(sys.argv[1], 'r') as file: + while True: + line = file.readline() + if line == '': + break + + define = re.match('#define ([A-Za-z_]*) ([0-9]+)', line) + if define != None: + defines[define.group(1)] = int(define.group(2)) + continue + + if not line.startswith('static yyconst '): + continue + + end = line.index('[') + begin = line.rindex(' ', 0, end) + name = line[begin+1:end] + + code = '' + while True: + line = file.readline() + code += line + if line.find(';') != -1: + break + + code = code.replace('{', '[') + code = code.replace('}', ']') + code = code.replace(';', ' ') + tables[name] = eval(code) + +yy_nxt = tables['yy_nxt'] +yy_accept = tables['yy_accept'] +yy_ec = tables['yy_ec'] + +YY_NUM_RULES = defines['YY_NUM_RULES'] +try: + jammed = yy_accept.index(YY_NUM_RULES) +except ValueError: + sys.exit(0) + +equivs = dict() +for ordinal, equiv in enumerate(yy_ec): + equivs[equiv] = equivs.get(equiv, '') + chr(ordinal) + +starts = set(range(1, len(yy_nxt))) +for source, table in enumerate(yy_nxt): + if source == 0: + continue + for equiv, target in enumerate(table): + if target in starts: + starts.remove(target) + +after = dict() +after[jammed] = [[]] + +while True: + finish = dict() + for start in starts: + suffix = after.get(start) + if suffix == None: + continue + finish[start] = [[equivs[c] for c in s] for s in suffix] + if len(finish) != 0: + print finish + break + + before = after + after = dict() + + for source, table in enumerate(yy_nxt): + if source == 0: + continue + string = [] + for equiv, target in enumerate(table): + suffix = before.get(target) + if suffix == None: + continue + string.extend([[equiv] + s for s in suffix]) + if len(string) == 0: + continue + after[source] = string + +sys.exit(1) -- 2.47.2