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])
Example #2
0
 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()
Example #4
0
    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()