Beispiel #1
0
def test_empty_alternative():
    p = Parser("""
        E ::= "a"
            |
    """)
    p.parse()
    assert p.rules[Nonterminal("E")].alternatives == [[Terminal("a")], []]
Beispiel #2
0
def test_empty_alternative():
    p = Parser("""
        E ::= "a"
            |
    """)
    p.parse()
    assert p.rules[Nonterminal("E")].alternatives == [[Terminal("a")],[]]
Beispiel #3
0
def test_multiple_rules():
    p = Parser("""
        E ::= A
        A ::= \"a\"
    """)
    p.parse()
    assert p.rules[Nonterminal("E")].alternatives == [[Nonterminal("A")]]
    assert p.rules[Nonterminal("A")].alternatives == [[Terminal("a")]]
Beispiel #4
0
def test_multiple_rules():
    p = Parser("""
        E ::= A
        A ::= \"a\"
    """)
    p.parse()
    assert p.rules[Nonterminal("E")].alternatives == [[Nonterminal("A")]]
    assert p.rules[Nonterminal("A")].alternatives == [[Terminal("a")]]
Beispiel #5
0
    def __init__(self,
                 grammar=None,
                 lr_type=LR0,
                 whitespaces=False,
                 startsymbol=None):

        if grammar:
            logging.debug("Parsing Grammar")
            parser = Parser(grammar, whitespaces)
            parser.parse()

            filename = "".join([
                os.path.dirname(__file__), "/../pickle/",
                str(hash(grammar) ^ hash(whitespaces)), ".pcl"
            ])
            try:
                logging.debug("Try to unpickle former stategraph")
                f = open(filename, "r")
                start = time.time()
                self.graph = pickle.load(f)
                end = time.time()
                logging.debug("unpickling done in %s", end - start)
            except IOError:
                logging.debug("could not unpickle old graph")
                logging.debug("Creating Stategraph")
                self.graph = StateGraph(parser.start_symbol, parser.rules,
                                        lr_type)
                logging.debug("Building Stategraph")
                self.graph.build()
                logging.debug("Pickling")
                pickle.dump(self.graph, open(filename, "w"))

            if lr_type == LALR:
                self.graph.convert_lalr()

            logging.debug("Creating Syntaxtable")
            self.syntaxtable = SyntaxTable(lr_type)
            self.syntaxtable.build(self.graph)

        self.stack = []
        self.ast_stack = []
        self.all_changes = []
        self.undo = []
        self.last_shift_state = 0
        self.validating = False
        self.last_status = False
        self.error_node = None
        self.whitespaces = whitespaces
        self.status_by_version = {}
        self.errornode_by_version = {}
        self.indentation_based = False

        self.pm = PluginManager()
        self.pm.loadplugins(self)
        self.pm.do_incparse_init()

        self.previous_version = None
        logging.debug("Incremental parser done")
Beispiel #6
0
def test_option_rule():
    p = Parser("""
        A ::= "a" [ "b" ] "g"
    """)
    p.parse()
    print(p.rules)
    assert p.rules[Nonterminal("A")].alternatives == [[Terminal("a"), Nonterminal("A_option")]]
    assert p.rules[Nonterminal("A_option")].alternatives == [[Terminal("b"), Terminal("g")],
                                                            [Terminal("g")]]
Beispiel #7
0
def test_loop_rule():
    p = Parser("""
        A ::= "a" { "b" } "g"
    """)
    p.parse()
    print(p.rules)
    assert p.rules[Nonterminal("A")].alternatives == [[Terminal("a"), Nonterminal("A_loop")]]
    assert p.rules[Nonterminal("A_loop")].alternatives == [[Terminal("b"), Nonterminal("A_loop")],
                                                            [Terminal("g")]]
Beispiel #8
0
def test_group_rule():
    p = Parser("""
        A ::= "a" ( "b" | "c" ) "g"
    """)
    p.parse()
    print(p.rules)
    assert p.rules[Nonterminal("A")].alternatives == [[Terminal("a"), Nonterminal("A_group1")]]
    assert p.rules[Nonterminal("A_group1")].alternatives == [[Terminal("b"), Nonterminal("A_group2")],
                                                             [Terminal("c"), Nonterminal("A_group2")]]
    assert p.rules[Nonterminal("A_group2")].alternatives == [[Terminal("g")]]
