2023-09-19 11:42:10 +01:00
|
|
|
Root <- container_doc_comment? container_members eof
|
2023-07-06 11:48:59 +01:00
|
|
|
|
2023-09-19 11:42:10 +01:00
|
|
|
container_members <- container_declarations (container_field COMMA)* (container_field / container_declarations)
|
2023-07-06 11:48:59 +01:00
|
|
|
|
2023-09-19 11:42:10 +01:00
|
|
|
container_declarations
|
|
|
|
<- test_decl container_declarations
|
|
|
|
/ top_level_comptime container_declarations
|
|
|
|
/ doc_comment? KEYWORD_PUB? top_level_decl container_declarations
|
|
|
|
/ end_of_word
|
2023-07-06 11:48:59 +01:00
|
|
|
|
2023-09-19 11:42:10 +01:00
|
|
|
test_decl <- doc_comment? KEYWORD_TEST block
|
2023-07-06 11:48:59 +01:00
|
|
|
|
2023-09-19 11:42:10 +01:00
|
|
|
top_level_comptime <- doc_comment? KEYWORD_COMPTIME block_expr
|
2023-07-06 11:48:59 +01:00
|
|
|
|
2023-09-19 11:42:10 +01:00
|
|
|
top_level_decl
|
|
|
|
<- (KEYWORD_EXPORT / KEYWORD_EXTERN / (KEYWORD_INLINE / KEYWORD_NOINLINE))? fn_proto (SEMICOLON / block)
|
|
|
|
/ (KEYWORD_EXPORT / KEYWORD_EXTERN )? KEYWORD_THREADLOCAL? var_decl
|
|
|
|
/ KEYWORD_USINGNAMESPACE expr SEMICOLON
|
2023-07-06 11:48:59 +01:00
|
|
|
|
2023-09-19 11:42:10 +01:00
|
|
|
fn_proto <- KEYWORD_FN IDENTIFIER? LPAREN param_decl_list RPAREN byte_align? link_section? call_conv? EXCLAMATIONMARK? type_expr
|
2023-07-06 11:48:59 +01:00
|
|
|
|
2023-09-19 11:42:10 +01:00
|
|
|
var_decl <- (KEYWORD_CONST / KEYWORD_VAR) IDENTIFIER (COLON type_expr)? byte_align? link_section? (EQUAL expr)? SEMICOLON
|
2023-07-06 11:48:59 +01:00
|
|
|
|
2023-09-19 11:42:10 +01:00
|
|
|
container_field <- doc_comment? KEYWORD_COMPTIME? IDENTIFIER (COLON (KEYWORD_ANYTYPE / type_expr) byte_align?)? (EQUAL expr)?
|
2023-07-06 11:48:59 +01:00
|
|
|
|
2023-09-19 11:42:10 +01:00
|
|
|
statement
|
|
|
|
<- KEYWORD_COMPTIME? var_decl
|
|
|
|
/ KEYWORD_COMPTIME block_expr_satement
|
|
|
|
/ KEYWORD_NOSUSPEND block_expr_satement
|
|
|
|
/ KEYWORD_SUSPEND block_expr_satement
|
|
|
|
/ KEYWORD_DEFER block_expr_satement
|
|
|
|
/ KEYWORD_ERRDEFER payload? block_expr_satement
|
|
|
|
/ if_statement
|
|
|
|
/ labeled_statement
|
|
|
|
/ switch_expr
|
|
|
|
/ assign_expr SEMICOLON
|
2023-07-06 11:48:59 +01:00
|
|
|
|
2023-09-19 11:42:10 +01:00
|
|
|
if_statement
|
|
|
|
<- if_prefix block_expr ( KEYWORD_ELSE payload? statement )?
|
|
|
|
/ if_prefix assign_expr ( SEMICOLON / KEYWORD_ELSE payload? statement )
|
2023-07-06 11:48:59 +01:00
|
|
|
|
2023-09-19 11:42:10 +01:00
|
|
|
labeled_statement <- block_label? (block / loop_statement)
|
2023-07-06 11:48:59 +01:00
|
|
|
|
2023-09-19 11:42:10 +01:00
|
|
|
loop_statement <- KEYWORD_INLINE? (for_statement / while_statement)
|
2023-07-06 11:48:59 +01:00
|
|
|
|
2023-09-19 11:42:10 +01:00
|
|
|
for_statement
|
|
|
|
<- for_prefix block_expr ( KEYWORD_ELSE statement )?
|
|
|
|
/ for_prefix assign_expr ( SEMICOLON / KEYWORD_ELSE statement )
|
2023-07-06 11:48:59 +01:00
|
|
|
|
2023-09-19 11:42:10 +01:00
|
|
|
while_statement
|
|
|
|
<- WhilePrefix block_expr ( KEYWORD_ELSE payload? statement )?
|
|
|
|
/ WhilePrefix assign_expr ( SEMICOLON / KEYWORD_ELSE payload? statement )
|
2023-07-06 11:48:59 +01:00
|
|
|
|
2023-09-19 11:42:10 +01:00
|
|
|
block_expr_satement
|
|
|
|
<- block_expr
|
|
|
|
/ assign_expr SEMICOLON
|
2023-07-06 11:48:59 +01:00
|
|
|
|
2023-09-19 11:42:10 +01:00
|
|
|
block_expr <- block_label? block
|
2023-07-06 11:48:59 +01:00
|
|
|
|
2023-09-19 11:42:10 +01:00
|
|
|
assign_expr <- expr (AssignOp expr)?
|
2023-07-06 11:48:59 +01:00
|
|
|
|
2023-09-19 11:42:10 +01:00
|
|
|
expr <- bool_or_expr
|
2023-07-06 11:48:59 +01:00
|
|
|
|
2023-09-19 11:42:10 +01:00
|
|
|
bool_or_expr <- BoolAndExpr (KEYWORD_OR BoolAndExpr)*
|
2023-07-06 11:48:59 +01:00
|
|
|
|
2023-09-19 11:42:10 +01:00
|
|
|
BoolAndExpr <- CompareExpr (KEYWORD_AND CompareExpr)*
|
2023-07-06 11:48:59 +01:00
|
|
|
|
|
|
|
CompareExpr <- BitwiseExpr (CompareOp BitwiseExpr)?
|
|
|
|
|
|
|
|
BitwiseExpr <- BitShiftExpr (BitwiseOp BitShiftExpr)*
|
|
|
|
|
|
|
|
BitShiftExpr <- AdditionExpr (BitShiftOp AdditionExpr)*
|
|
|
|
|
|
|
|
AdditionExpr <- MultiplyExpr (AdditionOp MultiplyExpr)*
|
|
|
|
|
|
|
|
MultiplyExpr <- PrefixExpr (MultiplyOp PrefixExpr)*
|
|
|
|
|
|
|
|
PrefixExpr <- PrefixOp* PrimaryExpr
|
|
|
|
|
|
|
|
PrimaryExpr
|
|
|
|
<- AsmExpr
|
|
|
|
/ IfExpr
|
2023-09-19 11:42:10 +01:00
|
|
|
/ KEYWORD_BREAK BreakLabel? expr?
|
|
|
|
/ KEYWORD_COMPTIME expr
|
|
|
|
/ KEYWORD_NOSUSPEND expr
|
|
|
|
/ KEYWORD_CONTINUE BreakLabel?
|
|
|
|
/ KEYWORD_RESUME expr
|
|
|
|
/ KEYWORD_RETURN expr?
|
|
|
|
/ block_label? LoopExpr
|
|
|
|
/ block
|
2023-07-06 11:48:59 +01:00
|
|
|
/ CurlySuffixExpr
|
|
|
|
|
2023-09-19 11:42:10 +01:00
|
|
|
IfExpr <- if_prefix expr (KEYWORD_ELSE payload? expr)?
|
2023-07-06 11:48:59 +01:00
|
|
|
|
2023-09-19 11:42:10 +01:00
|
|
|
block <- LBRACE statement* RBRACE
|
2023-07-06 11:48:59 +01:00
|
|
|
|
2023-09-19 11:42:10 +01:00
|
|
|
LoopExpr <- KEYWORD_INLINE? (ForExpr / WhileExpr)
|
2023-07-06 11:48:59 +01:00
|
|
|
|
2023-09-19 11:42:10 +01:00
|
|
|
ForExpr <- for_prefix expr (KEYWORD_ELSE expr)?
|
2023-07-06 11:48:59 +01:00
|
|
|
|
2023-09-19 11:42:10 +01:00
|
|
|
WhileExpr <- WhilePrefix expr (KEYWORD_ELSE payload? expr)?
|
2023-07-06 11:48:59 +01:00
|
|
|
|
2023-09-19 11:42:10 +01:00
|
|
|
CurlySuffixExpr <- type_expr InitList?
|
2023-07-06 11:48:59 +01:00
|
|
|
|
|
|
|
InitList
|
|
|
|
<- LBRACE FieldInit (COMMA FieldInit)* COMMA? RBRACE
|
2023-09-19 11:42:10 +01:00
|
|
|
/ LBRACE expr (COMMA expr)* COMMA? RBRACE
|
2023-07-06 11:48:59 +01:00
|
|
|
/ LBRACE RBRACE
|
|
|
|
|
2023-09-19 11:42:10 +01:00
|
|
|
type_expr <- PrefixTypeOp* ErrorUnionExpr
|
2023-07-06 11:48:59 +01:00
|
|
|
|
2023-09-19 11:42:10 +01:00
|
|
|
ErrorUnionExpr <- SuffixExpr (EXCLAMATIONMARK type_expr)?
|
2023-07-06 11:48:59 +01:00
|
|
|
|
|
|
|
SuffixExpr
|
2023-09-19 11:42:10 +01:00
|
|
|
<- KEYWORD_ASYNC PrimaryTypeExpr SuffixOp* FnCallArguments
|
2023-07-06 11:48:59 +01:00
|
|
|
/ PrimaryTypeExpr (SuffixOp / FnCallArguments)*
|
|
|
|
|
|
|
|
PrimaryTypeExpr
|
|
|
|
<- BUILTINIDENTIFIER FnCallArguments
|
|
|
|
/ CHAR_LITERAL
|
|
|
|
/ ContainerDecl
|
|
|
|
/ DOT IDENTIFIER
|
|
|
|
/ DOT InitList
|
|
|
|
/ ErrorSetDecl
|
|
|
|
/ FLOAT
|
2023-09-19 11:42:10 +01:00
|
|
|
/ fn_proto
|
2023-07-06 11:48:59 +01:00
|
|
|
/ GroupedExpr
|
|
|
|
/ LabeledTypeExpr
|
|
|
|
/ IDENTIFIER
|
|
|
|
/ IfTypeExpr
|
|
|
|
/ INTEGER
|
2023-09-19 11:42:10 +01:00
|
|
|
/ KEYWORD_COMPTIME type_expr
|
|
|
|
/ KEYWORD_ERROR DOT IDENTIFIER
|
|
|
|
/ KEYWORD_ANYFRAME
|
|
|
|
/ KEYWORD_UNREACHABLE
|
2023-07-06 11:48:59 +01:00
|
|
|
/ STRINGLITERAL
|
2023-09-19 11:42:10 +01:00
|
|
|
/ switch_expr
|
2023-07-06 11:48:59 +01:00
|
|
|
|
2023-09-19 11:42:10 +01:00
|
|
|
ContainerDecl <- (KEYWORD_EXTERN / KEYWORD_PACKED)? ContainerDeclAuto
|
2023-07-06 11:48:59 +01:00
|
|
|
|
2023-09-19 11:42:10 +01:00
|
|
|
ErrorSetDecl <- KEYWORD_ERROR LBRACE IdentifierList RBRACE
|
2023-07-06 11:48:59 +01:00
|
|
|
|
2023-09-19 11:42:10 +01:00
|
|
|
GroupedExpr <- LPAREN expr RPAREN
|
2023-07-06 11:48:59 +01:00
|
|
|
|
2023-09-19 11:42:10 +01:00
|
|
|
IfTypeExpr <- if_prefix type_expr (KEYWORD_ELSE payload? type_expr)?
|
2023-07-06 11:48:59 +01:00
|
|
|
|
|
|
|
LabeledTypeExpr
|
2023-09-19 11:42:10 +01:00
|
|
|
<- block_label block
|
|
|
|
/ block_label? LoopTypeExpr
|
2023-07-06 11:48:59 +01:00
|
|
|
|
2023-09-19 11:42:10 +01:00
|
|
|
LoopTypeExpr <- KEYWORD_INLINE? (ForTypeExpr / WhileTypeExpr)
|
2023-07-06 11:48:59 +01:00
|
|
|
|
2023-09-19 11:42:10 +01:00
|
|
|
ForTypeExpr <- for_prefix type_expr (KEYWORD_ELSE type_expr)?
|
2023-07-06 11:48:59 +01:00
|
|
|
|
2023-09-19 11:42:10 +01:00
|
|
|
WhileTypeExpr <- WhilePrefix type_expr (KEYWORD_ELSE payload? type_expr)?
|
2023-07-06 11:48:59 +01:00
|
|
|
|
2023-09-19 11:42:10 +01:00
|
|
|
switch_expr <- KEYWORD_SWITCH LPAREN expr RPAREN LBRACE switch_prong_list RBRACE
|
2023-07-06 11:48:59 +01:00
|
|
|
|
2023-09-19 11:42:10 +01:00
|
|
|
AsmExpr <- KEYWORD_ASM KEYWORD_VOLATILE? LPAREN expr AsmOutput? RPAREN
|
2023-07-06 11:48:59 +01:00
|
|
|
|
|
|
|
AsmOutput <- COLON AsmOutputList AsmInput?
|
|
|
|
|
2023-09-19 11:42:10 +01:00
|
|
|
AsmOutputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN (MINUSRARROW type_expr / IDENTIFIER) RPAREN
|
2023-07-06 11:48:59 +01:00
|
|
|
|
|
|
|
AsmInput <- COLON AsmInputList AsmClobbers?
|
|
|
|
|
2023-09-19 11:42:10 +01:00
|
|
|
AsmInputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN expr RPAREN
|
2023-07-06 11:48:59 +01:00
|
|
|
|
|
|
|
AsmClobbers <- COLON StringList
|
|
|
|
|
|
|
|
BreakLabel <- COLON IDENTIFIER
|
|
|
|
|
2023-09-19 11:42:10 +01:00
|
|
|
block_label <- IDENTIFIER COLON
|
2023-07-06 11:48:59 +01:00
|
|
|
|
2023-09-19 11:42:10 +01:00
|
|
|
FieldInit <- DOT IDENTIFIER EQUAL expr
|
2023-07-06 11:48:59 +01:00
|
|
|
|
2023-09-19 11:42:10 +01:00
|
|
|
while_continue_expr <- COLON LPAREN assign_expr RPAREN
|
2023-07-06 11:48:59 +01:00
|
|
|
|
2023-09-19 11:42:10 +01:00
|
|
|
link_section <- KEYWORD_LINKSECTION LPAREN expr RPAREN
|
2023-07-06 11:48:59 +01:00
|
|
|
|
2023-09-19 11:42:10 +01:00
|
|
|
call_conv <- KEYWORD_CALLCONV LPAREN expr RPAREN
|
2023-07-06 11:48:59 +01:00
|
|
|
|
2023-09-19 11:42:10 +01:00
|
|
|
param_decl
|
|
|
|
<- doc_comment? (KEYWORD_NOALIAS / KEYWORD_COMPTIME)? (IDENTIFIER COLON)? param_type
|
2023-07-06 11:48:59 +01:00
|
|
|
/ DOT3
|
|
|
|
|
2023-09-19 11:42:10 +01:00
|
|
|
param_type
|
|
|
|
<- KEYWORD_ANYTYPE
|
|
|
|
/ type_expr
|
2023-07-06 11:48:59 +01:00
|
|
|
|
2023-09-19 11:42:10 +01:00
|
|
|
if_prefix <- KEYWORD_IF LPAREN expr RPAREN PtrPayload?
|
2023-07-06 11:48:59 +01:00
|
|
|
|
2023-09-19 11:42:10 +01:00
|
|
|
WhilePrefix <- KEYWORD_WHILE LPAREN expr RPAREN PtrPayload? while_continue_expr?
|
2023-07-06 11:48:59 +01:00
|
|
|
|
2023-09-19 11:42:10 +01:00
|
|
|
for_prefix <- KEYWORD_FOR LPAREN expr RPAREN ptr_index_payload
|
2023-07-06 11:48:59 +01:00
|
|
|
|
2023-09-19 11:42:10 +01:00
|
|
|
payload <- PIPE IDENTIFIER PIPE
|
2023-07-06 11:48:59 +01:00
|
|
|
|
|
|
|
PtrPayload <- PIPE ASTERISK? IDENTIFIER PIPE
|
|
|
|
|
2023-09-19 11:42:10 +01:00
|
|
|
ptr_index_payload <- PIPE ASTERISK? IDENTIFIER (COMMA IDENTIFIER)? PIPE
|
2023-07-06 11:48:59 +01:00
|
|
|
|
|
|
|
|
2023-09-19 11:42:10 +01:00
|
|
|
SwitchProng <- SwitchCase EQUALRARROW PtrPayload? assign_expr
|
2023-07-06 11:48:59 +01:00
|
|
|
|
|
|
|
SwitchCase
|
|
|
|
<- SwitchItem (COMMA SwitchItem)* COMMA?
|
2023-09-19 11:42:10 +01:00
|
|
|
/ KEYWORD_ELSE
|
2023-07-06 11:48:59 +01:00
|
|
|
|
2023-09-19 11:42:10 +01:00
|
|
|
SwitchItem <- expr (DOT3 expr)?
|
2023-07-06 11:48:59 +01:00
|
|
|
|
|
|
|
AssignOp
|
|
|
|
<- ASTERISKEQUAL
|
|
|
|
/ SLASHEQUAL
|
|
|
|
/ PERCENTEQUAL
|
|
|
|
/ PLUSEQUAL
|
|
|
|
/ MINUSEQUAL
|
|
|
|
/ LARROW2EQUAL
|
|
|
|
/ RARROW2EQUAL
|
|
|
|
/ AMPERSANDEQUAL
|
|
|
|
/ CARETEQUAL
|
|
|
|
/ PIPEEQUAL
|
|
|
|
/ ASTERISKPERCENTEQUAL
|
|
|
|
/ PLUSPERCENTEQUAL
|
|
|
|
/ MINUSPERCENTEQUAL
|
|
|
|
/ EQUAL
|
|
|
|
|
|
|
|
CompareOp
|
|
|
|
<- EQUALEQUAL
|
|
|
|
/ EXCLAMATIONMARKEQUAL
|
|
|
|
/ LARROW
|
|
|
|
/ RARROW
|
|
|
|
/ LARROWEQUAL
|
|
|
|
/ RARROWEQUAL
|
|
|
|
|
|
|
|
BitwiseOp
|
|
|
|
<- AMPERSAND
|
|
|
|
/ CARET
|
|
|
|
/ PIPE
|
2023-09-19 11:42:10 +01:00
|
|
|
/ KEYWORD_ORELSE
|
|
|
|
/ KEYWORD_CATCH payload?
|
2023-07-06 11:48:59 +01:00
|
|
|
|
|
|
|
BitShiftOp
|
|
|
|
<- LARROW2
|
|
|
|
/ RARROW2
|
|
|
|
|
|
|
|
AdditionOp
|
|
|
|
<- PLUS
|
|
|
|
/ MINUS
|
|
|
|
/ PLUS2
|
|
|
|
/ PLUSPERCENT
|
|
|
|
/ MINUSPERCENT
|
|
|
|
|
|
|
|
MultiplyOp
|
|
|
|
<- PIPE2
|
|
|
|
/ ASTERISK
|
|
|
|
/ SLASH
|
|
|
|
/ PERCENT
|
|
|
|
/ ASTERISK2
|
|
|
|
/ ASTERISKPERCENT
|
|
|
|
|
|
|
|
PrefixOp
|
|
|
|
<- EXCLAMATIONMARK
|
|
|
|
/ MINUS
|
|
|
|
/ TILDE
|
|
|
|
/ MINUSPERCENT
|
|
|
|
/ AMPERSAND
|
2023-09-19 11:42:10 +01:00
|
|
|
/ KEYWORD_TRY
|
|
|
|
/ KEYWORD_AWAIT
|
2023-07-06 11:48:59 +01:00
|
|
|
|
|
|
|
PrefixTypeOp
|
|
|
|
<- QUESTIONMARK
|
2023-09-19 11:42:10 +01:00
|
|
|
/ KEYWORD_ANYFRAME MINUSRARROW
|
|
|
|
/ SliceTypeStart (byte_align / KEYWORD_CONST / KEYWORD_VOLATILE / KEYWORD_ALLOWZERO)*
|
|
|
|
/ PtrTypeStart (KEYWORD_ALIGN LPAREN expr (COLON INTEGER COLON INTEGER)? RPAREN / KEYWORD_CONST / KEYWORD_VOLATILE / KEYWORD_ALLOWZERO)*
|
2023-07-06 11:48:59 +01:00
|
|
|
/ ArrayTypeStart
|
|
|
|
|
|
|
|
SuffixOp
|
2023-09-19 11:42:10 +01:00
|
|
|
<- LBRACKET expr (DOT2 (expr? (COLON expr)?)?)? RBRACKET
|
2023-07-06 11:48:59 +01:00
|
|
|
/ DOT IDENTIFIER
|
|
|
|
/ DOTASTERISK
|
|
|
|
/ DOTQUESTIONMARK
|
|
|
|
|
2023-09-19 11:42:10 +01:00
|
|
|
FnCallArguments <- LPAREN expr_list RPAREN
|
2023-07-06 11:48:59 +01:00
|
|
|
|
2023-09-19 11:42:10 +01:00
|
|
|
SliceTypeStart <- LBRACKET (COLON expr)? RBRACKET
|
2023-07-06 11:48:59 +01:00
|
|
|
|
|
|
|
PtrTypeStart
|
|
|
|
<- ASTERISK
|
|
|
|
/ ASTERISK2
|
2023-09-19 11:42:10 +01:00
|
|
|
/ LBRACKET ASTERISK (LETTERC / COLON expr)? RBRACKET
|
2023-07-06 11:48:59 +01:00
|
|
|
|
2023-09-19 11:42:10 +01:00
|
|
|
ArrayTypeStart <- LBRACKET expr (COLON expr)? RBRACKET
|
2023-07-06 11:48:59 +01:00
|
|
|
|
2023-09-19 11:42:10 +01:00
|
|
|
ContainerDeclAuto <- ContainerDeclType LBRACE container_doc_comment? container_members RBRACE
|
2023-07-06 11:48:59 +01:00
|
|
|
|
|
|
|
ContainerDeclType
|
2023-09-19 11:42:10 +01:00
|
|
|
<- KEYWORD_STRUCT
|
|
|
|
/ KEYWORD_OPAQUE
|
|
|
|
/ KEYWORD_ENUM (LPAREN expr RPAREN)?
|
|
|
|
/ KEYWORD_UNION (LPAREN (KEYWORD_ENUM (LPAREN expr RPAREN)? / expr) RPAREN)?
|
2023-07-06 11:48:59 +01:00
|
|
|
|
2023-09-19 11:42:10 +01:00
|
|
|
byte_align <- KEYWORD_ALIGN LPAREN expr RPAREN
|
2023-07-06 11:48:59 +01:00
|
|
|
|
|
|
|
IdentifierList <- (doc_comment? IDENTIFIER COMMA)* (doc_comment? IDENTIFIER)?
|
|
|
|
|
2023-09-19 11:42:10 +01:00
|
|
|
switch_prong_list <- (SwitchProng COMMA)* SwitchProng?
|
2023-07-06 11:48:59 +01:00
|
|
|
|
|
|
|
AsmOutputList <- (AsmOutputItem COMMA)* AsmOutputItem?
|
|
|
|
|
|
|
|
AsmInputList <- (AsmInputItem COMMA)* AsmInputItem?
|
|
|
|
|
|
|
|
StringList <- (STRINGLITERAL COMMA)* STRINGLITERAL?
|
|
|
|
|
2023-09-19 11:42:10 +01:00
|
|
|
param_decl_list <- (param_decl COMMA)* param_decl?
|
2023-07-06 11:48:59 +01:00
|
|
|
|
2023-09-19 11:42:10 +01:00
|
|
|
expr_list <- (expr COMMA)* expr?
|
2023-07-06 11:48:59 +01:00
|
|
|
|
|
|
|
eof <- !.
|
|
|
|
bin <- [01]
|
|
|
|
bin_ <- '_'? bin
|
|
|
|
oct <- [0-7]
|
|
|
|
oct_ <- '_'? oct
|
|
|
|
hex <- [0-9a-fA-F]
|
|
|
|
hex_ <- '_'? hex
|
|
|
|
dec <- [0-9]
|
|
|
|
dec_ <- '_'? dec
|
|
|
|
|
|
|
|
bin_int <- bin bin_*
|
|
|
|
oct_int <- oct oct_*
|
|
|
|
dec_int <- dec dec_*
|
|
|
|
hex_int <- hex hex_*
|
|
|
|
|
|
|
|
ox80_oxBF <- [\200-\277]
|
|
|
|
oxF4 <- '\364'
|
|
|
|
ox80_ox8F <- [\200-\217]
|
|
|
|
oxF1_oxF3 <- [\361-\363]
|
|
|
|
oxF0 <- '\360'
|
|
|
|
ox90_0xBF <- [\220-\277]
|
|
|
|
oxEE_oxEF <- [\356-\357]
|
|
|
|
oxED <- '\355'
|
|
|
|
ox80_ox9F <- [\200-\237]
|
|
|
|
oxE1_oxEC <- [\341-\354]
|
|
|
|
oxE0 <- '\340'
|
|
|
|
oxA0_oxBF <- [\240-\277]
|
|
|
|
oxC2_oxDF <- [\302-\337]
|
|
|
|
|
|
|
|
mb_utf8_literal <-
|
|
|
|
oxF4 ox80_ox8F ox80_oxBF ox80_oxBF
|
|
|
|
/ oxF1_oxF3 ox80_oxBF ox80_oxBF ox80_oxBF
|
|
|
|
/ oxF0 ox90_0xBF ox80_oxBF ox80_oxBF
|
|
|
|
/ oxEE_oxEF ox80_oxBF ox80_oxBF
|
|
|
|
/ oxED ox80_ox9F ox80_oxBF
|
|
|
|
/ oxE1_oxEC ox80_oxBF ox80_oxBF
|
|
|
|
/ oxE0 oxA0_oxBF ox80_oxBF
|
|
|
|
/ oxC2_oxDF ox80_oxBF
|
|
|
|
|
|
|
|
ascii_char_not_nl_slash_squote <- [\000-\011\013-\046-\050-\133\135-\177]
|
|
|
|
|
|
|
|
char_escape
|
|
|
|
<- "\\x" hex hex
|
|
|
|
/ "\\u{" hex+ "}"
|
|
|
|
/ "\\" [nr\\t'"]
|
|
|
|
char_char
|
|
|
|
<- mb_utf8_literal
|
|
|
|
/ char_escape
|
|
|
|
/ ascii_char_not_nl_slash_squote
|
|
|
|
|
|
|
|
string_char
|
|
|
|
<- char_escape
|
|
|
|
/ [^\\"\n]
|
|
|
|
|
|
|
|
container_doc_comment <- ('//!' [^\n]* [ \n]*)+
|
|
|
|
doc_comment <- ('///' [^\n]* [ \n]*)+
|
|
|
|
line_comment <- '//' ![!/][^\n]* / '////' [^\n]*
|
|
|
|
line_string <- ("\\\\" [^\n]* [ \n]*)+
|
|
|
|
|
2023-09-19 11:42:10 +01:00
|
|
|
CHAR_LITERAL <- "'" char_char "'"
|
2023-07-06 11:48:59 +01:00
|
|
|
FLOAT
|
2023-09-19 11:42:10 +01:00
|
|
|
<- "0x" hex_int "." hex_int ([pP] [-+]? dec_int)?
|
|
|
|
/ dec_int "." dec_int ([eE] [-+]? dec_int)?
|
|
|
|
/ "0x" hex_int [pP] [-+]? dec_int
|
|
|
|
/ dec_int [eE] [-+]? dec_int
|
2023-07-06 11:48:59 +01:00
|
|
|
INTEGER
|
2023-09-19 11:42:10 +01:00
|
|
|
<- "0b" bin_int
|
|
|
|
/ "0o" oct_int
|
|
|
|
/ "0x" hex_int
|
|
|
|
/ dec_int
|
|
|
|
STRINGLITERALSINGLE <- '"' string_char* '"'
|
2023-07-06 11:48:59 +01:00
|
|
|
STRINGLITERAL
|
|
|
|
<- STRINGLITERALSINGLE
|
2023-09-19 11:42:10 +01:00
|
|
|
/ (line_string)+
|
2023-07-06 11:48:59 +01:00
|
|
|
IDENTIFIER
|
2023-09-19 11:42:10 +01:00
|
|
|
<- !KEYWORD [A-Za-z_] [A-Za-z0-9_]*
|
|
|
|
BUILTINIDENTIFIER <- "@"[A-Za-z_][A-Za-z0-9_]*
|
|
|
|
|
|
|
|
|
|
|
|
AMPERSAND <- '&' ![=]
|
|
|
|
AMPERSANDEQUAL <- '&='
|
|
|
|
ASTERISK <- '*' ![*%=]
|
|
|
|
ASTERISK2 <- '**'
|
|
|
|
ASTERISKEQUAL <- '*='
|
|
|
|
ASTERISKPERCENT <- '*%' ![=]
|
|
|
|
ASTERISKPERCENTEQUAL <- '*%='
|
|
|
|
CARET <- '^' ![=]
|
|
|
|
CARETEQUAL <- '^='
|
|
|
|
COLON <- ':'
|
|
|
|
COMMA <- ','
|
|
|
|
DOT <- '.' ![*.?]
|
|
|
|
DOT2 <- '..' ![.]
|
|
|
|
DOT3 <- '...'
|
|
|
|
DOTASTERISK <- '.*'
|
|
|
|
DOTQUESTIONMARK <- '.?'
|
|
|
|
EQUAL <- '=' ![>=]
|
|
|
|
EQUALEQUAL <- '=='
|
|
|
|
EQUALRARROW <- '=>'
|
|
|
|
EXCLAMATIONMARK <- '!' ![=]
|
|
|
|
EXCLAMATIONMARKEQUAL <- '!='
|
|
|
|
LARROW <- '<' ![<=]
|
|
|
|
LARROW2 <- '<<' ![=]
|
|
|
|
LARROW2EQUAL <- '<<='
|
|
|
|
LARROWEQUAL <- '<='
|
|
|
|
LBRACE <- '{'
|
|
|
|
LBRACKET <- '['
|
|
|
|
LPAREN <- '('
|
|
|
|
MINUS <- '-' ![%=>]
|
|
|
|
MINUSEQUAL <- '-='
|
|
|
|
MINUSPERCENT <- '-%' ![=]
|
|
|
|
MINUSPERCENTEQUAL <- '-%='
|
|
|
|
MINUSRARROW <- '->'
|
|
|
|
PERCENT <- '%' ![=]
|
|
|
|
PERCENTEQUAL <- '%='
|
|
|
|
PIPE <- '|' ![|=]
|
|
|
|
PIPE2 <- '||'
|
|
|
|
PIPEEQUAL <- '|='
|
|
|
|
PLUS <- '+' ![%+=]
|
|
|
|
PLUS2 <- '++'
|
|
|
|
PLUSEQUAL <- '+='
|
|
|
|
PLUSPERCENT <- '+%' ![=]
|
|
|
|
PLUSPERCENTEQUAL <- '+%='
|
|
|
|
LETTERC <- 'c'
|
|
|
|
QUESTIONMARK <- '?'
|
|
|
|
RARROW <- '>' ![>=]
|
|
|
|
RARROW2 <- '>>' ![=]
|
|
|
|
RARROW2EQUAL <- '>>='
|
|
|
|
RARROWEQUAL <- '>='
|
|
|
|
RBRACE <- '}'
|
|
|
|
RBRACKET <- ']'
|
|
|
|
RPAREN <- ')'
|
|
|
|
SEMICOLON <- ';'
|
|
|
|
SLASH <- '/' ![=]
|
|
|
|
SLASHEQUAL <- '/='
|
|
|
|
TILDE <- '~'
|
|
|
|
|
|
|
|
fragment end_of_word <- ![a-zA-Z0-9_]
|
|
|
|
KEYWORD_ALIGN <- 'align' end_of_word
|
|
|
|
KEYWORD_ALLOWZERO <- 'allowzero' end_of_word
|
|
|
|
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
|
|
|
|
KEYWORD_COMPTIME <- 'comptime' end_of_word
|
|
|
|
KEYWORD_CONST <- 'const' end_of_word
|
|
|
|
KEYWORD_CONTINUE <- 'continue' end_of_word
|
|
|
|
KEYWORD_DEFER <- 'defer' end_of_word
|
|
|
|
KEYWORD_ELSE <- 'else' end_of_word
|
|
|
|
KEYWORD_ENUM <- 'enum' end_of_word
|
|
|
|
KEYWORD_ERRDEFER <- 'errdefer' end_of_word
|
|
|
|
KEYWORD_ERROR <- 'error' end_of_word
|
|
|
|
KEYWORD_EXPORT <- 'export' end_of_word
|
|
|
|
KEYWORD_EXTERN <- 'extern' end_of_word
|
|
|
|
KEYWORD_FN <- 'fn' end_of_word
|
|
|
|
KEYWORD_FOR <- 'for' end_of_word
|
|
|
|
KEYWORD_IF <- 'if' end_of_word
|
|
|
|
KEYWORD_INLINE <- 'inline' end_of_word
|
|
|
|
KEYWORD_NOALIAS <- 'noalias' end_of_word
|
|
|
|
KEYWORD_NOSUSPEND <- 'nosuspend' end_of_word
|
|
|
|
KEYWORD_NOINLINE <- 'noinline' end_of_word
|
|
|
|
KEYWORD_OPAQUE <- 'opaque' end_of_word
|
|
|
|
KEYWORD_OR <- 'or' end_of_word
|
|
|
|
KEYWORD_ORELSE <- 'orelse' end_of_word
|
|
|
|
KEYWORD_PACKED <- 'packed' end_of_word
|
|
|
|
KEYWORD_PUB <- 'pub' end_of_word
|
|
|
|
KEYWORD_RESUME <- 'resume' end_of_word
|
|
|
|
KEYWORD_RETURN <- 'return' end_of_word
|
|
|
|
KEYWORD_LINKSECTION <- 'linksection' end_of_word
|
|
|
|
KEYWORD_STRUCT <- 'struct' end_of_word
|
|
|
|
KEYWORD_SUSPEND <- 'suspend' end_of_word
|
|
|
|
KEYWORD_SWITCH <- 'switch' end_of_word
|
|
|
|
KEYWORD_TEST <- 'test' end_of_word
|
|
|
|
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_ALIGN / KEYWORD_ALLOWZERO / KEYWORD_AND / KEYWORD_ANYFRAME
|
|
|
|
/ KEYWORD_ANYTYPE / KEYWORD_ASM / KEYWORD_ASYNC / KEYWORD_AWAIT
|
|
|
|
/ 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
|
|
|
|
/ KEYWORD_INLINE / KEYWORD_NOALIAS / KEYWORD_NOSUSPEND / KEYWORD_NOINLINE
|
|
|
|
/ KEYWORD_OPAQUE / KEYWORD_OR / KEYWORD_ORELSE / KEYWORD_PACKED
|
|
|
|
/ 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
|