Пример #1
0
from algos import create_dfa, globals_holder
from atn_creation import rule
from datastructure import atn

# rule A's two alts both prefixed with recursive rule E, this should fail
# S ::= A eof
# A ::= E a
#     | E b
# E ::= c E d
#     | e

ra = rule("A")
rs = rule("S").ele("A").ele("eof")
print rs

re = rule("E")
ra.ele("E").ele("a")
ra.alt().ele("E").ele("b")
print ra

re.ele("c").ele("E").ele("d")
re.alt().ele("e")
print re

globals_holder.a_net = atn()

rs.merge_to_atn(globals_holder.a_net)
ra.merge_to_atn(globals_holder.a_net)
re.merge_to_atn(globals_holder.a_net)

d_a = create_dfa(ra.get_start_state(globals_holder.a_net))
Пример #2
0
from algos import create_dfa, globals_holder
from atn_creation import rule
from datastructure import atn

# multi-rule LL(1)
# S ::= A $
# A ::= a c+
#     | B
# B ::= b c+
#     | d c*
ra = rule('A')
rs = rule('S').ele('A').ele('eof')
rb = rule('B')

ra.ele('a').kc('c')
ra.alt().ele('B')

rb.ele('b').kc('c')
rb.alt().ele('d').ks('c')

globals_holder.a_net = atn()
ra.merge_to_atn(globals_holder.a_net)
globals_holder.a_net = rb.merge_to_atn(globals_holder.a_net)
rs.merge_to_atn(globals_holder.a_net)

s_dnet = create_dfa(rs.get_start_state(globals_holder.a_net))
a_dnet = create_dfa(ra.get_start_state(globals_holder.a_net))
b_dnet = create_dfa(rb.get_start_state(globals_holder.a_net))

globals_holder.a_net.to_png("A")
s_dnet.to_png("S_dfa")
Пример #3
0
from algos import create_dfa, globals_holder
from atn_creation import rule
from datastructure import atn

# LL(3) grammar
# S ::= A $
# A ::= a b c d?
#     | a b e d+
r = rule('A')
rs = rule('S').ele('A').ele('eof')
print rs
r.ele('a').ele('b').ele('c').opt('d')
r.alt().ele('a').ele('b').ele('e').kc('d')
print r
globals_holder.a_net = atn()
r.merge_to_atn(globals_holder.a_net)
rs.merge_to_atn(globals_holder.a_net)

d_s = create_dfa(rs.get_start_state(globals_holder.a_net))
d_net = create_dfa(r.get_start_state(globals_holder.a_net))

globals_holder.a_net.to_png('A')
d_s.to_png("S_dfa")
d_net.to_png('A_dfa')
from algos import create_dfa, globals_holder
from atn_creation import rule
from datastructure import atn

# rule A's two alts both prefixed with recursive rule E, this should fail
# S ::= A eof
# A ::= E a
#     | E b
# E ::= c E d
#     | e

ra = rule('A')
rs = rule('S').ele('A').ele('eof')
print rs

re = rule('E')
ra.ele('E').ele('a')
ra.alt().ele('E').ele('b')
print ra

re.ele('c').ele('E').ele('d')
re.alt().ele('e')
print re

globals_holder.a_net = atn()

rs.merge_to_atn(globals_holder.a_net)
ra.merge_to_atn(globals_holder.a_net)
re.merge_to_atn(globals_holder.a_net)

d_a = create_dfa(ra.get_start_state(globals_holder.a_net))
Пример #5
0
from algos import create_dfa, globals_holder
from atn_creation import rule
from datastructure import atn

# lookahead go over a recursive rule(overflowed, resolved by predicates)
# S ::= A $
# A ::= {pred1}? B a
#     | {pred2}? b* c
# B ::= b+ B

ra = rule("A")
rs = rule("S").ele("A").ele("eof")
print rs

rb = rule("B")
ra.ele("B").ele("a").pred("pred1")
ra.alt().ks("b").ele("c").pred("pred2")
print ra

rb.kc("b").ele("B")
print rb

globals_holder.a_net = atn()
rs.merge_to_atn(globals_holder.a_net)
ra.merge_to_atn(globals_holder.a_net)
rb.merge_to_atn(globals_holder.a_net)

d_a = create_dfa(ra.get_start_state(globals_holder.a_net))

globals_holder.a_net.to_png("A")
from algos import create_dfa, globals_holder
from atn_creation import rule
from datastructure import atn

# conflicts mixed with overflow, resolved by predicates
# S ::= A $
# A ::= B a
#     | b* c
#     | b* c
# B ::= b+ B

ra = rule('A')
rs = rule('S').ele('A').ele('eof')
print rs

rb = rule('B')
ra.ele('B').ele('a').pred('pred1')
ra.alt().ks('b').ele('c').pred('pred2')
ra.alt().ks('b').ele('c').pred('pred3')
print ra

rb.kc('b').ele('B')
print rb

globals_holder.a_net = atn()
rs.merge_to_atn(globals_holder.a_net)
ra.merge_to_atn(globals_holder.a_net)
rb.merge_to_atn(globals_holder.a_net)

d_a = create_dfa(ra.get_start_state(globals_holder.a_net))
Пример #7
0
from atn_creation import rule
from datastructure import atn

# LL(3) grammar with many alternatives
# S ::= A $
# A ::= B a*
#     | C a+
#     | D a?
# B ::= a b c C
#     | a b c D
#     | d
# C ::= e f g D
#     | e f g h
# D ::= i j k l
#     | i j k m
rb = rule('B')
rc = rule('C')
rd = rule('D')
ra = rule('A')
rs = rule('S').ele('A').ele('eof')
print rs

ra.ele('B').ks('a')
ra.alt().ele('C').kc('a')
ra.alt().ele('D').opt('a')
print ra

rb.ele('a').ele('b').ele('c').ele('C')
rb.alt().ele('a').ele('b').ele('c').ele('D')
rb.alt().ele('d')
print rb
Пример #8
0
from atn_creation import rule
from algos import create_dfa, globals_holder
from datastructure import atn

# test for empty alternative production in grammar rule
# S ::= A $
# A ::= a
#     |
r = rule('A')
rs = rule('S').ele('A').ele("eof")
print rs
r.ele('a')
r.alt()
print r

globals_holder.a_net = atn()
rs.merge_to_atn(globals_holder.a_net)
r.merge_to_atn(globals_holder.a_net)

d_s = create_dfa(rs.get_start_state(globals_holder.a_net))
d_a = create_dfa(r.get_start_state(globals_holder.a_net))

globals_holder.a_net.to_png("A")

d_s.to_png("S_dfa")
d_a.to_png("A_dfa")