FINALLY fixed an error that took weeks. Turned out that the ParseRule was shallow copied, and the lookahead was not copied correctly. So it got extended and thus skipped over the state when it should have been redone.
This commit is contained in:
@@ -27,30 +27,38 @@ typed_parameter_list = typed_parameter_list WS "," WS typed_parameter | typed_pa
|
||||
typed_parameter = type WS parameter ;
|
||||
|
||||
opt_parameter_list = parameter_list | ;
|
||||
parameter_list = parameter_list WS parameter | parameter ;
|
||||
parameter_list = parameter_list WS "," WS parameter | parameter ;
|
||||
parameter = boolean_expression ;
|
||||
|
||||
code_block = "{" WS statement_list WS "}" ;
|
||||
statement_list = statement_list WS statement | statement ;
|
||||
statement = if_statement | return_statement | boolean_expression WS ";" | boolean_expression WS ";" | assignment_statement WS ";" | declaration_statement WS ";" | code_block ;
|
||||
function_call = scope identifier "\(" WS opt_parameter_list WS "\)" ;
|
||||
scope = scope identifier "::" | ;
|
||||
if_statement = "if" WS "\(" WS boolean_expression WS "\)" WS statement ;
|
||||
|
||||
if_statement = "if" WS boolean_expression WS statement ;
|
||||
while_loop = "while" WS boolean_expression WS statement ;
|
||||
|
||||
for_update = "\(" WS statement_list WS "\)" ;
|
||||
for_loop = "for" WS for_update WS statement ;
|
||||
|
||||
return_statement = "return" WS boolean_expression WS ";" ;
|
||||
|
||||
code_block = "{" WS statement_list WS "}" ;
|
||||
|
||||
statement_list = statement_list WS statement | statement ;
|
||||
statement = if_statement | while_loop | for_loop | return_statement | boolean_expression WS ";" | assignment_statement WS ";" | declaration_statement WS ";" | code_block ;
|
||||
function_call = scope identifier "\(" WS opt_parameter_list WS "\)" ;
|
||||
scope = scope identifier "::" | ;
|
||||
|
||||
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 | expression WS comparator WS expression | bool | expression ;
|
||||
comparator = "==" | "<=" | ">=" | "!=" ;
|
||||
comparator = "==" | "<=" | ">=" | "!=" | "<" | ">" ;
|
||||
|
||||
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 | string | "\(" WS boolean_expression WS "\)" ;
|
||||
expression = expression WS "<<" WS term | expression WS ">>" WS shiftand | shiftand ;
|
||||
shiftand = shiftand WS "-" WS term | shiftand WS "\+" WS term | term ;
|
||||
term = term WS forward_slash WS factor | term WS "\*" WS factor | term WS "%" WS factor | factor ;
|
||||
factor = "\+\+" WS unarad | unarad WS "\+\+" | "--" WS unarad | unarad WS "--" | "\+" WS unarad | "-" WS unarad | "!" WS unarad | "~" WS unarad | "\(" WS type WS "\)" WS unarad | "\*" WS unarad | "&" WS unarad | unarad ;
|
||||
unarad = number | identifier | function_call | bool | string | "\(" WS boolean_expression WS "\)" ;
|
||||
number = integer | float | double ;
|
||||
|
||||
assignment_statement = identifier WS "=" WS boolean_expression ;
|
||||
assignment_statement = identifier WS "=" WS boolean_expression | identifier WS "+=" WS boolean_expression | identifier WS "-=" WS boolean_expression | identifier WS "\*=" WS boolean_expression | identifier WS "/=" WS boolean_expression ;
|
||||
declaration_statement = type WS identifier WS "=" WS boolean_expression ;
|
||||
|
||||
alphanumeric = alphanumeric numeric | alphanumeric alpha | numeric | alpha ;
|
||||
@@ -60,6 +68,6 @@ integer = sign numeric | sign hexadecimal | "null" ;
|
||||
float = sign numeric "." numeric "f" ;
|
||||
double = sign numeric "." numeric | sign numeric "." numeric "d" ;
|
||||
bool = "true" | "false" | "True" | "False" ;
|
||||
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|.|_)+" ;
|
||||
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)+" ;
|
||||
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)+\"" ;
|
||||
Reference in New Issue
Block a user