import abstract_types tokens_enum = ['global_res_word','context_res_word', 'res_symbol', 'identifier', 'string_type', 'int_type', 'float_type'] tokens = abstract_types.enum(tokens_enum) glob_res = ['VAR', 'IF', 'WHILE', 'FOR', 'PRINT'] cont_res = ['break', 'next', 'loop', 'else'] symb_res = ['+', '-', '*', '/', '(', ')', '^', '%', 'EOF'] token_type = abstract_types.record() token_type.infile = file('d:/source.bpl', 'r') token_type.cur_str = "" token_type.cur_str_len = 0 token_type.cur_line = 0 token_type.cur_pos = 0 token_type.type_of_token = tokens token_type.read_str = "" token_type.cap_str = "" token_type.int_val = 0 token_type.float_val = 0.0 token_type.glob_res_word = glob_res token_type.cont_res_word = cont_res token_type.res_sym = symb_res def is_delim(char): if ' ,;'.find(char) <> -1: return 1 return 0 def is_ident(char): if 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.find(char) <> -1: return 1 return 0 def is_num(char): if '0123456789'.find(char) <> -1: return 1 return 0 def is_res_symbol(char): if char in ['+', '-', '*', '/', '(', ')', '^', '%', 'EOF']: return 1 return 0 def numeric(num): if num.find(".") <> -1 or num.find("E") <> -1: return 1 return 0 def advance_token(token): glob_res = ['VAR', 'IF', 'WHILE', 'FOR', 'PRINT'] cont_res = ['BREAK', 'NEXT', 'LOOP', 'ELSE'] symb_res = ['+', '-', '*', '/', '(', ')', '^', '%', 'EOF'] token.cur_str = "" token.read_str = "" token.cap_str = "" while (token.cur_str[token.cur_pos] == " "): if token.cur_pos > token.cur_str_len: token.cur_str = token.infile.readline() token.cur_str_len = len(token.cur_str) token.cur_pos = 0 if not token.cur_str: token.type_of_token = 'RESERVED_SYMBOL' token.res_sym = 'EOF' read_str_idx = 0 while (not is_delim(token.cur_str[token.cur_pos])): token.read_str[read_str_idx] = token.cur_str[token.cur_pos] token.cap_str[read_str_idx] = token.cur_str[token.cur_pos].ucase() read_str_idx += 1 if is_ident(token.cap_str[0]): if token.cap_str in glob_res: token.type_of_token = 'GLOBAL_RES_WORD' token.glob_res_word = token.cap_str return else: token.glob_res_word = 'UNDEFINED' if token.type_of_token in cont_res: token.type_of_token = 'CONTEXT_RES_WORD' token.cont_res_word = token.cap_str return else: token.cont_res_word = 'UNDEFINED' token.type_of_token = 'IDENTIFIER' return if is_num(token.cap_str[0]): num = numeric(token.cap_str) if num: token.type_of_token = 'FLOAT' token.float_val = float(token.cap_str) return else: token.type_of_token = 'INT' token.int_val = int(token.cap_str) return if is_res_symbol(token.cap_str[0]): token.res_sym = token.cap_str token.type_of_token = 'RESERVED' return token.type_of_token = 'UNKNOWN' return