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))
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")
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))
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))
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
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")