Added current, in progress grammer/
This commit is contained in:
65
krakenGrammer.kgm
Normal file
65
krakenGrammer.kgm
Normal file
@@ -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)+\"" ;
|
||||||
|
|
||||||
@@ -79,6 +79,11 @@ NodeTree<Symbol*>* RNGLRParser::parseInput(std::string inputString) {
|
|||||||
if (gss.frontierIsEmpty(i)) {
|
if (gss.frontierIsEmpty(i)) {
|
||||||
std::cout << "Frontier " << i << " is empty." << std::endl;
|
std::cout << "Frontier " << i << " is empty." << std::endl;
|
||||||
std::cout << "Failed on " << input[i]->toString() << 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;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user