(self)
| 481 | ) |
| 482 | |
| 483 | def test_python_expr(self) -> None: |
| 484 | grammar = """ |
| 485 | start: expr NEWLINE? $ { ast.Expression(expr) } |
| 486 | 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) } |
| 487 | | 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) } |
| 488 | | term { term } |
| 489 | ) |
| 490 | 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) } |
| 491 | | 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) } |
| 492 | | factor { factor } |
| 493 | ) |
| 494 | factor: ( '(' expr ')' { expr } |
| 495 | | atom { atom } |
| 496 | ) |
| 497 | 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]) } |
| 498 | | 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]) } |
| 499 | ) |
| 500 | """ |
| 501 | parser_class = make_parser(grammar) |
| 502 | node = parse_string("(1 + 2*3 + 5)/(6 - 2)\n", parser_class) |
| 503 | code = compile(node, "", "eval") |
| 504 | val = eval(code) |
| 505 | self.assertEqual(val, 3.0) |
| 506 | |
| 507 | def test_f_string_in_action(self) -> None: |
| 508 | grammar = """ |
nothing calls this directly
no test coverage detected