Beispiel #9
0
def test_option_rule():
    p = Parser("""
        A ::= "a" [ "b" ] "g"
    """)
    p.parse()
    print(p.rules)
    assert p.rules[Nonterminal("A")].alternatives == [[
        Terminal("a"), Nonterminal("A_option")
    ]]
    assert p.rules[Nonterminal("A_option")].alternatives == [[
        Terminal("b"), Terminal("g")
    ], [Terminal("g")]]
Beispiel #10
0
def test_more_complex_grammar():
    p = Parser("""
    name ::= "ID"
           | "&" "ID"
           | splice
           | insert
    """)
    p.parse()
    assert p.rules[Nonterminal("name")].alternatives == [
        [Terminal("ID")], [Terminal("&"), Terminal("ID")],
        [Nonterminal("splice")], [Nonterminal("insert")]
    ]
Beispiel #11
0
def test_loop_rule():
    p = Parser("""
        A ::= "a" { "b" } "g"
    """)
    p.parse()
    print(p.rules)
    assert p.rules[Nonterminal("A")].alternatives == [[
        Terminal("a"), Nonterminal("A_loop")
    ]]
    assert p.rules[Nonterminal("A_loop")].alternatives == [[
        Terminal("b"), Nonterminal("A_loop")
    ], [Terminal("g")]]
Beispiel #12
0
def test_group_rule():
    p = Parser("""
        A ::= "a" ( "b" | "c" ) "g"
    """)
    p.parse()
    print(p.rules)
    assert p.rules[Nonterminal("A")].alternatives == [[
        Terminal("a"), Nonterminal("A_group1")
    ]]
    assert p.rules[Nonterminal("A_group1")].alternatives == [[
        Terminal("b"), Nonterminal("A_group2")
    ], [Terminal("c"), Nonterminal("A_group2")]]
    assert p.rules[Nonterminal("A_group2")].alternatives == [[Terminal("g")]]
Beispiel #13
0
    def __init__(self, grammar=None, lr_type=LR0, whitespaces=False, startsymbol=None):

        if grammar:
            logging.debug("Parsing Grammar")
            parser = Parser(grammar, whitespaces)
            parser.parse()

            filename = "".join([os.path.dirname(__file__), "/../pickle/", str(hash(grammar) ^ hash(whitespaces)), ".pcl"])
            try:
                logging.debug("Try to unpickle former stategraph")
                f = open(filename, "r")
                start = time.time()
                self.graph = pickle.load(f)
                end = time.time()
                logging.debug("unpickling done in %s", end-start)
            except IOError:
                logging.debug("could not unpickle old graph")
                logging.debug("Creating Stategraph")
                self.graph = StateGraph(parser.start_symbol, parser.rules, lr_type)
                logging.debug("Building Stategraph")
                self.graph.build()
                logging.debug("Pickling")
                pickle.dump(self.graph, open(filename, "w"))

            if lr_type == LALR:
                self.graph.convert_lalr()

            logging.debug("Creating Syntaxtable")
            self.syntaxtable = SyntaxTable(lr_type)
            self.syntaxtable.build(self.graph)

        self.stack = []
        self.ast_stack = []
        self.all_changes = []
        self.undo = []
        self.last_shift_state = 0
        self.validating = False
        self.last_status = False
        self.error_node = None
        self.whitespaces = whitespaces
        self.anycount = set()
        self.status_by_version = {}
        self.errornode_by_version = {}

        self.comment_tokens = []

        self.indent_stack = None
        self.indentation_based = False

        self.previous_version = None
        logging.debug("Incemental parser done")
Beispiel #14
0
def test_more_complex_grammar():
    p = Parser("""
    name ::= "ID"
           | "&" "ID"
           | splice
           | insert
    """)
    p.parse()
    assert p.rules[Nonterminal("name")].alternatives == [
        [Terminal("ID")],
        [Terminal("&"), Terminal("ID")],
        [Nonterminal("splice")],
        [Nonterminal("insert")]
    ]
