code: def test_python_expr(self) -> None:
      grammar = """
          start: expr NEWLINE? $ { ast.Expression(expr, lineno=1, col_offset=0) }
          expr: ( expr '+' term { ast.BinOp(expr, ast.Add(), term, lineno=expr.lineno, col_offset=expr.col_offset, end_lineno=term.end_lineno, end_col_offset=term.end_col_offset) }
              | expr '-' term { ast.BinOp(expr, ast.Sub(), term, lineno=expr.lineno, col_offset=expr.col_offset, end_lineno=term.end_lineno, end_col_offset=term.end_col_offset) }
              | term { term }
              )
          term: ( l=term '*' r=factor { ast.BinOp(l, ast.Mult(), r, lineno=l.lineno, col_offset=l.col_offset, end_lineno=r.end_lineno, end_col_offset=r.end_col_offset) }
              | l=term '/' r=factor { ast.BinOp(l, ast.Div(), r, lineno=l.lineno, col_offset=l.col_offset, end_lineno=r.end_lineno, end_col_offset=r.end_col_offset) }
              | factor { factor }
              )
          factor: ( '(' expr ')' { expr }
                  | atom { atom }
                  )
          atom: ( n=NAME { ast.Name(id=n.string, ctx=ast.Load(), lineno=n.start[0], col_offset=n.start[1], end_lineno=n.end[0], end_col_offset=n.end[1]) }
              | n=NUMBER { ast.Constant(value=ast.literal_eval(n.string), lineno=n.start[0], col_offset=n.start[1], end_lineno=n.end[0], end_col_offset=n.end[1]) }
              )
          """
      parser_class = make_parser(grammar)
      node = parse_string("(1 + 2*3 + 5)/(6 - 2)\n", parser_class)
      code = compile(node, "", "eval")
      val = eval(code)
      self.assertEqual(val, 3.0)
  
imports: import ast
  import difflib
  import io
  import textwrap
  import unittest
  from test import test_tools
  from typing import Dict, Any
  from tokenize import TokenInfo, NAME, NEWLINE, NUMBER, OP
label_desc: Use image node_id 16 for calling the TestPegen obj's underlying member method code with example usage: obj.test_python_expr() without return types