diff --git a/stdlib/grammer.krak b/stdlib/grammer.krak index 1182aad..3a81e0b 100644 --- a/stdlib/grammer.krak +++ b/stdlib/grammer.krak @@ -143,7 +143,9 @@ obj grammer (Object) { for (var i = 0; i < rhs.size; i++;) { var lookahead = first_set_map[rhs[i]] if (lookahead.contains(symbol::null_symbol())) { - lookahead.remove(symbol::null_symbol()) + // remove the null if this is not the last in the rule + if (i != rhs.size-1) + lookahead.remove(symbol::null_symbol()) toRet.add(lookahead) } else { toRet.add(lookahead) diff --git a/tests/grammer2.kgm b/tests/grammer2.kgm index 2b50832..f82266a 100644 --- a/tests/grammer2.kgm +++ b/tests/grammer2.kgm @@ -3,8 +3,9 @@ a = b ; b = "c":named_c ; b = c "d":dname ; c = "a" | d ; -d = e post_null post_non_null ; +d = e post_null post_non_null inherit_null ; +inherit_null = e | post_non_null ; e = f | ; f = ; -post_null = "hi" -post_non_null = "bye" +post_null = "hi" ; +post_non_null = "bye" ; diff --git a/tests/test_grammer.krak b/tests/test_grammer.krak index a535897..135e7a2 100644 --- a/tests/test_grammer.krak +++ b/tests/test_grammer.krak @@ -7,9 +7,9 @@ import symbol:* fun main():int { - /*var a = load_grammer(read_file(string("../krakenGrammer.kgm")))*/ + var a = load_grammer(read_file(string("../krakenGrammer.kgm"))) /*var a = load_grammer(read_file(string("grammer.kgm")))*/ - var a = load_grammer(read_file(string("grammer2.kgm"))) + /*var a = load_grammer(read_file(string("grammer2.kgm")))*/ println(a.to_string()) var doFirstSet = fun() { a.calculate_first_set() @@ -39,10 +39,10 @@ fun main():int { var lex = lexer(a.terminals) - /*lex.set_input(read_file(string("test_grammer.krak")))*/ + lex.set_input(read_file(string("test_grammer.krak"))) /*lex.set_input(string("ccdahas spacedhas*/ /*returndaaaaaaaaaaaaaa"))*/ - lex.set_input(string("hibyed")) + /*lex.set_input(string("hibyed"))*/ println("woo lexing:") range(8).for_each(fun(i: int) { println(lex.next().to_string()); } ) /*range(80).for_each(fun(i: int) { println(lex.next().to_string()); } )*/