import sly class Lexer(sly.Lexer): # define token types tokens = { # Keyworkds BREAK, CASE, DEFAULT, ELSE, FLOAT, IF, INPUT, INT, OUTPUT, SWITCH, WHILE, # Operators RELOP, ADDOP, MULOP, OR, AND, NOT, CAST, # misc ID, NUM } ignore = ' \t' literals = { '(', ')', '{', '}', ',', ':', ';', '=' } # define each token RELOP = r'(==|!=|<|>|>=|<=)' ADDOP = r'(\+|-)' MULOP = r'(\*|/)' OR = '\|\|' AND = '&&' NOT = '!' CAST = r'static_cast<(int|float)>' ID = r'[a-zA-Z][a-zA-Z0-9]*' NUM = r'[0-9]+(\.[0-9]*)?' # define keywords on ID ID['break'] = BREAK ID['case'] = CASE ID['default'] = DEFAULT ID['else'] = ELSE ID['float'] = FLOAT ID['if'] = IF ID['input'] = INPUT ID['int'] = INT ID['output'] = OUTPUT ID['switch'] = SWITCH ID['while'] = WHILE @_(r'\n+') def newline(self, t): self.lineno += t.value.count('\n') def error(self, t): print(f"Error at line {self.lineno}: unexpect character {t.value[0]}") self.index += 1