diff --git a/fungll.krak b/fungll.krak index d59953b..a42c264 100644 --- a/fungll.krak +++ b/fungll.krak @@ -8,26 +8,34 @@ import str:* // nonterminals are negative, terminals are positive obj Grammer (Object) { var nonterminals: vec>> + var nonterminal_names: vec var terminals: vec fun construct(): *Grammer { nonterminals.construct() + nonterminal_names.construct() terminals.construct() return this } fun copy_construct(old: *Grammer): void { nonterminals.copy_construct(&old->nonterminals) + nonterminal_names.copy_construct(&old->nonterminal_names) terminals.copy_construct(&old->terminals) } fun destruct(): void { nonterminals.destruct() + nonterminal_names.destruct() terminals.destruct() } fun operator=(other:ref Grammer):void { destruct() copy_construct(&other) } - fun add_new_nonterminal(rule: ref vec): int { + fun add_new_nonterminal(name: *char, rule: ref vec): int { + return add_new_nonterminal(str(name), rule) + } + fun add_new_nonterminal(name: ref str, rule: ref vec): int { nonterminals.add(vec(rule)) + nonterminal_names.add(name) return -1*nonterminals.size } fun add_to_nonterminal(nonterminal: int, rule: ref vec) { @@ -46,6 +54,24 @@ obj Grammer (Object) { fun is_terminal(x: int): bool { return x > 0 } + fun to_string(it: BS): str { + var rule_str = str() + for (var i = 0; i < nonterminals[(-1*it.nonterminal)-1][it.rule_idx].size; i++;) { + if i == it.idx_into_rule { + rule_str += "*" + } + var erminal = nonterminals[(-1*it.nonterminal)-1][it.rule_idx][i] + if erminal < 0 { + rule_str += nonterminal_names[(-1*erminal)-1] + } else { + rule_str += terminals[erminal-1] + } + } + if it.idx_into_rule == nonterminals[(-1*it.nonterminal)-1][it.rule_idx].size { + rule_str += "*" + } + return str("<") + nonterminal_names[(-1*it.nonterminal)-1] + " ::= " + rule_str + ", " + it.left + ", " + it.pivot + ", " + it.right + ">" + } } obj Pending (Object) { var nonterminal: int @@ -161,36 +187,18 @@ fun bs(nonterminal: int, rule_idx: int, idx_into_rule: int, left: int, pivot: in var to_ret.construct(nonterminal, rule_idx, idx_into_rule, left, pivot, right): BS return to_ret } -/*fun complete_parser_for(grammer: ref Grammer, start_symbol, input: ref str): set {*/ - /*return fungll(grammer, input, start_symbol).second*/ -/*}*/ -/*fun fungll(grammer: ref Grammer, input: ref str, start_symbol: int): set {*/ -/*fun fungll(grammer: ref Grammer, input: ref str): <, set> {*/ fun fungll(grammer: ref Grammer, input: ref str): set { - /*loop(grammer, input, descend(grammer, 0 [>start_symbol<], 0), set(), set(), set(), set())*/ return loop(grammer, input, descend(grammer, -1 /*start_symbol*/, 0), set(), map, set>(), map, set>(), set()) } fun descend(grammer: ref Grammer, symbol: int, l: int): set { - /*grammer.get_nonterminal_rules(symbol).map(fun(rhs): descriptor { })*/ - /*return grammer.get_nonterminal_rules(symbol).map(fun(rhs: int): Descriptor { return descriptor(symbol, rhs, 0, l, l); })*/ var to_ret = set() for (var rhs = 0; rhs < grammer.get_nonterminal_rules(symbol).size; rhs++;) to_ret.add(descriptor(symbol, rhs, 0, l, l)) return to_ret } fun loop(grammer: ref Grammer, input: ref str, R: set, U: set, G: map, set>, P: map, set>, Y: set): set { - /*if R.size() == 0 {*/ - /*return */ - /*} else {*/ - /*var d = R.pop()*/ - /*var <,G',P'> = process(grammer, input, d, G, P)*/ - /*var U_with_d = U.union(set(d));*/ - /*var R'' = (R.union(R') - U_with_d*/ - /*return loop(grammer, input, R'', U_with_d, G.union(G'), P.union(P'), Y.union(Y'))*/ - /*}*/ while R.size() != 0 { var d = R.pop() - /*var <,Gp,Pp> = process(grammer, input, d, G, P)*/ var it = process(grammer, input, d, G, P) var Rp = it.first.first var Yp = it.first.second @@ -201,7 +209,6 @@ fun loop(grammer: ref Grammer, input: ref str, R: set, U: set, U: set, U: set, G, P): {*/ fun process(grammer: ref Grammer, input: ref str, descript: Descriptor, G: map, set>, P: map, set>): triple, set>, map, set>, map, set>> { - /*if is_e(b) {*/ + // if at end / end is emptystr if descript.idx_into_rule == grammer.get_nonterminal_rules(descript.nonterminal)[descript.rule_idx].size { - /*return process_e(, G, P)*/ return process_e(grammer, descript, G, P) } else { - /*return process_symbol(grammer, input, , G, P) // b=sb'*/ return process_symbol(grammer, input, descript, G, P) } } -/*fun process_e(, G, P) {*/ fun process_e(grammer: ref Grammer, descript: Descriptor, G: ref map, set>, P: ref map, set>): triple, set>, map, set>, map, set>> { var nonterminal: int var rule_idx: int @@ -241,44 +243,30 @@ fun process_e(grammer: ref Grammer, descript: Descriptor, G: ref map | <,> in G }*/ var K = G.get(make_pair(X,l)) - /*var = ascend(l,K,k)*/ var it = ascend(l,K,k) var R = it.first var Y = it.second - /*var Y' = { | is_e(a) }*/ if grammer.get_nonterminal_rules(X)[descript.rule_idx].size == 0 { Y.add(bs(X,descript.rule_idx, 0, l, l, l)) } - /*return <,set(),set(<,k>)>*/ return make_triple(make_pair(R,Y), map, set>(), map(make_pair(X,l), set(k))) } -/*fun process_symbol(grammer: ref Grammer, input: ref str, , G, P) {*/ fun process_symbol(grammer: ref Grammer, input: ref str, descript: Descriptor, G: ref map, set>, P: ref map, set>): triple, set>, map, set>, map, set>> { var s = grammer.get_nonterminal_rules(descript.nonterminal)[descript.rule_idx][descript.idx_into_rule] var k = descript.pivot - /*R = { r | <,r> in P }*/ var R = P.get_with_default(make_pair(s,k), set()) - /*G' = {<, >}*/ var Gp = map(make_pair(s,k), set(pending(descript.nonterminal, descript.rule_idx, descript.idx_into_rule+1, descript.left))) if grammer.is_terminal(s) { - /*return ),set(),set()>*/ - /*return make_triple(match(input,descript), map, vec>(), map, set>())*/ return make_triple(matc(grammer,input,descript), map, set>(), map, set>()) } else if R.size() == 0 { // s in N - /*return <, G', set()>*/ return make_triple(make_pair(descend(grammer,s,k), set()), Gp, map, set>()) } else { // s in N and R != set() - /*return R), G', set()>*/ return make_triple(skip(k,pending(descript.nonterminal, descript.rule_idx, descript.idx_into_rule+1, descript.left), R), Gp, map, set>()) } } -/*fun match(input: ref str, ): > {*/ fun matc(grammer: ref Grammer, input: ref str, descript: Descriptor): pair, set> { - /*if input[k] == grammer.get_terminal(s) {*/ if descript.pivot < input.length() && input[descript.pivot] == grammer.get_terminal(grammer.get_nonterminal_rules(descript.nonterminal)[descript.rule_idx][descript.idx_into_rule]) { - /*return ), set(*/ return make_pair(set(descriptor(descript.nonterminal, descript.rule_idx, descript.idx_into_rule+1, descript.left, descript.pivot+1)), set(bs(descript.nonterminal, descript.rule_idx, descript.idx_into_rule+1, descript.left, descript.pivot, descript.pivot+1))) } else { return make_pair(set(), set()) @@ -287,14 +275,10 @@ fun matc(grammer: ref Grammer, input: ref str, descript: Descriptor): pair): pair, set> { return nmatch(k, set(c), R); } fun ascend(k:int, K: ref set, r: int): pair, set> { return nmatch(k, K, set(r)); } fun nmatch(k:int, K: ref set, R: ref set): pair, set> { - /*var R = { | in K, r in R }*/ - /*var Y = { | in K, r in R }*/ var Rp = set() var Y = set() - /*for pending in K {*/ for (var i = 0; i < K.data.size; i++;) { var pending = K.data[i] - /*for r in R {*/ for (var j = 0; j < R.data.size; j++;) { var r = R.data[j] Rp.add(descriptor(pending.nonterminal, pending.rule_idx, pending.idx_into_rule, pending.left, r)) @@ -303,18 +287,10 @@ fun nmatch(k:int, K: ref set, R: ref set): pair, s } return make_pair(Rp,Y) } - fun main(argc: int, argv: **char): int { var grammer.construct(): Grammer - /*add_new_nonterminal(rule: ref vec): int {*/ - /*add_to_nonterminal(nonterminal: int, rule: ref vec) {*/ - /*add_terminal(c: char): int {*/ - - /*fungll(grammer: ref Grammer, input: ref str): set {*/ - - var one = grammer.add_terminal('1') - var E = grammer.add_new_nonterminal(vec()) + var E = grammer.add_new_nonterminal("E", vec()) grammer.add_to_nonterminal(E, vec(one)) grammer.add_to_nonterminal(E, vec(E,E,E)) @@ -322,7 +298,8 @@ fun main(argc: int, argv: **char): int { println(str("length of BSR is: ") + BSR.size()) for (var i = 0; i < BSR.data.size; i++;) { var BS = BSR.data[i] - println(str() + i + ": " + BSR.data[i].to_string()) + /*println(str() + i + ": " + grammer.to_string(BSR.data[i]) + "\t\t" + BSR.data[i].to_string())*/ + println(str() + i + ": " + grammer.to_string(BSR.data[i])) } return 0