%start Veryl
%title "Veryl grammar"
%comment "Empty grammar generated by `parol`"
%user_type VerylToken = crate::veryl_token::VerylToken
%user_type Token = crate::veryl_token::Token
%%
// ----------------------------------------------------------------------------
// Terminal
// ----------------------------------------------------------------------------
// Longest match should be first
CommentsTerm : "(?:(?:(?://.*(?:\r\n|\r|\n|$))|(?:(?ms)/\u{2a}.*?\u{2a}/))\s*)+" : Token;
StringLiteralTerm : "\u{0022}(?:\\[\u{0022}\\/bfnrt]|u[0-9a-fA-F]{4}|[^\u{0022}\\\u0000-\u001F])*\u{0022}": Token;
ExponentTerm : /[0-9]+(?:_[0-9]+)*\.[0-9]+(?:_[0-9]+)*[eE][+-]?[0-9]+(?:_[0-9]+)*/ : Token;
FixedPointTerm : /[0-9]+(?:_[0-9]+)*\.[0-9]+(?:_[0-9]+)*/ : Token;
BasedTerm : /[0-9]+(?:_[0-9]+)*'[bodh][0-9a-fA-FxzXZ]+(?:_[0-9a-fA-FxzXZ]+)*/ : Token;
BaseLessTerm : /[0-9]+(?:_[0-9]+)*/ : Token;
AllBitTerm : /'[01xzXZ]/ : Token;
MinusColonTerm : '-:' : Token;
MinusGTTerm : '->' : Token;
PlusColonTerm : '+:' : Token;
AssignmentOperatorTerm: "\+=|-=|\*=|/=|%=|&=|\|=|\^=|<<=|>>=|<<<=|>>>=" : Token;
Operator11Term : "\*\*" : Token;
Operator10Term : "/|%" : Token;
Operator09Term : "\+|-" : Token;
Operator08Term : "<<<|>>>|<<|>>" : Token;
Operator07Term : "<=|>=|<:|>:" : Token;
Operator06Term : "===|==\?|!==|!=\?|==|!=" : Token;
Operator02Term : "&&" : Token;
Operator01Term : "\|\|" : Token;
Operator05Term : "&" : Token;
Operator04Term : "\^~|\^|~\^" : Token;
Operator03Term : "\|" : Token;
UnaryOperatorTerm : "~&|~\||!|~" : Token;
ColonColonTerm : '::' : Token;
ColonTerm : ':' : Token;
CommaTerm : ',' : Token;
DollarTerm : '$' : Token;
DotDotTerm : '..' : Token;
DotTerm : '.' : Token;
EquTerm : '=' : Token;
HashTerm : '#' : Token;
LAngleTerm : '<' : Token;
LBraceTerm : '{' : Token;
LBracketTerm : '[' : Token;
LParenTerm : '(' : Token;
RAngleTerm : '>' : Token;
RBraceTerm : '}' : Token;
RBracketTerm : ']' : Token;
RParenTerm : ')' : Token;
SemicolonTerm : ';' : Token;
StarTerm : '*' : Token;
AlwaysCombTerm : /\balways_comb\b/ : Token;
AlwaysFfTerm : /\balways_ff\b/ : Token;
AssignTerm : /\bassign\b/ : Token;
AsyncHighTerm : /\basync_high\b/ : Token;
AsyncLowTerm : /\basync_low\b/ : Token;
AsTerm : /\bas\b/ : Token;
BitTerm : /\bbit\b/ : Token;
CaseTerm : /\bcase\b/ : Token;
DefaultTerm : /\bdefault\b/ : Token;
ElseTerm : /\belse\b/ : Token;
EnumTerm : /\benum\b/ : Token;
ExportTerm : /\bexport\b/ : Token;
F32Term : /\bf32\b/ : Token;
F64Term : /\bf64\b/ : Token;
ForTerm : /\bfor\b/ : Token;
FunctionTerm : /\bfunction\b/ : Token;
I32Term : /\bi32\b/ : Token;
I64Term : /\bi64\b/ : Token;
IfResetTerm : /\bif_reset\b/ : Token;
IfTerm : /\bif\b/ : Token;
ImportTerm : /\bimport\b/ : Token;
InoutTerm : /\binout\b/ : Token;
InputTerm : /\binput\b/ : Token;
InstTerm : /\binst\b/ : Token;
InterfaceTerm : /\binterface\b/ : Token;
InTerm : /\bin\b/ : Token;
LocalparamTerm : /\blocalparam\b/ : Token;
LogicTerm : /\blogic\b/ : Token;
ModportTerm : /\bmodport\b/ : Token;
ModuleTerm : /\bmodule\b/ : Token;
NegedgeTerm : /\bnegedge\b/ : Token;
OutputTerm : /\boutput\b/ : Token;
PackageTerm : /\bpackage\b/ : Token;
ParameterTerm : /\bparameter\b/ : Token;
PosedgeTerm : /\bposedge\b/ : Token;
RefTerm : /\bref\b/ : Token;
RepeatTerm : /\brepeat\b/ : Token;
ReturnTerm : /\breturn\b/ : Token;
SignedTerm : /\bsigned\b/ : Token;
StepTerm : /\bstep\b/ : Token;
StringTerm : /\bstring\b/ : Token;
StructTerm : /\bstruct\b/ : Token;
SyncHighTerm : /\bsync_high\b/ : Token;
SyncLowTerm : /\bsync_low\b/ : Token;
TriTerm : /\btri\b/ : Token;
TypeTerm : /\btype\b/ : Token;
U32Term : /\bu32\b/ : Token;
U64Term : /\bu64\b/ : Token;
VarTerm : /\bvar\b/ : Token;
IdentifierTerm : /[a-zA-Z_][0-9a-zA-Z_]*/ : Token;
// ----------------------------------------------------------------------------
// Token
// ----------------------------------------------------------------------------
Comments: [ CommentsTerm ];
StartToken: Comments;
StringLiteralToken: StringLiteralTerm: Token Comments;
ExponentToken : ExponentTerm : Token Comments;
FixedPointToken: FixedPointTerm: Token Comments;
BasedToken : BasedTerm : Token Comments;
BaseLessToken : BaseLessTerm : Token Comments;
AllBitToken : AllBitTerm : Token Comments;
AssignmentOperatorToken: AssignmentOperatorTerm: Token Comments;
Operator01Token : Operator01Term : Token Comments;
Operator02Token : Operator02Term : Token Comments;
Operator03Token : Operator03Term : Token Comments;
Operator04Token : Operator04Term : Token Comments;
Operator05Token : Operator05Term : Token Comments;
Operator06Token : Operator06Term : Token Comments;
Operator07Token : Operator07Term : Token Comments;
Operator08Token : Operator08Term : Token Comments;
Operator09Token : Operator09Term : Token Comments;
Operator10Token : Operator10Term : Token Comments;
Operator11Token : Operator11Term : Token Comments;
UnaryOperatorToken : UnaryOperatorTerm : Token Comments;
ColonToken : ColonTerm : Token Comments;
ColonColonToken: ColonColonTerm: Token Comments;
CommaToken : CommaTerm : Token Comments;
DollarToken : DollarTerm : Token Comments;
DotDotToken : DotDotTerm : Token Comments;
DotToken : DotTerm : Token Comments;
EquToken : EquTerm : Token Comments;
HashToken : HashTerm : Token Comments;
LAngleToken : LAngleTerm : Token Comments;
LBraceToken : LBraceTerm : Token Comments;
LBracketToken : LBracketTerm : Token Comments;
LParenToken : LParenTerm : Token Comments;
MinusColonToken: MinusColonTerm: Token Comments;
MinusGTToken : MinusGTTerm : Token Comments;
PlusColonToken : PlusColonTerm : Token Comments;
RAngleToken : RAngleTerm : Token Comments;
RBraceToken : RBraceTerm : Token Comments;
RBracketToken : RBracketTerm : Token Comments;
RParenToken : RParenTerm : Token Comments;
SemicolonToken : SemicolonTerm : Token Comments;
StarToken : StarTerm : Token Comments;
AlwaysCombToken: AlwaysCombTerm: Token Comments;
AlwaysFfToken : AlwaysFfTerm : Token Comments;
AsToken : AsTerm : Token Comments;
AssignToken : AssignTerm : Token Comments;
AsyncHighToken : AsyncHighTerm : Token Comments;
AsyncLowToken : AsyncLowTerm : Token Comments;
BitToken : BitTerm : Token Comments;
CaseToken : CaseTerm : Token Comments;
DefaultToken : DefaultTerm : Token Comments;
ElseToken : ElseTerm : Token Comments;
EnumToken : EnumTerm : Token Comments;
ExportToken : ExportTerm : Token Comments;
F32Token : F32Term : Token Comments;
F64Token : F64Term : Token Comments;
ForToken : ForTerm : Token Comments;
FunctionToken : FunctionTerm : Token Comments;
I32Token : I32Term : Token Comments;
I64Token : I64Term : Token Comments;
IfResetToken : IfResetTerm : Token Comments;
IfToken : IfTerm : Token Comments;
ImportToken : ImportTerm : Token Comments;
InoutToken : InoutTerm : Token Comments;
InputToken : InputTerm : Token Comments;
InstToken : InstTerm : Token Comments;
InterfaceToken : InterfaceTerm : Token Comments;
InToken : InTerm : Token Comments;
LocalparamToken: LocalparamTerm: Token Comments;
LogicToken : LogicTerm : Token Comments;
ModportToken : ModportTerm : Token Comments;
ModuleToken : ModuleTerm : Token Comments;
NegedgeToken : NegedgeTerm : Token Comments;
OutputToken : OutputTerm : Token Comments;
PackageToken : PackageTerm : Token Comments;
ParameterToken : ParameterTerm : Token Comments;
PosedgeToken : PosedgeTerm : Token Comments;
RefToken : RefTerm : Token Comments;
RepeatToken : RepeatTerm : Token Comments;
ReturnToken : ReturnTerm : Token Comments;
SignedToken : SignedTerm : Token Comments;
StepToken : StepTerm : Token Comments;
StringToken : StringTerm : Token Comments;
StructToken : StructTerm : Token Comments;
SyncHighToken : SyncHighTerm : Token Comments;
SyncLowToken : SyncLowTerm : Token Comments;
TriToken : TriTerm : Token Comments;
TypeToken : TypeTerm : Token Comments;
U32Token : U32Term : Token Comments;
U64Token : U64Term : Token Comments;
VarToken : VarTerm : Token Comments;
IdentifierToken: IdentifierTerm: Token Comments;
// ----------------------------------------------------------------------------
// VerylToken
// ----------------------------------------------------------------------------
// Start
Start: StartToken: VerylToken;
// StringLiteral
StringLiteral: StringLiteralToken: VerylToken;
// Number
Exponent : ExponentToken : VerylToken;
FixedPoint: FixedPointToken: VerylToken;
Based : BasedToken : VerylToken;
BaseLess : BaseLessToken : VerylToken;
AllBit : AllBitToken : VerylToken;
// Operator
AssignmentOperator: AssignmentOperatorToken: VerylToken;
Operator01 : Operator01Token : VerylToken;
Operator02 : Operator02Token : VerylToken;
Operator03 : Operator03Token : VerylToken;
Operator04 : Operator04Token : VerylToken;
Operator05 : Operator05Token : VerylToken;
Operator06 : Operator06Token : VerylToken;
Operator07 : Operator07Token : VerylToken;
Operator08 : Operator08Token : VerylToken;
Operator09 : Operator09Token : VerylToken;
Operator10 : Operator10Token : VerylToken;
Operator11 : Operator11Token : VerylToken;
UnaryOperator : UnaryOperatorToken : VerylToken;
// Symbol
Colon : ColonToken : VerylToken;
ColonColon: ColonColonToken: VerylToken;
Comma : CommaToken : VerylToken;
Dollar : DollarToken : VerylToken;
DotDot : DotDotToken : VerylToken;
Dot : DotToken : VerylToken;
Equ : EquToken : VerylToken;
Hash : HashToken : VerylToken;
LAngle : LAngleToken : VerylToken;
LBrace : LBraceToken : VerylToken;
LBracket : LBracketToken : VerylToken;
LParen : LParenToken : VerylToken;
MinusColon: MinusColonToken: VerylToken;
MinusGT : MinusGTToken : VerylToken;
PlusColon : PlusColonToken : VerylToken;
RAngle : RAngleToken : VerylToken;
RBrace : RBraceToken : VerylToken;
RBracket : RBracketToken : VerylToken;
RParen : RParenToken : VerylToken;
Semicolon : SemicolonToken : VerylToken;
Star : StarToken : VerylToken;
// Keyword
AlwaysComb: AlwaysCombToken: VerylToken;
AlwaysFf : AlwaysFfToken : VerylToken;
As : AsToken : VerylToken;
Assign : AssignToken : VerylToken;
AsyncHigh : AsyncHighToken : VerylToken;
AsyncLow : AsyncLowToken : VerylToken;
Bit : BitToken : VerylToken;
Case : CaseToken : VerylToken;
Defaul : DefaultToken : VerylToken; // avoid to conflict with Rust's Default trait
Else : ElseToken : VerylToken;
Enum : EnumToken : VerylToken;
Export : ExportToken : VerylToken;
F32 : F32Token : VerylToken;
F64 : F64Token : VerylToken;
For : ForToken : VerylToken;
Function : FunctionToken : VerylToken;
I32 : I32Token : VerylToken;
I64 : I64Token : VerylToken;
If : IfToken : VerylToken;
IfReset : IfResetToken : VerylToken;
Import : ImportToken : VerylToken;
In : InToken : VerylToken;
Inout : InoutToken : VerylToken;
Input : InputToken : VerylToken;
Inst : InstToken : VerylToken;
Interface : InterfaceToken : VerylToken;
Localparam: LocalparamToken: VerylToken;
Logic : LogicToken : VerylToken;
Modport : ModportToken : VerylToken;
Module : ModuleToken : VerylToken;
Negedge : NegedgeToken : VerylToken;
Output : OutputToken : VerylToken;
Package : PackageToken : VerylToken;
Parameter : ParameterToken : VerylToken;
Posedge : PosedgeToken : VerylToken;
Ref : RefToken : VerylToken;
Repeat : RepeatToken : VerylToken;
Return : ReturnToken : VerylToken;
Signed : SignedToken : VerylToken;
Step : StepToken : VerylToken;
Strin : StringToken : VerylToken; // avoid to conflict with Rust's String struct
Struct : StructToken : VerylToken;
SyncHigh : SyncHighToken : VerylToken;
SyncLow : SyncLowToken : VerylToken;
Tri : TriToken : VerylToken;
Type : TypeToken : VerylToken;
U32 : U32Token : VerylToken;
U64 : U64Token : VerylToken;
Var : VarToken : VerylToken;
// Identifier
Identifier: IdentifierToken: VerylToken;
// ----------------------------------------------------------------------------
// Number
// ----------------------------------------------------------------------------
Number: IntegralNumber
| RealNumber
;
IntegralNumber: Based
| BaseLess
| AllBit
;
RealNumber: FixedPoint
| Exponent
;
// ----------------------------------------------------------------------------
// Complex Identifier
// ----------------------------------------------------------------------------
HierarchicalIdentifier: Identifier { Range } { Dot Identifier { Range } };
ScopedIdentifier : Identifier { ColonColon Identifier };
ExpressionIdentifier : [ Dollar ] Identifier ( ColonColon Identifier { ColonColon Identifier } | ( { Range } { Dot Identifier { Range } } ) );
// ----------------------------------------------------------------------------
// Expression
// ----------------------------------------------------------------------------
Expression : Expression01 { Operator01 Expression01 };
Expression01: Expression02 { Operator02 Expression02 };
Expression02: Expression03 { Operator03 Expression03 };
Expression03: Expression04 { Operator04 Expression04 };
Expression04: Expression05 { Operator05 Expression05 };
Expression05: Expression06 { Operator06 Expression06 };
Expression06: Expression07 { Operator07 Expression07 };
Expression07: Expression08 { Operator08 Expression08 };
Expression08: Expression09 { Operator09 Expression09 };
Expression09: Expression10 { ( Operator10 | Star ) Expression10 };
Expression10: Expression11 { Operator11 Expression11 };
Expression11: Expression12 { As ScopedIdentifier };
Expression12: { ( UnaryOperator | Operator09 | Operator05 | Operator03 | Operator04 ) } Factor;
Factor: Number
| ExpressionIdentifier [ FunctionCall ]
| LParen Expression RParen
| LBrace ConcatenationList RBrace
| IfExpression
| CaseExpression
| StringLiteral
;
FunctionCall: LParen [ ArgumentList ] RParen;
ArgumentList: ArgumentItem { Comma ArgumentItem } [ Comma ];
ArgumentItem: Expression;
ConcatenationList: ConcatenationItem { Comma ConcatenationItem } [ Comma ];
ConcatenationItem: Expression [ Repeat Expression ];
IfExpression: If Expression LBrace Expression RBrace { Else If Expression LBrace Expression RBrace } Else LBrace Expression RBrace;
CaseExpression: Case Expression LBrace Expression Colon Expression Comma { Expression Colon Expression Comma } Defaul Colon Expression [ Comma ] RBrace;
TypeExpression: ScalarType
| Type LParen Expression RParen
;
// ----------------------------------------------------------------------------
// Range / Width / Array
// ----------------------------------------------------------------------------
Range: LBracket Expression [ RangeOperator Expression ] RBracket;
RangeOperator: Colon
| PlusColon
| MinusColon
| Step
;
Width: LAngle Expression { Comma Expression } RAngle;
Array: LBracket Expression { Comma Expression } RBracket;
// ----------------------------------------------------------------------------
// ScalarType / ArrayType
// ----------------------------------------------------------------------------
FixedType: U32 | U64 | I32 | I64 | F32 | F64 | Strin;
VariableType: ( Logic | Bit | ScopedIdentifier ) [ Width ];
TypeModifier: Tri | Signed;
ScalarType: { TypeModifier } ( VariableType | FixedType );
ArrayType: ScalarType [ Array ];
// ----------------------------------------------------------------------------
// Statement
// ----------------------------------------------------------------------------
Statement: AssignmentStatement
| IfStatement
| IfResetStatement
| ReturnStatement
| ForStatement
| CaseStatement
;
AssignmentStatement: HierarchicalIdentifier ( Equ | AssignmentOperator ) Expression Semicolon;
IfStatement: If Expression LBrace { Statement } RBrace { Else If Expression LBrace { Statement } RBrace } [ Else LBrace { Statement } RBrace ];
IfResetStatement: IfReset LBrace { Statement } RBrace { Else If Expression LBrace { Statement } RBrace } [ Else LBrace { Statement } RBrace ];
ReturnStatement: Return Expression Semicolon;
ForStatement: For Identifier Colon ScalarType In Expression DotDot Expression [ Step AssignmentOperator Expression ] LBrace { Statement } RBrace;
CaseStatement: Case Expression LBrace { CaseItem } RBrace;
CaseItem: ( Expression | Defaul ) Colon ( Statement | LBrace { Statement } RBrace );
// ----------------------------------------------------------------------------
// Attribute
// ----------------------------------------------------------------------------
Attribute: Hash LBracket Identifier [ LParen AttributeList RParen ] RBracket;
AttributeList: AttributeItem { Comma AttributeItem } [ Comma ];
AttributeItem: Identifier
| StringLiteral
;
// ----------------------------------------------------------------------------
// Declaration
// ----------------------------------------------------------------------------
VarDeclaration: Var Identifier Colon ArrayType [ Equ Expression ] Semicolon;
LocalparamDeclaration: Localparam Identifier Colon ( ArrayType Equ Expression | Type Equ TypeExpression ) Semicolon;
AlwaysFfDeclaration: AlwaysFf LParen AlwaysFfClock [ Comma AlwaysFfReset ] RParen LBrace { Statement } RBrace;
AlwaysFfClock: [ Posedge | Negedge ] HierarchicalIdentifier;
AlwaysFfReset: [ AsyncLow | AsyncHigh | SyncLow | SyncHigh ] HierarchicalIdentifier;
AlwaysCombDeclaration: AlwaysComb LBrace { Statement } RBrace;
AssignDeclaration: Assign HierarchicalIdentifier Equ Expression Semicolon;
ModportDeclaration: Modport Identifier LBrace ModportList RBrace;
ModportList: ModportGroup { Comma ModportGroup } [ Comma ];
ModportGroup: [ Attribute ] ( LBrace ModportList RBrace | ModportItem );
ModportItem: Identifier Colon Direction;
EnumDeclaration: Enum Identifier Colon ScalarType LBrace EnumList RBrace;
EnumList: EnumGroup { Comma EnumGroup } [ Comma ];
EnumGroup: [ Attribute ] ( LBrace EnumList RBrace | EnumItem );
EnumItem: Identifier [ Equ Expression ];
StructDeclaration: Struct Identifier LBrace StructList RBrace;
StructList: StructGroup { Comma StructGroup } [ Comma ];
StructGroup: [ Attribute ] ( LBrace StructList RBrace | StructItem );
StructItem: Identifier Colon ScalarType;
// ----------------------------------------------------------------------------
// InstDeclaration
// ----------------------------------------------------------------------------
InstDeclaration: Inst Identifier Colon ScopedIdentifier [ Array ] [ InstParameter ] [ LParen [ InstPortList ] RParen ] Semicolon;
InstParameter: Hash LParen [ InstParameterList ] RParen;
InstParameterList: InstParameterGroup { Comma InstParameterGroup } [ Comma ];
InstParameterGroup: [ Attribute ] ( LBrace InstParameterList RBrace | InstParameterItem );
InstParameterItem: Identifier [ Colon Expression ];
InstPortList: InstPortGroup { Comma InstPortGroup } [ Comma ];
InstPortGroup: [ Attribute ] ( LBrace InstPortList RBrace | InstPortItem );
InstPortItem: Identifier [ Colon Expression ];
// ----------------------------------------------------------------------------
// WithParameter
// ----------------------------------------------------------------------------
WithParameter: Hash LParen [ WithParameterList ] RParen;
WithParameterList: WithParameterGroup { Comma WithParameterGroup } [ Comma ];
WithParameterGroup: [ Attribute ] ( LBrace WithParameterList RBrace | WithParameterItem );
WithParameterItem: ( Parameter | Localparam ) Identifier Colon ( ArrayType Equ Expression | Type Equ TypeExpression );
// ----------------------------------------------------------------------------
// PortDeclaration
// ----------------------------------------------------------------------------
PortDeclaration: LParen [ PortDeclarationList ] RParen;
PortDeclarationList: PortDeclarationGroup { Comma PortDeclarationGroup } [ Comma ];
PortDeclarationGroup: [ Attribute ] ( LBrace PortDeclarationList RBrace | PortDeclarationItem );
PortDeclarationItem: Identifier Colon ( Direction ArrayType | Interface [ Array ] );
Direction: Input
| Output
| Inout
| Ref
| Modport
;
// ----------------------------------------------------------------------------
// Function
// ----------------------------------------------------------------------------
FunctionDeclaration: Function Identifier [ WithParameter ] [ PortDeclaration ] MinusGT ScalarType LBrace { FunctionItem } RBrace;
FunctionItem: VarDeclaration
| Statement
;
// ----------------------------------------------------------------------------
// Import / Export
// ----------------------------------------------------------------------------
ImportDeclaration: Import Identifier ColonColon ( Identifier | Star ) Semicolon;
ExportDeclaration: Export ( Identifier | Star ) ColonColon ( Identifier | Star ) Semicolon;
// ----------------------------------------------------------------------------
// Module
// ----------------------------------------------------------------------------
ModuleDeclaration: Module Identifier [ WithParameter ] [ PortDeclaration ] LBrace { ModuleGroup } RBrace;
ModuleIfDeclaration: If Expression ModuleNamedBlock { Else If Expression ModuleOptionalNamedBlock } [ Else ModuleOptionalNamedBlock ];
ModuleForDeclaration: For Identifier In Expression DotDot Expression [ Step AssignmentOperator Expression ] ModuleNamedBlock;
ModuleNamedBlock: Colon Identifier LBrace { ModuleGroup } RBrace;
ModuleOptionalNamedBlock: [ Colon Identifier ] LBrace { ModuleGroup } RBrace;
ModuleGroup: [ Attribute ] ( LBrace { ModuleGroup } RBrace | ModuleItem );
ModuleItem: VarDeclaration
| InstDeclaration
| LocalparamDeclaration
| AlwaysFfDeclaration
| AlwaysCombDeclaration
| AssignDeclaration
| FunctionDeclaration
| ModuleIfDeclaration
| ModuleForDeclaration
| EnumDeclaration
| StructDeclaration
| ModuleNamedBlock
| ImportDeclaration
;
// ----------------------------------------------------------------------------
// Interface
// ----------------------------------------------------------------------------
InterfaceDeclaration: Interface Identifier [ WithParameter ] LBrace { InterfaceGroup } RBrace;
InterfaceIfDeclaration: If Expression InterfaceNamedBlock { Else If Expression InterfaceOptionalNamedBlock } [ Else InterfaceOptionalNamedBlock ];
InterfaceForDeclaration: For Identifier In Expression DotDot Expression [ Step AssignmentOperator Expression ] InterfaceNamedBlock;
InterfaceNamedBlock: Colon Identifier LBrace { InterfaceGroup } RBrace;
InterfaceOptionalNamedBlock: [ Colon Identifier ] LBrace { InterfaceGroup } RBrace;
InterfaceGroup: [ Attribute ] ( LBrace { InterfaceGroup } RBrace | InterfaceItem );
InterfaceItem: VarDeclaration
| LocalparamDeclaration
| ModportDeclaration
| InterfaceIfDeclaration
| InterfaceForDeclaration
| EnumDeclaration
| StructDeclaration
| InterfaceNamedBlock
| FunctionDeclaration
| ImportDeclaration
;
// ----------------------------------------------------------------------------
// Package
// ----------------------------------------------------------------------------
PackageDeclaration: Package Identifier LBrace { PackageGroup } RBrace;
PackageGroup: [ Attribute ] ( LBrace { PackageGroup } RBrace | PackageItem );
PackageItem: VarDeclaration
| LocalparamDeclaration
| EnumDeclaration
| StructDeclaration
| FunctionDeclaration
| ImportDeclaration
| ExportDeclaration
;
// ----------------------------------------------------------------------------
// Description
// ----------------------------------------------------------------------------
DescriptionGroup: [ Attribute ] ( LBrace { DescriptionGroup } RBrace | DescriptionItem );
DescriptionItem: ModuleDeclaration
| InterfaceDeclaration
| PackageDeclaration
| ImportDeclaration
;
// ----------------------------------------------------------------------------
// SourceCode
// ----------------------------------------------------------------------------
Veryl: Start { DescriptionGroup };