~washort/parsley/new-codegen

« back to all changes in this revision

Viewing changes to ometa/test/test_pymeta.py

  • Committer: Allen Short
  • Date: 2012-11-15 21:24:32 UTC
  • Revision ID: washort@divmod.com-20121115212432-fw3h2cp0fst95rvs
Tree transformer grammars.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1274
1274
        "\nfoobar\n^\nParse error at line 2, column 0:"
1275
1275
        " expected the character 'a'. trail: []\n")
1276
1276
 
 
1277
 
 
1278
class TreeTransformerTestCase(unittest.TestCase):
 
1279
 
 
1280
    def compile(self, grammar):
 
1281
        """
 
1282
        Produce an object capable of parsing via this grammar.
 
1283
 
 
1284
        @param grammar: A string containing an OMeta grammar.
 
1285
        """
 
1286
        from ometa.grammar import TreeTransformerGrammar
 
1287
        from ometa.runtime import TreeTransformerBase
 
1288
        g = TreeTransformerGrammar.makeGrammar(dedent(grammar), globals(), 'TestGrammar', superclass=TreeTransformerBase)
 
1289
        return g
 
1290
 
 
1291
    def test_termForm(self):
 
1292
        from terml.parser import parseTerm as term
 
1293
        g = self.compile("Foo(:left :right) -> left.data + right.data")
 
1294
        self.assertEqual(g.transform(term("Foo(1, 2)"))[0], 3)
 
1295
 
 
1296
    def test_termFormNest(self):
 
1297
        from terml.parser import parseTerm as term
 
1298
        g = self.compile("Foo(:left Baz(:right)) -> left.data + right.data")
 
1299
        self.assertEqual(g.transform(term("Foo(1, Baz(2))"))[0], 3)
 
1300
 
 
1301
    def test_listForm(self):
 
1302
        from terml.parser import parseTerm as term
 
1303
        g = self.compile("Foo(:left [:first :second]) -> left.data + first.data + second.data")
 
1304
        self.assertEqual(g.transform(term("Foo(1, [2, 3])"))[0], 6)
 
1305
 
 
1306
    def test_subTransform(self):
 
1307
        from terml.parser import parseTerm as term
 
1308
        g = self.compile("""
 
1309
                         Foo(:left @right) -> left.data + right
 
1310
                         Baz(:front :back) -> front.data * back.data
 
1311
                         """)
 
1312
        self.assertEqual(g.transform(term("Foo(1, Baz(2, 3))"))[0], 7)
 
1313
 
 
1314
 
 
1315
    def test_defaultExpand(self):
 
1316
        from terml.parser import parseTerm as term
 
1317
        g = self.compile("""
 
1318
                         Foo(:left @right) -> left.data + right
 
1319
                         Baz(:front :back) -> front.data * back.data
 
1320
                         """)
 
1321
        self.assertEqual(g.transform(term("Blee(Foo(1, 2), Baz(2, 3))"))[0],
 
1322
                         term("Blee(3, 6)"))
 
1323
 
1277
1324
class ErrorReportingTests(unittest.TestCase):
1278
1325
 
1279
1326
 
1373
1420
                            ^
1374
1421
                         Parse error at line 1, column 3: expected a digit. trail: []
1375
1422
                         """))
1376