def print_error(err, scanner, max_ctx=None):
    """Print error messages, the parser stack, and the input text -- for human-readable error messages."""
    # NOTE: this function assumes 80 columns :-(
    # Figure out the line number
    pos = err.pos
    if not pos:
        pos = scanner.get_pos()

    file_name, line_number, column_number = pos
    print('%s:%d:%d: %s' % (file_name, line_number, column_number, err.msg), file=sys.stderr)

    scanner.print_line_with_pointer(pos)

    context = err.context
    token = None
    while context:
        print('while parsing %s%s:' % (context.rule, tuple(context.args)), file=sys.stderr)
        if context.token:
            token = context.token
        if token:
            scanner.print_line_with_pointer(token.pos, length=len(token.value))
        context = context.parent
        if max_ctx:
            max_ctx = max_ctx-1
            if not max_ctx:
                break
dataset/ETHPy150Open smurfix/yapps/yapps/runtime.py/print_error/original