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')