diff --git a/krakenGrammer.kgm b/krakenGrammer.kgm new file mode 100644 index 0000000..5169222 --- /dev/null +++ b/krakenGrammer.kgm @@ -0,0 +1,65 @@ +Goal = translation_unit ; +translation_unit = interpreter_directive WS opt_import_list WS function_list WS ; + +type = "\*" WS type | "void" | "int" | "float" | "double" | "char" | identifier ; + +opt_import_list = import_list | ; +import_list = import_list WS import | import ; +import = "import" WS identifier WS ";" ; + +interpreter_directive = "#!" WS path | ; +path = path path_part | path_part ; +path_part = forward_slash alphanumeric | back_slash alphanumeric ; +forward_slash = "/" ; +back_slash = "\\" ; + +WS = "( | | +)+" | ; + +identifier = alpha | alpha alphanumeric ; + +function_list = function_list WS function | function ; + +function = type WS identifier WS "\(" WS opt_typed_parameter_list WS "\)" WS code_block ; + +opt_typed_parameter_list = typed_parameter_list | ; +typed_parameter_list = typed_parameter_list WS typed_parameter | typed_parameter ; +typed_parameter = type WS parameter ; + +opt_parameter_list = parameter_list | ; +parameter_list = parameter_list WS parameter | parameter ; +parameter = expression ; + +code_block = "{" WS statement_list WS "}" ; +statement_list = statement_list WS statement | statement ; +statement = function_call WS ";" | if_statement | return_statement | expression | booleang_expression | assignment_statement | code_block ; +function_call = scope identifier "\(" WS opt_parameter_list WS "\)" ; +scope = scope identifier "::" | ; + +if_statement = "if" WS boolean_expression WS statement | "if" WS "\(" WS boolean_expression WS "\)" WS statement ; + +boolean_expression = boolean_expression WS "\|\|" WS and_boolean_expression | and_boolean_expression ; +and_boolean_expression = and_boolean_expression "&&" bool_exp | bool_exp ; +bool_exp = "!" WS bool_exp | statement WS "==" WS statement | bool ; + +return_statement = "return" WS "\(" WS expression WS "\)" WS ";" | "return" WS expression WS ";" ; + +expression = expression WS "-" WS term | expression WS "\+" WS term | term ; +term = term WS forward_slash WS factor | term WS "\*" WS factor | factor ; +factor = number | identifier | function_call | bool | pointer | string ; +number = integer | float | double ; + +assignment_statement = identifier WS "=" WS statement ; + +alpha = "(a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z|A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z|.|_|-)+" ; +numeric = "(0|1|2|3|4|5|6|7|8|9)+" ; +alphanumeric = alphanumeric numeric | alphanumeric alpha | numeric | alpha ; +hexadecimal = sign WS "0x(1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)+" ; +sign = "\+|-" | ; +integer = sign WS numeric | hexadecimal ; +float = sign numeric "." numeric "f" ; +double = sign numeric "." numeric | sign numeric "." numeric "d" ; +bool = "true" | "false" ; +pointer = hexadecimal | "null" ; +string = "\"(a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z|A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z|.|!|_|-| | |\\|/|\||0|1|2|3|4|5|6|7|8|9)+\"" ; + diff --git a/src/RNGLRParser.cpp b/src/RNGLRParser.cpp index 947a9c4..9a47bec 100644 --- a/src/RNGLRParser.cpp +++ b/src/RNGLRParser.cpp @@ -79,6 +79,11 @@ NodeTree* RNGLRParser::parseInput(std::string inputString) { if (gss.frontierIsEmpty(i)) { std::cout << "Frontier " << i << " is empty." << std::endl; std::cout << "Failed on " << input[i]->toString() << std::endl; + std::cout << "Nearby is:" << std::endl; + int range = 4; + for (int j = (i-range >= 0 ? i-range : 0); j < (i+range < input.size() ? i+range : input.size()); j++) + std::cout << input[j]->toString() << " "; + std::cout << std::endl; break; }