1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
|
import json # noqa: F401
import tatsu
from tatsu.objectmodel import Node
def test_node_kwargs():
class Atom(Node):
def __init__(self, arguments=None, symbol=None, **_kwargs_):
self.symbol = None
super().__init__(arguments=arguments, symbol=symbol, **_kwargs_)
atom = Atom(symbol='foo')
assert atom.ast is None
assert atom.symbol == 'foo'
atom = Atom(symbol='foo', ast={})
assert atom.ast == {}
assert atom.symbol is not None
assert atom.symbol == 'foo'
atom = Atom(ast=42, symbol='foo')
assert atom.ast == 42
assert atom.symbol is not None
assert atom.symbol == 'foo'
atom = Atom(ast={'bar': 1}, symbol='foo')
assert atom.ast == {'bar': 1}
def test_children():
grammar = r"""
@@grammar::Calc
start
=
expression $
;
expression
=
| add:addition
| sub:subtraction
| term:term
;
addition::Add
=
left:term op:'+' ~ right:expression
;
subtraction::Subtract
=
left:term op:'-' ~ right:expression
;
term
=
| mul:multiplication
| div:division
| factor:factor
;
multiplication::Multiply
=
left:factor op:'*' ~ right:term
;
division::Divide
=
left:factor '/' ~ right:term
;
factor
=
| subexpression
| number
;
subexpression
=
'(' ~ @:expression ')'
;
number::int
=
/\d+/
;
"""
parser = tatsu.compile(grammar, asmodel=True)
assert parser
model = parser.parse('3 + 5 * ( 10 - 20 )', asmodel=True)
assert model
assert model['add']
assert model['add'].children()
assert type(model['add'].children()[0]).__name__ == 'Multiply'
|