# Path: ayrton/parser/astcompiler/consts.py
# CO_OPTIMIZED = 0x0001
# CO_NEWLOCALS = 0x0002
# CO_VARARGS = 0x0004
# CO_VARKEYWORDS = 0x0008
# CO_NESTED = 0x0010
# CO_GENERATOR = 0x0020
# CO_NOFREE = 0x0040
# CO_COROUTINE = 0x0080
# CO_ITERABLE_COROUTINE = 0x0100    # set by @types.coroutine
# CO_GENERATOR_ALLOWED = 0x1000
# CO_FUTURE_DIVISION = 0x2000
# CO_FUTURE_ABSOLUTE_IMPORT = 0x4000
# CO_FUTURE_WITH_STATEMENT = 0x8000
# CO_FUTURE_PRINT_FUNCTION = 0x10000
# CO_FUTURE_UNICODE_LITERALS = 0x20000
# CO_FUTURE_BARRY_AS_BDFL = 0x40000
# CO_FUTURE_GENERATOR_STOP = 0x80000
# CO_KILL_DOCSTRING = 0x100000
# CO_YIELD_INSIDE_TRY = 0x200000
# FVC_MASK      = 0x3
# FVC_NONE      = 0x0
# FVC_STR       = 0x1
# FVC_REPR      = 0x2
# FVC_ASCII     = 0x3
# FVS_MASK      = 0x4
# FVS_HAVE_SPEC = 0x4


from ayrton.parser.astcompiler import consts
from ayrton.parser.pyparser import parsestring
from ayrton.parser import error
    from ayrton.parser.pyparser import pyparse
    from ayrton.parser.astcompiler.astbuilder import ast_from_node
import ast
    # Keep track of nesting level for braces/parens/brackets in
    # expressions.
    nested_depth = 0

    # Can only nest one level deep.
    if rec >= 2:
        astbuilder.error("f-string: expressions nested too deeply", atom_node)

    # The first char must be a left brace, or we wouldn't have gotten
    # here. Skip over it.
    s = fstr.unparsed
    i = fstr.current_index
    assert s[i] == '{'
    i += 1

    expr_start = i
    while i < len(s):

        # Loop invariants.
        assert nested_depth >= 0
        if quote_char:
            assert string_type == 1 or string_type == 3
        else:
            assert string_type == 0

        ch = s[i]
        # Nowhere inside an expression is a backslash allowed.
        if ch == '\\':
            # Error: can't include a backslash character, inside
            # parens or strings or not.

# Path: ayrton/parser/astcompiler/consts.py
# CO_OPTIMIZED = 0x0001
# CO_NEWLOCALS = 0x0002
# CO_VARARGS = 0x0004
# CO_VARKEYWORDS = 0x0008
# CO_NESTED = 0x0010
# CO_GENERATOR = 0x0020
# CO_NOFREE = 0x0040
# CO_COROUTINE = 0x0080
# CO_ITERABLE_COROUTINE = 0x0100    # set by @types.coroutine
# CO_GENERATOR_ALLOWED = 0x1000
# CO_FUTURE_DIVISION = 0x2000
# CO_FUTURE_ABSOLUTE_IMPORT = 0x4000
# CO_FUTURE_WITH_STATEMENT = 0x8000
# CO_FUTURE_PRINT_FUNCTION = 0x10000
# CO_FUTURE_UNICODE_LITERALS = 0x20000
# CO_FUTURE_BARRY_AS_BDFL = 0x40000
# CO_FUTURE_GENERATOR_STOP = 0x80000
# CO_KILL_DOCSTRING = 0x100000
# CO_YIELD_INSIDE_TRY = 0x200000
# FVC_MASK      = 0x3
# FVC_NONE      = 0x0
# FVC_STR       = 0x1
# FVC_REPR      = 0x2
# FVC_ASCII     = 0x3
# FVS_MASK      = 0x4
# FVS_HAVE_SPEC = 0x4


# Path: ayrton/parser/astcompiler/fstring.py
from ayrton.parser.astcompiler import consts
from ayrton.parser.pyparser import parsestring
from ayrton.parser import error
    from ayrton.parser.pyparser import pyparse
    from ayrton.parser.astcompiler.astbuilder import ast_from_node
import ast

    # Keep track of nesting level for braces/parens/brackets in
    # expressions.
    nested_depth = 0

    # Can only nest one level deep.
    if rec >= 2:
        astbuilder.error("f-string: expressions nested too deeply", atom_node)

    # The first char must be a left brace, or we wouldn't have gotten
    # here. Skip over it.
    s = fstr.unparsed
    i = fstr.current_index
    assert s[i] == '{'
    i += 1

    expr_start = i
    while i < len(s):

        # Loop invariants.
        assert nested_depth >= 0
        if quote_char:
            assert string_type == 1 or string_type == 3
        else:
            assert string_type == 0

        ch = s[i]
        # Nowhere inside an expression is a backslash allowed.
        if ch == '\\':
            # Error: can't include a backslash character, inside
            # parens or strings or not.

            astbuilder.error("f-string expression part "