/* * Copyright 2023-2024 FalsePattern * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ { parserClass="com.falsepattern.zigbrains.zig.parser.ZigParser" extends="com.intellij.extapi.psi.ASTWrapperPsiElement" extends(".*Expr")=Expr psiClassPrefix="Zig" psiImplClassSuffix="Impl" psiPackage="com.falsepattern.zigbrains.zig.psi" psiImplPackage="com.falsepattern.zigbrains.zig.psi.impl" elementTypeHolderClass="com.falsepattern.zigbrains.zig.psi.ZigTypes" elementTypeClass="com.falsepattern.zigbrains.zig.psi.ZigElementType" tokenTypeClass="com.falsepattern.zigbrains.zig.psi.ZigTokenType" generateTokenAccessors = true tokens=[ //Symbols AMPERSAND='&' AMPERSANDEQUAL='&=' ASTERISK='*' ASTERISK2='**' ASTERISKEQUAL='*=' ASTERISKPERCENT='*%' ASTERISKPERCENTEQUAL='*%=' ASTERISKPIPE='*|' ASTERISKPIPEEQUAL='*|=' CARET='^' CARETEQUAL='^=' COLON=':' COMMA=',' DOT='.' DOT2='..' DOT3='...' DOTASTERISK='.*' DOTQUESTIONMARK='.?' EQUAL='=' EQUALEQUAL='==' EQUALRARROW='=>' EXCLAMATIONMARK='!' EXCLAMATIONMARKEQUAL='!=' LARROW='<' LARROW2='<<' LARROW2EQUAL='<<=' LARROW2PIPE='<<|' LARROW2PIPEEQUAL='<<|=' LARROWEQUAL='<=' LBRACE='{' LBRACKET='[' LPAREN='(' MINUS='-' MINUSEQUAL='-=' MINUSPERCENT='-%' MINUSPERCENTEQUAL='-%=' MINUSPIPE='-|' MINUSPIPEEQUAL='-|=' MINUSRARROW='->' PERCENT='%' PERCENTEQUAL='%=' PIPE='|' PIPE2='||' PIPEEQUAL='|=' PLUS='+' PLUS2='++' PLUSEQUAL='+=' PLUSPERCENT='+%' PLUSPERCENTEQUAL='+%=' PLUSPIPE='+|' PLUSPIPEEQUAL='+|=' QUESTIONMARK='?' RARROW='>' RARROW2='>>' RARROW2EQUAL='>>=' RARROWEQUAL='>=' RBRACE='}' RBRACKET=']' RPAREN=')' SEMICOLON=';' SLASH='/' SLASHEQUAL='/=' TILDE='~' //Keywords KEYWORD_ADDRSPACE='addrspace' KEYWORD_ALIGN='align' KEYWORD_ALLOWZERO='allowzero' KEYWORD_AND='and' KEYWORD_ANYFRAME='anyframe' KEYWORD_ANYTYPE='anytype' KEYWORD_ASM='asm' KEYWORD_ASYNC='async' KEYWORD_AWAIT='await' KEYWORD_BREAK='break' KEYWORD_CALLCONV='callconv' KEYWORD_CATCH='catch' KEYWORD_COMPTIME='comptime' KEYWORD_CONST='const' KEYWORD_CONTINUE='continue' KEYWORD_DEFER='defer' KEYWORD_ELSE='else' KEYWORD_ENUM='enum' KEYWORD_ERRDEFER='errdefer' KEYWORD_ERROR='error' KEYWORD_EXPORT='export' KEYWORD_EXTERN='extern' KEYWORD_FN='fn' KEYWORD_FOR='for' KEYWORD_IF='if' KEYWORD_INLINE='inline' KEYWORD_NOALIAS='noalias' KEYWORD_NOSUSPEND='nosuspend' KEYWORD_NOINLINE='noinline' KEYWORD_OPAQUE='opaque' KEYWORD_OR='or' KEYWORD_ORELSE='orelse' KEYWORD_PACKED='packed' KEYWORD_PUB='pub' KEYWORD_RESUME='resume' KEYWORD_RETURN='return' KEYWORD_LINKSECTION='linksection' KEYWORD_STRUCT='struct' KEYWORD_SUSPEND='suspend' KEYWORD_SWITCH='switch' KEYWORD_TEST='test' KEYWORD_THREADLOCAL='threadlocal' KEYWORD_TRY='try' KEYWORD_UNION='union' KEYWORD_UNREACHABLE='unreachable' KEYWORD_USINGNAMESPACE='usingnamespace' KEYWORD_VAR='var' KEYWORD_VOLATILE='volatile' KEYWORD_WHILE='while' CONTAINER_DOC_COMMENT='container doc comment' DOC_COMMENT='doc comment' LINE_COMMENT='comment' CHAR_LITERAL='character literal' FLOAT='float' INTEGER='integer' STRING_LITERAL_SINGLE='quoted string literal' STRING_LITERAL_MULTI='multiline string literal' IDENTIFIER='identifier' BUILTINIDENTIFIER='builtin identifier' ] } Root ::= CONTAINER_DOC_COMMENT? ContainerMembers? // *** Top level *** private ContainerMembers ::= ContainerDeclarations (ContainerField COMMA)* (ContainerField | ContainerDeclarations)? ContainerDeclarations ::= (TestDecl | ComptimeDecl | DOC_COMMENT? KEYWORD_PUB? Decl)* TestDecl ::= DOC_COMMENT? KEYWORD_TEST (STRING_LITERAL_SINGLE | IDENTIFIER)? Block ComptimeDecl ::= KEYWORD_COMPTIME Block Decl ::= (KEYWORD_EXPORT | KEYWORD_EXTERN STRING_LITERAL_SINGLE? | KEYWORD_INLINE | KEYWORD_NOILINE)? FnProto (SEMICOLON | Block) | (KEYWORD_EXPORT | KEYWORD_EXTERN STRING_LITERAL_SINGLE?)? KEYWORD_THREADLOCAL? GlobalVarDecl | KEYWORD_USINGNAMESPACE Expr SEMICOLON FnProto ::= KEYWORD_FN IDENTIFIER? LPAREN ParamDeclList RPAREN ByteAlign? AddrSpace? LinkSection? CallConv? EXCLAMATIONMARK? TypeExpr VarDeclProto ::= (KEYWORD_CONST | KEYWORD_VAR) IDENTIFIER (COLON TypeExpr)? ByteAlign? AddrSpace? LinkSection? GlobalVarDecl ::= VarDeclProto (EQUAL Expr)? SEMICOLON ContainerField ::= DOC_COMMENT? KEYWORD_COMPTIME? IDENTIFIER (COLON (KEYWORD_ANYTYPE | TypeExpr) ByteAlign?)? (EQUAL Expr)? | DOC_COMMENT? KEYWORD_COMPTIME? (IDENTIFIER COLON)? !KEYWORD_FN TypeExpr ByteAlign? (EQUAL Expr)? // *** Block Level *** Statement ::= KEYWORD_COMPTIME? ComptimeStatement | KEYWORD_NOSUSPEND BlockExprStatement | KEYWORD_DEFER BlockExprStatement | KEYWORD_ERRDEFER Payload? BlockExprStatement | IfStatement | LabeledStatement | SwitchExpr | VarDeclExprStatement ComptimeStatement ::= BlockExpr | VarDeclExprStatement IfStatement ::= IfPrefix BlockExpr ( KEYWORD_ELSE Payload? Statement )? | IfPrefix AssignExpr ( SEMICOLON | KEYWORD_ELSE Payload? Statement ) LabeledStatement ::= BlockLabel? (Block | LoopStatement) LoopStatement ::= KEYWORD_INLINE? (ForStatement | WhileStatement) ForStatement ::= ForPrefix BlockExpr ( KEYWORD_ELSE Statement )? | ForPrefix AssignExpr ( SEMICOLON | KEYWORD_ELSE Statement ) WhileStatement ::= WhilePrefix BlockExpr ( KEYWORD_ELSE Payload? Statement )? | WhilePrefix AssignExpr ( SEMICOLON | KEYWORD_ELSE Payload? Statement) BlockExprStatement ::= BlockExpr | AssignExpr SEMICOLON BlockExpr ::= BlockLabel? Block //An expression, assignment, or any destructure, as a statement. VarDeclExprStatement ::= VarDeclProto (COMMA (VarDeclProto | Expr))* EQUAL Expr SEMICOLON | Expr (AssignOp Expr | (COMMA (VarDeclProto | Expr))+ EQUAL Expr)? SEMICOLON // *** Expression Level *** // An assignment or a destructure whose LHS are all lvalue expressions. AssignExpr ::= Expr (AssignOp Expr | (COMMA Expr)+ EQUAL Expr)? SingleAssignExpr ::= Expr (AssignOp Expr)? Expr ::= BoolOrExpr BoolOrExpr ::= BoolAndExpr (KEYWORD_OR BoolAndExpr)* BoolAndExpr ::= CompareExpr (KEYWORD_AND CompareExpr)* 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 | KEYWORD_BREAK BreakLabel? Expr? | KEYWORD_COMPTIME Expr | KEYWORD_NOSUSPEND Expr | KEYWORD_CONTINUE BreakLabel? | KEYWORD_RESUME Expr | KEYWORD_RETURN Expr? | BlockLabel? LoopExpr | Block | CurlySuffixExpr IfExpr ::= IfPrefix Expr (KEYWORD_ELSE Payload? Expr)? Block ::= LBRACE Statement* RBRACE LoopExpr ::= KEYWORD_INLINE? (ForExpr | WhileExpr) ForExpr ::= ForPrefix Expr (KEYWORD_ELSE Expr)? WhileExpr ::= WhilePrefix Expr (KEYWORD_ELSE Payload? Expr)? CurlySuffixExpr ::= TypeExpr InitList? InitList ::= LBRACE FieldInit (COMMA FieldInit)* COMMA? RBRACE | LBRACE Expr (COMMA Expr)* COMMA? RBRACE | LBRACE RBRACE TypeExpr ::= PrefixTypeOp* ErrorUnionExpr ErrorUnionExpr ::= SuffixExpr (EXCLAMATIONMARK TypeExpr)? SuffixExpr ::= KEYWORD_ASYNC PrimaryTypeExpr SuffixOp* FnCallArguments | PrimaryTypeExpr (SuffixOp | FnCallArguments)* PrimaryTypeExpr ::= BUILTINIDENTIFIER FnCallArguments | CHAR_LITERAL | ContainerDecl | DOT IDENTIFIER | DOT InitList | ErrorSetDecl | FLOAT | FnProto | GroupedExpr | LabeledTypeExpr | IDENTIFIER | IfTypeExpr | INTEGER | KEYWORD_COMPTIME TypeExpr | KEYWORD_ERROR DOT IDENTIFIER | KEYWORD_ANYFRAME | KEYWORD_UNREACHABLE | StringLiteral | SwitchExpr ContainerDecl ::= (KEYWORD_EXTERN | KEYWORD_PACKED)? ContainerDeclAuto ErrorSetDecl ::= KEYWORD_ERROR LBRACE IdentifierList RBRACE GroupedExpr ::= LPAREN Expr RPAREN IfTypeExpr ::= IfPrefix TypeExpr (KEYWORD_ELSE Payload? TypeExpr)? LabeledTypeExpr ::= BlockLabel Block | BlockLabel? LoopTypeExpr LoopTypeExpr ::= KEYWORD_INLINE? (ForTypeExpr | WhileTypeExpr) ForTypeExpr ::= ForPrefix TypeExpr (KEYWORD_ELSE TypeExpr)? WhileTypeExpr ::= WhilePrefix TypeExpr (KEYWORD_ELSE Payload? TypeExpr)? SwitchExpr ::= KEYWORD_SWITCH LPAREN Expr RPAREN LBRACE SwitchProngList RBRACE // *** Assembly *** AsmExpr ::= KEYWORD_ASM KEYWORD_VOLATILE? LPAREN Expr AsmOutput? RPAREN AsmOutput ::= COLON AsmOutputList AsmInput? AsmOutputItem ::= LBRACKET IDENTIFIER RBRACKET StringLiteral LPAREN (MINUSRARROW TypeExpr | IDENTIFIER) RPAREN AsmInput ::= COLON AsmInputList AsmClobbers? AsmInputItem ::= LBRACKET IDENTIFIER RBRACKET StringLiteral LPAREN Expr RPAREN AsmClobbers ::= COLON StringList // *** Helper grammar *** BreakLabel ::= COLON IDENTIFIER BlockLabel ::= IDENTIFIER COLON FieldInit ::= DOT IDENTIFIER EQUAL Expr WhileContinueExpr ::= COLON LPAREN AssignExpr RPAREN LinkSection ::= KEYWORD_LINKSECTION LPAREN Expr RPAREN AddrSpace ::= KEYWORD_ADDRSPACE LPAREN Expr RPAREN // Fn specific CallConv ::= KEYWORD_CALLCONV LPAREN Expr RPAREN ParamDecl ::= DOC_COMMENT? (KEYWORD_NOALIAS | KEYWORD_COMPTIME)? (IDENTIFIER COLON)? ParamType | DOT3 ParamType ::= KEYWORD_ANYTYPE | TypeExpr // Control flow prefixes IfPrefix ::= KEYWORD_IF LPAREN Expr RPAREN PtrPayload? WhilePrefix ::= KEYWORD_WHILE LPAREN Expr RPAREN PtrPayload? WhileContinueExpr? ForRange ::= Expr DOT2 Expr? ForOperand ::= ForRange | Expr ForPrefix ::= KEYWORD_FOR LPAREN (ForOperand COMMA)* ForOperand RPAREN PtrIndexPayload // Payloads Payload ::= PIPE IDENTIFIER PIPE PtrPayload ::= PIPE ASTERISK? IDENTIFIER PIPE PtrIndexPayload ::= PIPE (ASTERISK? IDENTIFIER COMMA)* (ASTERISK? IDENTIFIER) PIPE // Switch specific SwitchProng ::= KEYWORD_INLINE? SwitchCase EQUALRARROW PtrIndexPayload? SingleAssignExpr SwitchCase ::= SwitchItem (COMMA SwitchItem)* COMMA? | KEYWORD_ELSE SwitchItem ::= Expr (DOT3 Expr)? // Operators AssignOp ::= ASTERISKEQUAL | ASTERISKPIPEEQUAL | SLASHEQUAL | PERCENTEQUAL | PLUSEQUAL | PLUSPIPEEQUAL | MINUSEQUAL | MINUSPIPEEQUAL | LARROW2EQUAL | LARROW2PIPEEQUAL | RARROW2EQUAL | AMPERSANDEQUAL | CARETEQUAL | PIPEEQUAL | ASTERISKPERCENTEQUAL | PLUSPERCENTEQUAL | MINUSPERCENTEQUAL | EQUAL CompareOp ::= EQUALEQUAL | EXCLAMATIONMARKEQUAL | LARROW | RARROW | LARROWEQUAL | RARROWEQUAL BitwiseOp ::= AMPERSAND | CARET | PIPE | KEYWORD_ORELSE | KEYWORD_CATCH Payload? BitShiftOp ::= LARROW2 | RARROW2 | LARROW2PIPE AdditionOp ::= PLUS | MINUS | PLUS2 | PLUSPERCENT | MINUSPERCENT | PLUSPIPE | MINUSPIPE MultiplyOp ::= PIPE2 | ASTERISK | SLASH | PERCENT | ASTERISK2 | ASTERISKPERCENT | ASTERISKPIPE PrefixOp ::= EXCLAMATIONMARK | MINUS | TILDE | MINUSPERCENT | AMPERSAND | KEYWORD_TRY | KEYWORD_AWAIT PrefixTypeOp ::= QUESTIONMARK | KEYWORD_ANYFRAME MINUSRARROW | SliceTypeStart (ByteAlign | AddrSpace | KEYWORD_CONST | KEYWORD_VOLATILE | KEYWORD_ALLOWZERO)* | PtrTypeStart (AddrSpace | KEYWORD_ALIGN LPAREN Expr (COLON Expr COLON Expr)? RPAREN | KEYWORD_CONST | KEYWORD_VOLATILE | KEYWORD_ALLOWZERO)* | ArrayTypeStart SuffixOp ::= LBRACKET Expr (DOT2 (Expr? (COLON Expr)?)?)? RBRACKET | DOT IDENTIFIER | DOTASTERISK | DOTQUESTIONMARK FnCallArguments ::= LPAREN ExprList RPAREN // Ptr specific SliceTypeStart ::= LBRACKET (COLON Expr)? RBRACKET PtrTypeStart ::= ASTERISK | ASTERISK2 | LBRACKET ASTERISK ("c" | COLON Expr)? RBRACKET ArrayTypeStart ::= LBRACKET Expr (COLON Expr)? RBRACKET // ContainerDecl specific ContainerDeclAuto ::= ContainerDeclType LBRACE CONTAINER_DOC_COMMENT? ContainerMembers RBRACE ContainerDeclType ::= KEYWORD_STRUCT (LPAREN Expr RPAREN)? | KEYWORD_OPAQUE | KEYWORD_ENUM (LPAREN Expr RPAREN)? | KEYWORD_UNION (LPAREN (KEYWORD_ENUM (LPAREN Expr RPAREN)? | Expr) RPAREN)? // Alignment ByteAlign ::= KEYWORD_ALIGN LPAREN Expr RPAREN // Lists IdentifierList ::= (DOC_COMMENT? IDENTIFIER COMMA)* (DOC_COMMENT? IDENTIFIER)? SwitchProngList ::= (SwitchProng COMMA)* SwitchProng? AsmOutputList ::= (AsmOutputItem COMMA)* AsmOutputItem? AsmInputList ::= (AsmInputItem COMMA)* AsmInputItem? StringList ::= (StringLiteral COMMA)* StringLiteral? ParamDeclList ::= (ParamDecl COMMA)* ParamDecl? ExprList ::= (Expr COMMA)* Expr? StringLiteral ::= STRING_LITERAL_SINGLE | STRING_LITERAL_MULTI