def __after_dot(O, i_fld, i_dot): ssl = O.ssl stop = O.stop if (i_dot + 1 == stop): ssl.raise_error( msg="Expression unexpectedly ends with a dot", i=i_dot) code = ssl.code csw = code.startswith c = code[i_dot+1] if (c == "a"): if (not csw("nd.", i_dot+2)): ssl.raise_syntax_error(i=i_dot+2) tok = tk_op(ssl=ssl, i_code=i_dot, value=".and.") if (i_dot == i_fld): O.i = i_dot+5 return tok O.buffer.append((i_dot+5, tok)) O.i = i_dot return tk_integer(ssl=ssl, i_code=i_fld, value=code[i_fld:i_dot]) if (c == "o"): if (not csw("r.", i_dot+2)): ssl.raise_syntax_error(i=i_dot+2) tok = tk_op(ssl=ssl, i_code=i_dot, value=".or.") if (i_dot == i_fld): O.i = i_dot+4 return tok O.buffer.append((i_dot+4, tok)) O.i = i_dot return tk_integer(ssl=ssl, i_code=i_fld, value=code[i_fld:i_dot]) if (c == "e" or c == "d"): if (c == "e"): if (csw("q.", i_dot+2)): tok = tk_op(ssl=ssl, i_code=i_dot, value=".eq.") if (i_dot == i_fld): O.i = i_dot+4 return tok O.buffer.append((i_dot+4, tok)) O.i = i_dot return tk_integer(ssl=ssl, i_code=i_fld, value=code[i_fld:i_dot]) if (csw("qv.", i_dot+2)): tok = tk_op(ssl=ssl, i_code=i_dot, value=".eqv.") if (i_dot == i_fld): O.i = i_dot+5 return tok O.buffer.append((i_dot+5, tok)) return tk_integer(ssl=ssl, i_code=i_fld, value=code[i_fld:i_dot]) if (i_dot == i_fld): ssl.raise_syntax_error(i=i_dot+1) j = floating_point_scan_after_exponent_char( code=code, start=i_dot+2, stop=stop) if (j < 0): ssl.raise_syntax_error(i=i_dot+1) O.i = j if (c == "d"): return tk_double_precision( ssl=ssl, i_code=i_fld, value=code[i_fld:j]) return tk_real(ssl=ssl, i_code=i_fld, value=code[i_fld:j]) if (c == "f"): if (not csw("alse.", i_dot+2) or i_dot != i_fld): ssl.raise_syntax_error(i=i_dot+1) O.i = i_dot+7 return tk_logical(ssl=ssl, i_code=i_dot, value=".false.") if (c == "t"): if (not csw("rue.", i_dot+2) or i_dot != i_fld): ssl.raise_syntax_error(i=i_dot+1) O.i = i_dot+6 return tk_logical(ssl=ssl, i_code=i_dot, value=".true.") if (c == "n"): if (csw("ot.", i_dot+2)): if (i_dot != i_fld): ssl.raise_syntax_error(i=i_dot+1) O.i = i_dot+5 return tk_op(ssl=ssl, i_code=i_dot, value=".not.") if (csw("e.", i_dot+2)): tok = tk_op(ssl=ssl, i_code=i_dot, value=".ne.") if (i_dot == i_fld): O.i = i_dot+4 return tok O.buffer.append((i_dot+4, tok)) O.i = i_dot return tk_integer(ssl=ssl, i_code=i_fld, value=code[i_fld:i_dot]) if (csw("eqv.", i_dot+2)): tok = tk_op(ssl=ssl, i_code=i_dot, value=".neqv.") if (i_dot == i_fld): O.i = i_dot+6 return tok O.buffer.append((i_dot+6, tok)) O.i = i_dot return tk_integer(ssl=ssl, i_code=i_fld, value=code[i_fld:i_dot]) ssl.raise_syntax_error(i=i_dot+1) if (c == "g" or c == "l"): if (not csw("t.", i_dot+2) and not csw("e.", i_dot+2)): ssl.raise_syntax_error(i=i_dot+1) tok = tk_op(ssl=ssl, i_code=i_dot, value=code[i_dot:i_dot+4]) if (i_dot == i_fld): O.i = i_dot+4 return tok O.buffer.append((i_dot+4, tok)) O.i = i_dot return tk_integer(ssl=ssl, i_code=i_fld, value=code[i_fld:i_dot]) j = floating_point_scan_after_dot(code=code, start=i_dot+1, stop=stop) if (j < 0): ssl.raise_syntax_error(i=i_dot+1) O.i = j if (code.find("d", i_dot+1, O.i) < 0): tk_type = tk_real else: tk_type = tk_double_precision return tk_type(ssl=ssl, i_code=i_fld, value=code[i_fld:j])
def __after_dot(O, i_fld, i_dot): ssl = O.ssl stop = O.stop if (i_dot + 1 == stop): ssl.raise_error(msg="Expression unexpectedly ends with a dot", i=i_dot) code = ssl.code csw = code.startswith c = code[i_dot + 1] if (c == "a"): if (not csw("nd.", i_dot + 2)): ssl.raise_syntax_error(i=i_dot + 2) tok = tk_op(ssl=ssl, i_code=i_dot, value=".and.") if (i_dot == i_fld): O.i = i_dot + 5 return tok O.buffer.append((i_dot + 5, tok)) O.i = i_dot return tk_integer(ssl=ssl, i_code=i_fld, value=code[i_fld:i_dot]) if (c == "o"): if (not csw("r.", i_dot + 2)): ssl.raise_syntax_error(i=i_dot + 2) tok = tk_op(ssl=ssl, i_code=i_dot, value=".or.") if (i_dot == i_fld): O.i = i_dot + 4 return tok O.buffer.append((i_dot + 4, tok)) O.i = i_dot return tk_integer(ssl=ssl, i_code=i_fld, value=code[i_fld:i_dot]) if (c == "e" or c == "d"): if (c == "e"): if (csw("q.", i_dot + 2)): tok = tk_op(ssl=ssl, i_code=i_dot, value=".eq.") if (i_dot == i_fld): O.i = i_dot + 4 return tok O.buffer.append((i_dot + 4, tok)) O.i = i_dot return tk_integer(ssl=ssl, i_code=i_fld, value=code[i_fld:i_dot]) if (csw("qv.", i_dot + 2)): tok = tk_op(ssl=ssl, i_code=i_dot, value=".eqv.") if (i_dot == i_fld): O.i = i_dot + 5 return tok O.buffer.append((i_dot + 5, tok)) return tk_integer(ssl=ssl, i_code=i_fld, value=code[i_fld:i_dot]) if (i_dot == i_fld): ssl.raise_syntax_error(i=i_dot + 1) j = floating_point_scan_after_exponent_char(code=code, start=i_dot + 2, stop=stop) if (j < 0): ssl.raise_syntax_error(i=i_dot + 1) O.i = j if (c == "d"): return tk_double_precision(ssl=ssl, i_code=i_fld, value=code[i_fld:j]) return tk_real(ssl=ssl, i_code=i_fld, value=code[i_fld:j]) if (c == "f"): if (not csw("alse.", i_dot + 2) or i_dot != i_fld): ssl.raise_syntax_error(i=i_dot + 1) O.i = i_dot + 7 return tk_logical(ssl=ssl, i_code=i_dot, value=".false.") if (c == "t"): if (not csw("rue.", i_dot + 2) or i_dot != i_fld): ssl.raise_syntax_error(i=i_dot + 1) O.i = i_dot + 6 return tk_logical(ssl=ssl, i_code=i_dot, value=".true.") if (c == "n"): if (csw("ot.", i_dot + 2)): if (i_dot != i_fld): ssl.raise_syntax_error(i=i_dot + 1) O.i = i_dot + 5 return tk_op(ssl=ssl, i_code=i_dot, value=".not.") if (csw("e.", i_dot + 2)): tok = tk_op(ssl=ssl, i_code=i_dot, value=".ne.") if (i_dot == i_fld): O.i = i_dot + 4 return tok O.buffer.append((i_dot + 4, tok)) O.i = i_dot return tk_integer(ssl=ssl, i_code=i_fld, value=code[i_fld:i_dot]) if (csw("eqv.", i_dot + 2)): tok = tk_op(ssl=ssl, i_code=i_dot, value=".neqv.") if (i_dot == i_fld): O.i = i_dot + 6 return tok O.buffer.append((i_dot + 6, tok)) O.i = i_dot return tk_integer(ssl=ssl, i_code=i_fld, value=code[i_fld:i_dot]) ssl.raise_syntax_error(i=i_dot + 1) if (c == "g" or c == "l"): if (not csw("t.", i_dot + 2) and not csw("e.", i_dot + 2)): ssl.raise_syntax_error(i=i_dot + 1) tok = tk_op(ssl=ssl, i_code=i_dot, value=code[i_dot:i_dot + 4]) if (i_dot == i_fld): O.i = i_dot + 4 return tok O.buffer.append((i_dot + 4, tok)) O.i = i_dot return tk_integer(ssl=ssl, i_code=i_fld, value=code[i_fld:i_dot]) j = floating_point_scan_after_dot(code=code, start=i_dot + 1, stop=stop) if (j < 0): ssl.raise_syntax_error(i=i_dot + 1) O.i = j if (code.find("d", i_dot + 1, O.i) < 0): tk_type = tk_real else: tk_type = tk_double_precision return tk_type(ssl=ssl, i_code=i_fld, value=code[i_fld:j])
def get(O, optional=False): ssl = O.ssl code = ssl.code stop = O.stop def return_none(): if (not optional): if (stop == 0): ssl.raise_syntax_error() else: ssl.raise_syntax_error(i=stop-1) O.i = None return None if (len(O.buffer) != 0): O.i, result = O.buffer.pop(0) if (result is None): return_none() return result if (O.i is None): if (optional): return None ssl.raise_internal_error(i=stop-1) while (O.i < stop): i_code = O.i c = code[i_code] if ("=<>".find(c) >= 0): if (code.startswith("=", i_code+1)): O.i += 2 return tk_op(ssl=ssl, i_code=i_code, value=code[i_code:i_code+2]) O.i += 1 return tk_op(ssl=ssl, i_code=i_code, value=c) if ("(),:+-".find(c) >= 0): O.i += 1 return tk_op(ssl=ssl, i_code=i_code, value=c) if (c == "'"): O.i += 1 return tk_string( ssl=ssl, i_code=i_code, value=ssl.strings[ssl.string_indices.index(i_code)]) if (c == "x" and code.startswith("'", i_code+1)): O.i += 2 return tk_hexadecimal( ssl=ssl, i_code=i_code, value=ssl.strings[ssl.string_indices.index(i_code+1)]) j = identifier_scan(code=code, start=i_code) if (j > 0): O.i = j return tk_identifier(ssl=ssl, i_code=i_code, value=code[i_code:j]) if (c == "*"): if (code.startswith("*", i_code+1)): O.i += 2 return tk_op(ssl=ssl, i_code=i_code, value="**") O.i += 1 return tk_op(ssl=ssl, i_code=i_code, value="*") if (c == "/"): if (code.startswith("/", i_code+1)): O.i += 2 return tk_op(ssl=ssl, i_code=i_code, value="//") if (code.startswith("=", i_code+1)): O.i += 2 return tk_op(ssl=ssl, i_code=i_code, value="/=") O.i += 1 return tk_op(ssl=ssl, i_code=i_code, value="/") if (c == "."): return O.__after_dot(i_fld=i_code, i_dot=i_code) j = unsigned_integer_scan(code=code, start=i_code, stop=stop) if (j > 0): if (j == stop): O.i = j return tk_integer(ssl=ssl, i_code=i_code, value=code[i_code:j]) cj = code[j] if (cj == "."): if (j + 1 == stop): O.i = stop return tk_real(ssl=ssl, i_code=i_code, value=code[i_code:stop]) return O.__after_dot(i_fld=i_code, i_dot=j) if (cj == "e" or cj == "d"): k = floating_point_scan_after_exponent_char( code=code, start=j+1, stop=stop) if (k < 0): ssl.raise_error( msg="Invalid floating-point literal", i=j+1) O.i = k if (cj == "d"): return tk_double_precision( ssl=ssl, i_code=i_code, value=code[i_code:k]) return tk_real(ssl=ssl, i_code=i_code, value=code[i_code:k]) O.i = j return tk_integer(ssl=ssl, i_code=i_code, value=code[i_code:j]) ssl.raise_syntax_error(i=i_code) return_none()
def get(O, optional=False): ssl = O.ssl code = ssl.code stop = O.stop def return_none(): if (not optional): if (stop == 0): ssl.raise_syntax_error() else: ssl.raise_syntax_error(i=stop - 1) O.i = None return None if (len(O.buffer) != 0): O.i, result = O.buffer.pop(0) if (result is None): return_none() return result if (O.i is None): if (optional): return None ssl.raise_internal_error(i=stop - 1) while (O.i < stop): i_code = O.i c = code[i_code] if ("=<>".find(c) >= 0): if (code.startswith("=", i_code + 1)): O.i += 2 return tk_op(ssl=ssl, i_code=i_code, value=code[i_code:i_code + 2]) O.i += 1 return tk_op(ssl=ssl, i_code=i_code, value=c) if ("(),:+-".find(c) >= 0): O.i += 1 return tk_op(ssl=ssl, i_code=i_code, value=c) if (c == "'"): O.i += 1 return tk_string( ssl=ssl, i_code=i_code, value=ssl.strings[ssl.string_indices.index(i_code)]) if (c == "x" and code.startswith("'", i_code + 1)): O.i += 2 return tk_hexadecimal( ssl=ssl, i_code=i_code, value=ssl.strings[ssl.string_indices.index(i_code + 1)]) j = identifier_scan(code=code, start=i_code) if (j > 0): O.i = j return tk_identifier(ssl=ssl, i_code=i_code, value=code[i_code:j]) if (c == "*"): if (code.startswith("*", i_code + 1)): O.i += 2 return tk_op(ssl=ssl, i_code=i_code, value="**") O.i += 1 return tk_op(ssl=ssl, i_code=i_code, value="*") if (c == "/"): if (code.startswith("/", i_code + 1)): O.i += 2 return tk_op(ssl=ssl, i_code=i_code, value="//") if (code.startswith("=", i_code + 1)): O.i += 2 return tk_op(ssl=ssl, i_code=i_code, value="/=") O.i += 1 return tk_op(ssl=ssl, i_code=i_code, value="/") if (c == "."): return O.__after_dot(i_fld=i_code, i_dot=i_code) j = unsigned_integer_scan(code=code, start=i_code, stop=stop) if (j > 0): if (j == stop): O.i = j return tk_integer(ssl=ssl, i_code=i_code, value=code[i_code:j]) cj = code[j] if (cj == "."): if (j + 1 == stop): O.i = stop return tk_real(ssl=ssl, i_code=i_code, value=code[i_code:stop]) return O.__after_dot(i_fld=i_code, i_dot=j) if (cj == "e" or cj == "d"): k = floating_point_scan_after_exponent_char(code=code, start=j + 1, stop=stop) if (k < 0): ssl.raise_error(msg="Invalid floating-point literal", i=j + 1) O.i = k if (cj == "d"): return tk_double_precision(ssl=ssl, i_code=i_code, value=code[i_code:k]) return tk_real(ssl=ssl, i_code=i_code, value=code[i_code:k]) O.i = j return tk_integer(ssl=ssl, i_code=i_code, value=code[i_code:j]) ssl.raise_syntax_error(i=i_code) return_none()