diff --git a/language/parser.cc b/language/parser.cc index ae713eb..f96f4f0 100644 --- a/language/parser.cc +++ b/language/parser.cc @@ -4,43 +4,43 @@ using namespace peglib; using namespace std; static auto g_grammar = R"( - PROGRAM <- _ STATEMENTS + PROGRAM <- _ STATEMENTS - STATEMENTS <- EXPRESSION* + STATEMENTS <- EXPRESSION* - EXPRESSION <- ASSIGNMENT / PRIMARY - ASSIGNMENT <- IDENTIFIER '=' _ EXPRESSION - WHILE <- 'while' _ EXPRESSION BLOCK - IF <- 'if' _ EXPRESSION BLOCK ('else' _ 'if' _ EXPRESSION BLOCK)* ('else' _ BLOCK)? - FUNCTION <- 'fn' _ PARAMETERS BLOCK - PARAMETERS <- '(' _ IDENTIFIER* ')' _ - FUNCTION_CALL <- IDENTIFIER ARGUMENTS - ARGUMENTS <- '(' _ EXPRESSION* ')' _ + EXPRESSION <- ASSIGNMENT / PRIMARY + ASSIGNMENT <- IDENTIFIER '=' _ EXPRESSION + WHILE <- 'while' _ EXPRESSION BLOCK + IF <- 'if' _ EXPRESSION BLOCK ('else' _ 'if' _ EXPRESSION BLOCK)* ('else' _ BLOCK)? + FUNCTION <- 'fn' _ PARAMETERS BLOCK + PARAMETERS <- '(' _ IDENTIFIER* ')' _ + FUNCTION_CALL <- IDENTIFIER ARGUMENTS + ARGUMENTS <- '(' _ EXPRESSION* ')' _ - PRIMARY <- CONDITION (CONDITION_OPERATOR CONDITION)? - CONDITION <- TERM (TERM_OPERATOR TERM)* - TERM <- FACTOR (FACTOR_OPERATOR FACTOR)* - FACTOR <- WHILE / IF / FUNCTION / FUNCTION_CALL / NUMBER / BOOLEAN / STRING / INTERPOLATED_STRING / IDENTIFIER / '(' _ EXPRESSION ')' _ + PRIMARY <- CONDITION (CONDITION_OPERATOR CONDITION)? + CONDITION <- TERM (TERM_OPERATOR TERM)* + TERM <- FACTOR (FACTOR_OPERATOR FACTOR)* + FACTOR <- WHILE / IF / FUNCTION / FUNCTION_CALL / NUMBER / BOOLEAN / STRING / INTERPOLATED_STRING / IDENTIFIER / '(' _ EXPRESSION ')' _ - BLOCK <- '{' _ STATEMENTS '}' _ + BLOCK <- '{' _ STATEMENTS '}' _ - CONDITION_OPERATOR <- < ('==' / '!=' / '<=' / '<' / '>=' / '>') > _ - TERM_OPERATOR <- < [-+] > _ - FACTOR_OPERATOR <- < [*/%] > _ - IDENTIFIER <- < [a-zA-Z_]+ > _ + CONDITION_OPERATOR <- < ('==' / '!=' / '<=' / '<' / '>=' / '>') > _ + TERM_OPERATOR <- < [-+] > _ + FACTOR_OPERATOR <- < [*/%] > _ + IDENTIFIER <- < [a-zA-Z_]+ > _ - NUMBER <- < [0-9]+ > _ - BOOLEAN <- < ('true' / 'false') > _ - STRING <- ['] < (!['] .)* > ['] _ + NUMBER <- < [0-9]+ > _ + BOOLEAN <- < ('true' / 'false') > _ + STRING <- ['] < (!['] .)* > ['] _ INTERPOLATED_STRING <- '"' ('{' _ EXPRESSION '}' / INTERPOLATED_CONTENT)* '"' _ INTERPOLATED_CONTENT <- (!["{] .) (!["{] .)* - ~_ <- (Space / EndOfLine / Comment)* - Space <- ' ' / '\t' - EndOfLine <- '\r\n' / '\n' / '\r' - EndOfFile <- !. - Comment <- '/*' (!'*/' .)* '*/' / ('#' / '//') (!(EndOfLine / EndOfFile) .)* (EndOfLine / EndOfFile) + ~_ <- (Space / EndOfLine / Comment)* + Space <- ' ' / '\t' + EndOfLine <- '\r\n' / '\n' / '\r' + EndOfFile <- !. + Comment <- '/*' (!'*/' .)* '*/' / ('#' / '//') (!(EndOfLine / EndOfFile) .)* (EndOfLine / EndOfFile) )"; peglib::peg& get_parser()