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
# -*- coding: utf-8 -*-
#######################################################################
# Name: test_python_parser
# Purpose: Test for parser constructed using Python-based grammars.
# Author: Igor R. Dejanović <igor DOT dejanovic AT gmail DOT com>
# Copyright: (c) 2014 Igor R. Dejanović <igor DOT dejanovic AT gmail DOT com>
# License: MIT License
#######################################################################
from __future__ import unicode_literals
import pytest
import os
from arpeggio.export import PMDOTExporter, PTDOTExporter
# Grammar
from arpeggio import Optional, ZeroOrMore, OneOrMore, EOF, ParserPython
from arpeggio import RegExMatch as _
def number(): return _(r'\d*\.\d*|\d+')
def factor(): return Optional(["+","-"]), [number,
("(", expression, ")")]
def term(): return factor, ZeroOrMore(["*","/"], factor)
def expression(): return term, ZeroOrMore(["+", "-"], term)
def calc(): return OneOrMore(expression), EOF
@pytest.fixture
def parser():
return ParserPython(calc)
def test_export_parser_model(parser):
"""
Testing parser model export
"""
PMDOTExporter().exportFile(parser.parser_model,
"test_exporter_parser_model.dot")
assert os.path.exists("test_exporter_parser_model.dot")
def test_export_parse_tree(parser):
"""
Testing parse tree export.
"""
parse_tree = parser.parse("-(4-1)*5+(2+4.67)+5.89/(.2+7)")
PTDOTExporter().exportFile(parse_tree,
"test_exporter_parse_tree.dot")
assert os.path.exists("test_exporter_parse_tree.dot")