Beispiel #15
0
    def __init__(self, grammar, lr_type=LR0):
        parser = Parser(grammar)
        parser.parse()

        self.graph = StateGraph(parser.start_symbol, parser.rules, lr_type)
        self.graph.build()

        if lr_type == LALR:
            self.graph.convert_lalr()

        self.syntaxtable = SyntaxTable(lr_type)
        self.syntaxtable.build(self.graph)

        self.stack = []
        self.ast_stack = []
Beispiel #16
0
    def __init__(self, grammar, lr_type=LR0):
        parser = Parser(grammar)
        parser.parse()

        self.graph = StateGraph(parser.start_symbol, parser.rules, lr_type)
        self.graph.build()

        if lr_type == LALR:
            self.graph.convert_lalr()

        self.syntaxtable = SyntaxTable(lr_type)
        self.syntaxtable.build(self.graph)

        self.stack = []
        self.ast_stack = []
Beispiel #17
0
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
# IN THE SOFTWARE.

from incparser.syntaxtable import SyntaxTable, Goto, Shift, Reduce, Accept, FinishSymbol
from incparser.stategraph import StateGraph
from grammar_parser.gparser import Parser, Terminal, Nonterminal, Epsilon
from incparser.production import Production

grammar = """
    S ::= "b" A "d"
    A ::= "c"
        |
"""

p = Parser(grammar)
p.parse()
r = p.rules

b = Terminal("b")
c = Terminal("c")
d = Terminal("d")
S = Nonterminal("S")
A = Nonterminal("A")

S_bAd = Production(S, [b, A, d])
A_c = Production(A, [c])
A_None = Production(A, [Epsilon()])

syntaxtable = {
    (0, b): Shift(2),
Beispiel #18
0
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
# IN THE SOFTWARE.

from incparser.syntaxtable import SyntaxTable, Goto, Shift, Reduce, Accept, FinishSymbol
from incparser.stategraph import StateGraph
from grammar_parser.gparser import Parser, Terminal, Nonterminal, Epsilon
from incparser.production import Production

grammar = """
    S ::= "b" A "d"
    A ::= "c"
        |
"""

p = Parser(grammar)
p.parse()
r = p.rules

b = Terminal("b")
c = Terminal("c")
d = Terminal("d")
S = Nonterminal("S")
A = Nonterminal("A")

S_bAd = Production(S, [b, A, d])
A_c = Production(A, [c])
A_None = Production(A, [Epsilon()])

syntaxtable = {
    (0, b): Shift(2),
Beispiel #19
0
    | "a"
A ::= "a" S "c"
    | "a"
    | "a" S "b"

B ::= A S

C ::= D A

D ::= "d"
    |

F ::= C D "f"
"""

p = Parser(grammar)
p.parse()
r = p.rules

grammar2 = """
    E ::= P
        | E "+" P
    P ::= "a"
"""

p = Parser(grammar2)
p.parse()
r2 = p.rules


a = Terminal("a")
Beispiel #20
0
def test_simple():
    p = Parser("E ::= \"a\"")
    p.parse()
    assert p.rules[Nonterminal("E")].symbol == Nonterminal("E")
    assert p.rules[Nonterminal("E")].alternatives == [[Terminal("a")]]
Beispiel #21
0
def test_multiple_symbols():
    p = Parser("E ::= A \"a\"")
    p.parse()
    assert p.rules[Nonterminal("E")].alternatives == [[Nonterminal("A"), Terminal("a")]]
Beispiel #22
0
def test_alternatives():
    p = Parser("E ::= A | \"a\"")
    p.parse()
    assert p.rules[Nonterminal("E")].alternatives == [[Nonterminal("A")],
                                                      [Terminal("a")]]
Beispiel #23
0
def test_multiple_symbols():
    p = Parser("E ::= A \"a\"")
    p.parse()
    assert p.rules[Nonterminal("E")].alternatives == [[
        Nonterminal("A"), Terminal("a")
    ]]
Beispiel #24
0
def test_simple():
    p = Parser("E ::= \"a\"")
    p.parse()
    assert p.rules[Nonterminal("E")].symbol == Nonterminal("E")
    assert p.rules[Nonterminal("E")].alternatives == [[Terminal("a")]]
Beispiel #25
0
def test_alternatives():
    p = Parser("E ::= A | \"a\"")
    p.parse()
    assert p.rules[Nonterminal("E")].alternatives == [[Nonterminal("A")], [Terminal("a")]]