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
|
import unittest
from tatsu.tool import compile
from tatsu.util import trim
class PrettyTests(unittest.TestCase):
def test_pretty(self):
grammar = r"""
start = lisp ;
lisp = sexp | list | symbol;
sexp::SExp = '(' cons:lisp '.' ~ cdr:lisp ')' ;
list::List = '(' elements:{sexp}* ')' ;
symbol::Symbol = value:/[^\s().]+/ ;
"""
pretty = trim(
r"""
start
=
lisp
;
lisp
=
sexp | list | symbol
;
sexp::SExp
=
'(' cons:lisp '.' ~ cdr:lisp ')'
;
list::List
=
'(' elements:{sexp} ')'
;
symbol::Symbol
=
value:/[^\s().]+/
;
""",
)
pretty_lean = trim(
r"""
start
=
lisp
;
lisp
=
sexp | list | symbol
;
sexp
=
'(' lisp '.' ~ lisp ')'
;
list
=
'(' {sexp} ')'
;
symbol
=
/[^\s().]+/
;
""",
)
model = compile(grammar=grammar)
self.assertEqual(pretty, model.pretty())
self.assertEqual(str(model), model.pretty())
self.assertEqual(pretty_lean, model.pretty_lean())
def test_slashed_pattern(self):
grammar = """
start
=
?"[a-z]+/[0-9]+" $
;
"""
model = compile(grammar=grammar)
ast = model.parse('abc/123')
self.assertEqual('abc/123', ast)
print(model.pretty())
self.assertEqual(trim(grammar), model.pretty())
|