diff --git a/grammar/grammar.peg b/grammar/grammar.peg index 6ba89e8..1748933 100644 --- a/grammar/grammar.peg +++ b/grammar/grammar.peg @@ -1,9 +1,9 @@ Root <- skip container_doc_comment? ContainerMembers eof # *** Top level *** -ContainerMembers <- ContainerDeclarations (ContainerField COMMA)* (ContainerField / ContainerDeclarations) +ContainerMembers <- ContainerDeclaration* (ContainerField COMMA)* (ContainerField / ContainerDeclaration*) -ContainerDeclarations <- (TestDecl / ComptimeDecl / doc_comment? KEYWORD_pub? Decl)* +ContainerDeclaration <- TestDecl / ComptimeDecl / doc_comment? KEYWORD_pub? Decl TestDecl <- KEYWORD_test (STRINGLITERALSINGLE / IDENTIFIER)? Block @@ -12,7 +12,6 @@ ComptimeDecl <- KEYWORD_comptime Block Decl <- (KEYWORD_export / KEYWORD_extern STRINGLITERALSINGLE? / KEYWORD_inline / KEYWORD_noinline)? FnProto (SEMICOLON / Block) / (KEYWORD_export / KEYWORD_extern STRINGLITERALSINGLE?)? KEYWORD_threadlocal? GlobalVarDecl - / KEYWORD_usingnamespace Expr SEMICOLON FnProto <- KEYWORD_fn IDENTIFIER? LPAREN ParamDeclList RPAREN ByteAlign? AddrSpace? LinkSection? CallConv? EXCLAMATIONMARK? TypeExpr @@ -31,7 +30,7 @@ Statement / KEYWORD_errdefer Payload? BlockExprStatement / IfStatement / LabeledStatement - / SwitchExpr + / BlockLabel? SwitchExpr / VarDeclExprStatement ComptimeStatement @@ -96,10 +95,11 @@ PrimaryExpr / KEYWORD_break BreakLabel? Expr? / KEYWORD_comptime Expr / KEYWORD_nosuspend Expr - / KEYWORD_continue BreakLabel? + / KEYWORD_continue BreakLabel? Expr? / KEYWORD_resume Expr / KEYWORD_return Expr? / BlockLabel? LoopExpr + / BlockLabel SwitchExpr / Block / CurlySuffixExpr @@ -125,8 +125,7 @@ TypeExpr <- PrefixTypeOp* ErrorUnionExpr ErrorUnionExpr <- SuffixExpr (EXCLAMATIONMARK TypeExpr)? SuffixExpr - <- KEYWORD_async PrimaryTypeExpr SuffixOp* FnCallArguments - / PrimaryTypeExpr (SuffixOp / FnCallArguments)* + <- PrimaryTypeExpr (SuffixOp / FnCallArguments)* PrimaryTypeExpr <- BUILTINIDENTIFIER FnCallArguments @@ -180,7 +179,7 @@ AsmInput <- COLON AsmInputList AsmClobbers? AsmInputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN Expr RPAREN -AsmClobbers <- COLON StringList +AsmClobbers <- COLON PrimaryTypeExpr # *** Helper grammar *** BreakLabel <- COLON IDENTIFIER @@ -302,7 +301,6 @@ PrefixOp / MINUSPERCENT / AMPERSAND / KEYWORD_try - / KEYWORD_await PrefixTypeOp <- QUESTIONMARK @@ -350,8 +348,6 @@ AsmOutputList <- (AsmOutputItem COMMA)* AsmOutputItem? AsmInputList <- (AsmInputItem COMMA)* AsmInputItem? -StringList <- (STRINGLITERAL COMMA)* STRINGLITERAL? - ParamDeclList <- (ParamDecl COMMA)* ParamDecl? ExprList <- (Expr COMMA)* Expr? @@ -408,9 +404,7 @@ mb_utf8_literal <- / oxE0 oxA0_oxBF ox80_oxBF / oxC2_oxDF ox80_oxBF -# NOTE: `\135` is `]`. We separate to avoid this: [\000-\011\013-\046\050-\133]-\177] -# ^ ^XXXXXX -ascii_char_not_nl_slash_squote <- [\000-\011\013-\046\050-\133\136-\177] / ']' +ascii_char_not_nl_slash_squote <- [\000-\011\013-\046\050-\133\135-\177] char_escape <- "\\x" hex hex @@ -428,28 +422,28 @@ string_char container_doc_comment <- ('//!' [^\n]* [ \n]* skip)+ doc_comment <- ('///' [^\n]* [ \n]* skip)+ line_comment <- '//' ![!/][^\n]* / '////' [^\n]* -line_string <- ('\\\\' [^\n]* [ \n]*)+ +line_string <- ("\\\\" [^\n]* [ \n]*)+ skip <- ([ \n] / line_comment)* -CHAR_LITERAL <- ['] char_char ['] skip +CHAR_LITERAL <- "'" char_char "'" skip FLOAT - <- '0x' hex_int '.' hex_int ([pP] [-+]? dec_int)? skip - / dec_int '.' dec_int ([eE] [-+]? dec_int)? skip - / '0x' hex_int [pP] [-+]? dec_int skip + <- "0x" hex_int "." hex_int ([pP] [-+]? dec_int)? skip + / dec_int "." dec_int ([eE] [-+]? dec_int)? skip + / "0x" hex_int [pP] [-+]? dec_int skip / dec_int [eE] [-+]? dec_int skip INTEGER - <- '0b' bin_int skip - / '0o' oct_int skip - / '0x' hex_int skip + <- "0b" bin_int skip + / "0o" oct_int skip + / "0x" hex_int skip / dec_int skip -STRINGLITERALSINGLE <- ["] string_char* ["] skip +STRINGLITERALSINGLE <- "\"" string_char* "\"" skip STRINGLITERAL <- STRINGLITERALSINGLE / (line_string skip)+ IDENTIFIER <- !keyword [A-Za-z_] [A-Za-z0-9_]* skip - / '@' STRINGLITERALSINGLE -BUILTINIDENTIFIER <- '@'[A-Za-z_][A-Za-z0-9_]* skip + / "@" STRINGLITERALSINGLE +BUILTINIDENTIFIER <- "@"[A-Za-z_][A-Za-z0-9_]* skip AMPERSAND <- '&' ![=] skip @@ -525,8 +519,6 @@ KEYWORD_and <- 'and' end_of_word KEYWORD_anyframe <- 'anyframe' end_of_word KEYWORD_anytype <- 'anytype' end_of_word KEYWORD_asm <- 'asm' end_of_word -KEYWORD_async <- 'async' end_of_word -KEYWORD_await <- 'await' end_of_word KEYWORD_break <- 'break' end_of_word KEYWORD_callconv <- 'callconv' end_of_word KEYWORD_catch <- 'catch' end_of_word @@ -563,14 +555,13 @@ KEYWORD_threadlocal <- 'threadlocal' end_of_word KEYWORD_try <- 'try' end_of_word KEYWORD_union <- 'union' end_of_word KEYWORD_unreachable <- 'unreachable' end_of_word -KEYWORD_usingnamespace <- 'usingnamespace' end_of_word KEYWORD_var <- 'var' end_of_word KEYWORD_volatile <- 'volatile' end_of_word KEYWORD_while <- 'while' end_of_word keyword <- KEYWORD_addrspace / KEYWORD_align / KEYWORD_allowzero / KEYWORD_and - / KEYWORD_anyframe / KEYWORD_anytype / KEYWORD_asm / KEYWORD_async - / KEYWORD_await / KEYWORD_break / KEYWORD_callconv / KEYWORD_catch + / KEYWORD_anyframe / KEYWORD_anytype / KEYWORD_asm + / KEYWORD_break / KEYWORD_callconv / KEYWORD_catch / KEYWORD_comptime / KEYWORD_const / KEYWORD_continue / KEYWORD_defer / KEYWORD_else / KEYWORD_enum / KEYWORD_errdefer / KEYWORD_error / KEYWORD_export / KEYWORD_extern / KEYWORD_fn / KEYWORD_for / KEYWORD_if @@ -579,4 +570,4 @@ keyword <- KEYWORD_addrspace / KEYWORD_align / KEYWORD_allowzero / KEYWORD_and / KEYWORD_pub / KEYWORD_resume / KEYWORD_return / KEYWORD_linksection / KEYWORD_struct / KEYWORD_suspend / KEYWORD_switch / KEYWORD_test / KEYWORD_threadlocal / KEYWORD_try / KEYWORD_union / KEYWORD_unreachable - / KEYWORD_usingnamespace / KEYWORD_var / KEYWORD_volatile / KEYWORD_while + / KEYWORD_var / KEYWORD_volatile / KEYWORD_while \ No newline at end of file