import itertools def generate_tokens(tokens): numbers = itertools.count(0) for line in tokens: line = line.strip() if not line or line.startswith("#"): continue name = line.split()[0] yield (name, next(numbers)) yield ("N_TOKENS", next(numbers)) yield ("NT_OFFSET", 256) def generate_opmap(tokens): for line in tokens: line = line.strip() if not line or line.startswith("#"): continue pieces = line.split() if len(pieces) != 2: continue name, op = pieces yield (op.strip("'"), name) # Yield independently <>. This is needed so it does not collide # with the token generation in "generate_tokens" because if this # symbol is included in Grammar/Tokens, it will collide with != # as it has the same name (NOTEQUAL). yield ("<>", "NOTEQUAL")