構文

Veryl のパーサはパーサジェネレータ parolを使っています。以下の parol の構文定義が正式な構文です。


%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

%on HashLBracketTerm %push Attr
%on ColonColonLAngleTerm %push Generic
%on EscapedRBraceTerm %pop
%on TripleLBraceTerm %push Embed

%scanner Embed {
    %auto_newline_off
    %auto_ws_off

    %on LBraceTerm %push EmbedInner
    %on EscapedLBraceTerm %push INITIAL
    %on TripleRBraceTerm %pop
}

%scanner EmbedInner {
    %auto_newline_off
    %auto_ws_off

    %on LBraceTerm %push EmbedInner
    %on EscapedLBraceTerm %push INITIAL
    %on RBraceTerm %pop
}

%scanner Generic {
    %on ColonColonLAngleTerm %push Generic
    %on RAngleTerm %pop
}

%scanner Attr {
    %on RBracketTerm %pop
}

%%

// ----------------------------------------------------------------------------
// Terminal
// ----------------------------------------------------------------------------

// Longest match should be first

CommentsTerm          : <INITIAL, Generic,                    Attr>"(?:(?:(?://.*(?:\r\n|\r|\n)?)|(?:(?ms)/\*/?([^/]|[^*]/)*\*/))\s*)+"                  : Token;
StringLiteralTerm     : <INITIAL, Generic,                    Attr>"\u{0022}(?:\\[\u{0022}\\/bfnrt]|u[0-9a-fA-F]{4}|[^\u{0022}\\\u0000-\u001F])*\u{0022}": Token;
ExponentTerm          : <INITIAL, Generic                         >/[0-9]+(?:_[0-9]+)*\.[0-9]+(?:_[0-9]+)*[eE][+-]?[0-9]+(?:_[0-9]+)*/                   : Token;
FixedPointTerm        : <INITIAL, Generic                         >/[0-9]+(?:_[0-9]+)*\.[0-9]+(?:_[0-9]+)*/                                              : Token;
BasedTerm             : <INITIAL, Generic                         >/(?:[0-9]+(?:_[0-9]+)*)?'s?[bodh][0-9a-fA-FxzXZ]+(?:_[0-9a-fA-FxzXZ]+)*/              : Token;
AllBitTerm            : <INITIAL, Generic                         >/(?:[0-9]+(?:_[0-9]+)*)?'[01xzXZ]/                                                    : Token;
BaseLessTerm          : <INITIAL, Generic                         >/[0-9]+(?:_[0-9]+)*/                                                                  : Token;
MinusColonTerm        : <INITIAL                                  >'-:'                                                                                  : Token;
MinusGTTerm           : <INITIAL                                  >'->'                                                                                  : Token;
LTMinusTerm           : <INITIAL                                  >'<-'                                                                                  : Token;
PlusColonTerm         : <INITIAL                                  >'+:'                                                                                  : Token;
AssignmentOperatorTerm: <INITIAL                                  >"\+=|-=|\*=|/=|%=|&=|\|=|\^=|<<=|>>=|<<<=|>>>="                                       : Token;
DiamondOperatorTerm   : <INITIAL                                  >'<>'                                                                                  : Token;
Operator12Term        : <INITIAL                                  >"\*\*"                                                                                : Token;
Operator11Term        : <INITIAL                                  >"/|%"                                                                                 : Token;
Operator10Term        : <INITIAL                                  >"\+|-"                                                                                : Token;
Operator09Term        : <INITIAL                                  >"<<<|>>>|<<|>>"                                                                       : Token;
Operator08Term        : <INITIAL                                  >"<=|>=|<:|>:"                                                                         : Token;
Operator07Term        : <INITIAL                                  >"===|==\?|!==|!=\?|==|!="                                                             : Token;
Operator03Term        : <INITIAL                                  >"&&"                                                                                  : Token;
Operator02Term        : <INITIAL                                  >"\|\|"                                                                                : Token;
Operator06Term        : <INITIAL                                  >"&"                                                                                   : Token;
Operator05Term        : <INITIAL                                  >"\^~|\^|~\^"                                                                          : Token;
Operator04Term        : <INITIAL                                  >"\|"                                                                                  : Token;
UnaryOperatorTerm     : <INITIAL                                  >"~&|~\||!|~"                                                                          : Token;
ColonColonLAngleTerm  : <INITIAL, Generic                         >'::<'                                                                                 : Token;
ColonColonTerm        : <INITIAL, Generic                         >'::'                                                                                  : Token;
ColonTerm             : <INITIAL, Generic                         >':'                                                                                   : Token;
CommaTerm             : <INITIAL, Generic,                    Attr>','                                                                                   : Token;
DotDotEquTerm         : <INITIAL, Generic                         >'..='                                                                                 : Token;
DotDotTerm            : <INITIAL, Generic                         >'..'                                                                                  : Token;
DotTerm               : <INITIAL, Generic                         >'.'                                                                                   : Token;
EquTerm               : <INITIAL, Generic                         >'='                                                                                   : Token;
HashLBracketTerm      : <INITIAL                                  >'#['                                                                                  : Token;
HashTerm              : <INITIAL, Generic                         >'#'                                                                                   : Token;
LAngleTerm            : <INITIAL, Generic                         >'<'                                                                                   : Token;
QuestionTerm          : <INITIAL                                  >'?'                                                                                   : Token;
QuoteLBraceTerm       : <INITIAL, Generic                         >"'\{"                                                                                 : Token;
QuoteTerm             : <INITIAL                                  >"'"                                                                                   : Token;
EscapedLBraceTerm     : <                  Embed, EmbedInner      >'\{'                                                                                  : Token;
TripleLBraceTerm      : <INITIAL                                  >'{{{'                                                                                 : Token;
LBraceTerm            : <INITIAL, Generic, Embed, EmbedInner, Attr>'{'                                                                                   : Token;
LBracketTerm          : <INITIAL, Generic,                    Attr>'['                                                                                   : Token;
LParenTerm            : <INITIAL, Generic,                    Attr>'('                                                                                   : Token;
RAngleTerm            : <INITIAL, Generic                         >'>'                                                                                   : Token;
EscapedRBraceTerm     : <INITIAL                                  >'\}'                                                                                  : Token;
TripleRBraceTerm      : <                  Embed                  >'}}}'                                                                                 : Token;
RBraceTerm            : <INITIAL, Generic,        EmbedInner, Attr>'}'                                                                                   : Token;
RBracketTerm          : <INITIAL, Generic,                    Attr>']'                                                                                   : Token;
RParenTerm            : <INITIAL, Generic,                    Attr>')'                                                                                   : Token;
SemicolonTerm         : <INITIAL, Generic                         >';'                                                                                   : Token;
StarTerm              : <INITIAL, Generic                         >'*'                                                                                   : Token;

// Keywords are reflected to syntax highlight definitions through highlightgen tool.
// Please refer support/highlightgen/README.md if you want to add a keyword.

AliasTerm             : <INITIAL, Generic                         >'alias'                                                                               : Token; // Keyword: Statement
AlwaysCombTerm        : <INITIAL, Generic                         >'always_comb'                                                                         : Token; // Keyword: Statement
AlwaysFfTerm          : <INITIAL, Generic                         >'always_ff'                                                                           : Token; // Keyword: Statement
AssignTerm            : <INITIAL, Generic                         >'assign'                                                                              : Token; // Keyword: Statement
AsTerm                : <INITIAL, Generic                         >'as'                                                                                  : Token; // Keyword: Statement
BindTerm              : <INITIAL, Generic                         >'bind'                                                                                : Token; // Keyword: Statement
BitTerm               : <INITIAL, Generic                         >'bit'                                                                                 : Token; // Keyword: Type
BoolTerm              : <INITIAL, Generic                         >'bool'                                                                                : Token; // Keyword: Type
CaseTerm              : <INITIAL, Generic                         >'case'                                                                                : Token; // Keyword: Conditional
ClockTerm             : <INITIAL, Generic                         >'clock'                                                                               : Token; // Keyword: Type
ClockPosedgeTerm      : <INITIAL, Generic                         >'clock_posedge'                                                                       : Token; // Keyword: Type
ClockNegedgeTerm      : <INITIAL, Generic                         >'clock_negedge'                                                                       : Token; // Keyword: Type
ConnectTerm           : <INITIAL, Generic                         >'connect'                                                                             : Token; // Keyword: Statement
ConstTerm             : <INITIAL, Generic                         >'const'                                                                               : Token; // Keyword: Statement
ConverseTerm          : <INITIAL, Generic                         >'converse'                                                                            : Token; // Keyword: Direction
DefaultTerm           : <INITIAL, Generic                         >'default'                                                                             : Token; // Keyword: Conditional
ElseTerm              : <INITIAL, Generic                         >'else'                                                                                : Token; // Keyword: Conditional
EmbedTerm             : <INITIAL, Generic                         >'embed'                                                                               : Token; // Keyword: Structure
EnumTerm              : <INITIAL, Generic                         >'enum'                                                                                : Token; // Keyword: Structure
F32Term               : <INITIAL, Generic                         >'f32'                                                                                 : Token; // Keyword: Type
F64Term               : <INITIAL, Generic                         >'f64'                                                                                 : Token; // Keyword: Type
FalseTerm             : <INITIAL, Generic                         >'false'                                                                               : Token; // Keyword: Literal
FinalTerm             : <INITIAL, Generic                         >'final'                                                                               : Token; // Keyword: Statement
ForTerm               : <INITIAL, Generic                         >'for'                                                                                 : Token; // Keyword: Repeat
FunctionTerm          : <INITIAL, Generic                         >'function'                                                                            : Token; // Keyword: Structure
I8Term                : <INITIAL, Generic                         >'i8'                                                                                  : Token; // Keyword: Type
I16Term               : <INITIAL, Generic                         >'i16'                                                                                 : Token; // Keyword: Type
I32Term               : <INITIAL, Generic                         >'i32'                                                                                 : Token; // Keyword: Type
I64Term               : <INITIAL, Generic                         >'i64'                                                                                 : Token; // Keyword: Type
IfResetTerm           : <INITIAL, Generic                         >'if_reset'                                                                            : Token; // Keyword: Conditional
IfTerm                : <INITIAL, Generic                         >'if'                                                                                  : Token; // Keyword: Conditional
ImportTerm            : <INITIAL, Generic                         >'import'                                                                              : Token; // Keyword: Statement
IncludeTerm           : <INITIAL, Generic                         >'include'                                                                             : Token; // Keyword: Structure
InitialTerm           : <INITIAL, Generic                         >'initial'                                                                             : Token; // Keyword: Statement
InoutTerm             : <INITIAL, Generic                         >'inout'                                                                               : Token; // Keyword: Direction
InputTerm             : <INITIAL, Generic                         >'input'                                                                               : Token; // Keyword: Direction
InsideTerm            : <INITIAL, Generic                         >'inside'                                                                              : Token; // Keyword: Conditional
InstTerm              : <INITIAL, Generic                         >'inst'                                                                                : Token; // Keyword: Statement
InterfaceTerm         : <INITIAL, Generic                         >'interface'                                                                           : Token; // Keyword: Structure
InTerm                : <INITIAL, Generic                         >'in'                                                                                  : Token; // Keyword: Repeat
LetTerm               : <INITIAL, Generic                         >'let'                                                                                 : Token; // Keyword: Statement
LogicTerm             : <INITIAL, Generic                         >'logic'                                                                               : Token; // Keyword: Type
LsbTerm               : <INITIAL, Generic                         >'lsb'                                                                                 : Token; // Keyword: Literal
ModportTerm           : <INITIAL, Generic                         >'modport'                                                                             : Token; // Keyword: Structure
ModuleTerm            : <INITIAL, Generic                         >'module'                                                                              : Token; // Keyword: Structure
MsbTerm               : <INITIAL, Generic                         >'msb'                                                                                 : Token; // Keyword: Literal
OutputTerm            : <INITIAL, Generic                         >'output'                                                                              : Token; // Keyword: Direction
OutsideTerm           : <INITIAL, Generic                         >'outside'                                                                             : Token; // Keyword: Conditional
PackageTerm           : <INITIAL, Generic                         >'package'                                                                             : Token; // Keyword: Structure
ParamTerm             : <INITIAL, Generic                         >'param'                                                                               : Token; // Keyword: Statement
ProtoTerm             : <INITIAL, Generic                         >'proto'                                                                               : Token; // Keyword: Structure
PubTerm               : <INITIAL, Generic                         >'pub'                                                                                 : Token; // Keyword: Structure
RepeatTerm            : <INITIAL, Generic                         >'repeat'                                                                              : Token; // Keyword: Repeat
ResetTerm             : <INITIAL, Generic                         >'reset'                                                                               : Token; // Keyword: Type
ResetAsyncHighTerm    : <INITIAL, Generic                         >'reset_async_high'                                                                    : Token; // Keyword: Type
ResetAsyncLowTerm     : <INITIAL, Generic                         >'reset_async_low'                                                                     : Token; // Keyword: Type
ResetSyncHighTerm     : <INITIAL, Generic                         >'reset_sync_high'                                                                     : Token; // Keyword: Type
ResetSyncLowTerm      : <INITIAL, Generic                         >'reset_sync_low'                                                                      : Token; // Keyword: Type
ReturnTerm            : <INITIAL, Generic                         >'return'                                                                              : Token; // Keyword: Statement
RevTerm               : <INITIAL, Generic                         >'rev'                                                                                 : Token; // Keyword: Repeat
BreakTerm             : <INITIAL, Generic                         >'break'                                                                               : Token; // Keyword: Statement
SameTerm              : <INITIAL, Generic                         >'same'                                                                                : Token; // Keyword: Direction
SignedTerm            : <INITIAL, Generic                         >'signed'                                                                              : Token; // Keyword: Type
StepTerm              : <INITIAL, Generic                         >'step'                                                                                : Token; // Keyword: Repeat
StringTerm            : <INITIAL, Generic                         >'string'                                                                              : Token; // Keyword: Type
StructTerm            : <INITIAL, Generic                         >'struct'                                                                              : Token; // Keyword: Structure
SwitchTerm            : <INITIAL, Generic                         >'switch'                                                                              : Token; // Keyword: Conditional
TriTerm               : <INITIAL, Generic                         >'tri'                                                                                 : Token; // Keyword: Type
TrueTerm              : <INITIAL, Generic                         >'true'                                                                                : Token; // Keyword: Literal
TypeTerm              : <INITIAL, Generic                         >'type'                                                                                : Token; // Keyword: Statement
U8Term                : <INITIAL, Generic                         >'u8'                                                                                  : Token; // Keyword: Type
U16Term               : <INITIAL, Generic                         >'u16'                                                                                 : Token; // Keyword: Type
U32Term               : <INITIAL, Generic                         >'u32'                                                                                 : Token; // Keyword: Type
U64Term               : <INITIAL, Generic                         >'u64'                                                                                 : Token; // Keyword: Type
UnionTerm             : <INITIAL, Generic                         >'union'                                                                               : Token; // Keyword: Structure
UnsafeTerm            : <INITIAL, Generic                         >'unsafe'                                                                              : Token; // Keyword: Structure
VarTerm               : <INITIAL, Generic                         >'var'                                                                                 : Token; // Keyword: Statement
DollarIdentifierTerm  : <INITIAL, Generic                         >/\$[a-zA-Z_][0-9a-zA-Z_$]*/                                                           : Token;
IdentifierTerm        : <INITIAL, Generic,                    Attr>/(?:r#)?[a-zA-Z_][0-9a-zA-Z_$]*/                                                      : Token;
AnyTerm               : <                  Embed, EmbedInner      >/(?:[^{}\\]|\\[^{])+/                                                                 : 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;
DiamondOperatorToken   : DiamondOperatorTerm   : 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;
Operator12Token        : Operator12Term        : Token Comments;
UnaryOperatorToken     : UnaryOperatorTerm     : Token Comments;

ColonToken           : ColonTerm           : Token Comments;
ColonColonLAngleToken: ColonColonLAngleTerm: Token Comments;
ColonColonToken      : ColonColonTerm      : Token Comments;
CommaToken           : CommaTerm           : Token Comments;
DotDotToken          : DotDotTerm          : Token Comments;
DotDotEquToken       : DotDotEquTerm       : Token Comments;
DotToken             : DotTerm             : Token Comments;
EquToken             : EquTerm             : Token Comments;
HashLBracketToken    : HashLBracketTerm    : Token Comments;
HashToken            : HashTerm            : Token Comments;
QuestionToken        : QuestionTerm        : Token Comments;
QuoteLBraceToken     : QuoteLBraceTerm     : Token Comments;
QuoteToken           : QuoteTerm           : Token Comments;
LAngleToken          : LAngleTerm          : Token Comments;
EmbedLBraceToken     : LBraceTerm          : Token         ;
EscapedLBraceToken   : EscapedLBraceTerm   : Token         ;
TripleLBraceToken    : TripleLBraceTerm    : Token         ;
LBraceToken          : LBraceTerm          : Token Comments;
LBracketToken        : LBracketTerm        : Token Comments;
LParenToken          : LParenTerm          : Token Comments;
LTMinusToken         : LTMinusTerm         : Token Comments;
MinusColonToken      : MinusColonTerm      : Token Comments;
MinusGTToken         : MinusGTTerm         : Token Comments;
PlusColonToken       : PlusColonTerm       : Token Comments;
RAngleToken          : RAngleTerm          : Token Comments;
EmbedRBraceToken     : RBraceTerm          : Token         ;
EscapedRBraceToken   : EscapedRBraceTerm   : Token         ;
TripleRBraceToken    : TripleRBraceTerm    : Token Comments;
RBraceToken          : RBraceTerm          : Token Comments;
RBracketToken        : RBracketTerm        : Token Comments;
RParenToken          : RParenTerm          : Token Comments;
SemicolonToken       : SemicolonTerm       : Token Comments;
StarToken            : StarTerm            : Token Comments;

AliasToken         : AliasTerm         : Token Comments;
AlwaysCombToken    : AlwaysCombTerm    : Token Comments;
AlwaysFfToken      : AlwaysFfTerm      : Token Comments;
AsToken            : AsTerm            : Token Comments;
AssignToken        : AssignTerm        : Token Comments;
BindToken          : BindTerm          : Token Comments;
BitToken           : BitTerm           : Token Comments;
BoolToken          : BoolTerm          : Token Comments;
CaseToken          : CaseTerm          : Token Comments;
ClockToken         : ClockTerm         : Token Comments;
ClockPosedgeToken  : ClockPosedgeTerm  : Token Comments;
ClockNegedgeToken  : ClockNegedgeTerm  : Token Comments;
ConnectToken       : ConnectTerm       : Token Comments;
ConstToken         : ConstTerm         : Token Comments;
ConverseToken      : ConverseTerm      : Token Comments;
DefaultToken       : DefaultTerm       : Token Comments;
ElseToken          : ElseTerm          : Token Comments;
EmbedToken         : EmbedTerm         : Token Comments;
EnumToken          : EnumTerm          : Token Comments;
F32Token           : F32Term           : Token Comments;
F64Token           : F64Term           : Token Comments;
FalseToken         : FalseTerm         : Token Comments;
FinalToken         : FinalTerm         : Token Comments;
ForToken           : ForTerm           : Token Comments;
FunctionToken      : FunctionTerm      : Token Comments;
I8Token            : I8Term            : Token Comments;
I16Token           : I16Term           : Token Comments;
I32Token           : I32Term           : Token Comments;
I64Token           : I64Term           : Token Comments;
IfResetToken       : IfResetTerm       : Token Comments;
IfToken            : IfTerm            : Token Comments;
ImportToken        : ImportTerm        : Token Comments;
IncludeToken       : IncludeTerm       : Token Comments;
InitialToken       : InitialTerm       : Token Comments;
InoutToken         : InoutTerm         : Token Comments;
InputToken         : InputTerm         : Token Comments;
InsideToken        : InsideTerm        : Token Comments;
InstToken          : InstTerm          : Token Comments;
InterfaceToken     : InterfaceTerm     : Token Comments;
InToken            : InTerm            : Token Comments;
LetToken           : LetTerm           : Token Comments;
LogicToken         : LogicTerm         : Token Comments;
LsbToken           : LsbTerm           : Token Comments;
ModportToken       : ModportTerm       : Token Comments;
ModuleToken        : ModuleTerm        : Token Comments;
MsbToken           : MsbTerm           : Token Comments;
OutputToken        : OutputTerm        : Token Comments;
OutsideToken       : OutsideTerm       : Token Comments;
PackageToken       : PackageTerm       : Token Comments;
ParamToken         : ParamTerm         : Token Comments;
ProtoToken         : ProtoTerm         : Token Comments;
PubToken           : PubTerm           : Token Comments;
RepeatToken        : RepeatTerm        : Token Comments;
ResetToken         : ResetTerm         : Token Comments;
ResetAsyncHighToken: ResetAsyncHighTerm: Token Comments;
ResetAsyncLowToken : ResetAsyncLowTerm : Token Comments;
ResetSyncHighToken : ResetSyncHighTerm : Token Comments;
ResetSyncLowToken  : ResetSyncLowTerm  : Token Comments;
ReturnToken        : ReturnTerm        : Token Comments;
RevToken           : RevTerm           : Token Comments;
BreakToken         : BreakTerm         : Token Comments;
SameToken          : SameTerm          : Token Comments;
SignedToken        : SignedTerm        : Token Comments;
StepToken          : StepTerm          : Token Comments;
StringToken        : StringTerm        : Token Comments;
StructToken        : StructTerm        : Token Comments;
SwitchToken        : SwitchTerm        : Token Comments;
TriToken           : TriTerm           : Token Comments;
TrueToken          : TrueTerm          : Token Comments;
TypeToken          : TypeTerm          : Token Comments;
U8Token            : U8Term            : Token Comments;
U16Token           : U16Term           : Token Comments;
U32Token           : U32Term           : Token Comments;
U64Token           : U64Term           : Token Comments;
UnionToken         : UnionTerm         : Token Comments;
UnsafeToken        : UnsafeTerm        : Token Comments;
VarToken           : VarTerm           : Token Comments;

DollarIdentifierToken: DollarIdentifierTerm: Token Comments;
IdentifierToken      : IdentifierTerm      : Token Comments;

AnyToken: AnyTerm: Token;

// ----------------------------------------------------------------------------
// 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;
DiamondOperator   : DiamondOperatorToken   : 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;
Operator12        : Operator12Token        : VerylToken;
UnaryOperator     : UnaryOperatorToken     : VerylToken;

// Symbol
Colon           : ColonToken           : VerylToken;
ColonColonLAngle: ColonColonLAngleToken: VerylToken;
ColonColon      : ColonColonToken      : VerylToken;
Comma           : CommaToken           : VerylToken;
DotDot          : DotDotToken          : VerylToken;
DotDotEqu       : DotDotEquToken       : VerylToken;
Dot             : DotToken             : VerylToken;
Equ             : EquToken             : VerylToken;
HashLBracket    : HashLBracketToken    : VerylToken;
Hash            : HashToken            : VerylToken;
Question        : QuestionToken        : VerylToken;
QuoteLBrace     : QuoteLBraceToken     : VerylToken;
Quote           : QuoteToken           : VerylToken;
LAngle          : LAngleToken          : VerylToken;
EmbedLBrace     : EmbedLBraceToken     : VerylToken;
EscapedLBrace   : EscapedLBraceToken   : VerylToken;
TripleLBrace    : TripleLBraceToken    : VerylToken;
LBrace          : LBraceToken          : VerylToken;
LBracket        : LBracketToken        : VerylToken;
LParen          : LParenToken          : VerylToken;
LTMinus         : LTMinusToken         : VerylToken;
MinusColon      : MinusColonToken      : VerylToken;
MinusGT         : MinusGTToken         : VerylToken;
PlusColon       : PlusColonToken       : VerylToken;
RAngle          : RAngleToken          : VerylToken;
EmbedRBrace     : EmbedRBraceToken     : VerylToken;
EscapedRBrace   : EscapedRBraceToken   : VerylToken;
TripleRBrace    : TripleRBraceToken    : VerylToken;
RBrace          : RBraceToken          : VerylToken;
RBracket        : RBracketToken        : VerylToken;
RParen          : RParenToken          : VerylToken;
Semicolon       : SemicolonToken       : VerylToken;
Star            : StarToken            : VerylToken;

// Keyword
Alias         : AliasToken         : VerylToken;
AlwaysComb    : AlwaysCombToken    : VerylToken;
AlwaysFf      : AlwaysFfToken      : VerylToken;
As            : AsToken            : VerylToken;
Assign        : AssignToken        : VerylToken;
Bind          : BindToken          : VerylToken;
Bit           : BitToken           : VerylToken;
Bool          : BoolToken          : VerylToken;
Break         : BreakToken         : VerylToken;
Case          : CaseToken          : VerylToken;
Clock         : ClockToken         : VerylToken;
ClockPosedge  : ClockPosedgeToken  : VerylToken;
ClockNegedge  : ClockNegedgeToken  : VerylToken;
Connect       : ConnectToken       : VerylToken;
Const         : ConstToken         : VerylToken;
Converse      : ConverseToken      : VerylToken;
Defaul        : DefaultToken       : VerylToken; // avoid to conflict with Rust's Default trait
Else          : ElseToken          : VerylToken;
Embed         : EmbedToken         : VerylToken;
Enum          : EnumToken          : VerylToken;
F32           : F32Token           : VerylToken;
F64           : F64Token           : VerylToken;
False         : FalseToken         : VerylToken;
Final         : FinalToken         : VerylToken;
For           : ForToken           : VerylToken;
Function      : FunctionToken      : VerylToken;
I8            : I8Token            : VerylToken;
I16           : I16Token           : VerylToken;
I32           : I32Token           : VerylToken;
I64           : I64Token           : VerylToken;
If            : IfToken            : VerylToken;
IfReset       : IfResetToken       : VerylToken;
Import        : ImportToken        : VerylToken;
In            : InToken            : VerylToken;
Include       : IncludeToken       : VerylToken;
Initial       : InitialToken       : VerylToken;
Inout         : InoutToken         : VerylToken;
Input         : InputToken         : VerylToken;
Inside        : InsideToken        : VerylToken;
Inst          : InstToken          : VerylToken;
Interface     : InterfaceToken     : VerylToken;
Let           : LetToken           : VerylToken;
Logic         : LogicToken         : VerylToken;
Lsb           : LsbToken           : VerylToken;
Modport       : ModportToken       : VerylToken;
Module        : ModuleToken        : VerylToken;
Msb           : MsbToken           : VerylToken;
Output        : OutputToken        : VerylToken;
Outside       : OutsideToken       : VerylToken;
Package       : PackageToken       : VerylToken;
Param         : ParamToken         : VerylToken;
Proto         : ProtoToken         : VerylToken;
Pub           : PubToken           : VerylToken;
Repeat        : RepeatToken        : VerylToken;
Reset         : ResetToken         : VerylToken;
ResetAsyncHigh: ResetAsyncHighToken: VerylToken;
ResetAsyncLow : ResetAsyncLowToken : VerylToken;
ResetSyncHigh : ResetSyncHighToken : VerylToken;
ResetSyncLow  : ResetSyncLowToken  : VerylToken;
Return        : ReturnToken        : VerylToken;
Rev           : RevToken           : VerylToken;
Same          : SameToken          : VerylToken;
Signed        : SignedToken        : VerylToken;
Step          : StepToken          : VerylToken;
Strin         : StringToken        : VerylToken; // avoid to conflict with Rust's String struct
Struct        : StructToken        : VerylToken;
Switch        : SwitchToken        : VerylToken;
Tri           : TriToken           : VerylToken;
True          : TrueToken          : VerylToken;
Type          : TypeToken          : VerylToken;
U8            : U8Token            : VerylToken;
U16           : U16Token           : VerylToken;
U32           : U32Token           : VerylToken;
U64           : U64Token           : VerylToken;
Union         : UnionToken         : VerylToken;
Unsafe        : UnsafeToken        : VerylToken;
Var           : VarToken           : VerylToken;

// Identifier
DollarIdentifier: DollarIdentifierToken: VerylToken;
Identifier      : IdentifierToken      : VerylToken;

Any: AnyToken: VerylToken;

// ----------------------------------------------------------------------------
// Number
// ----------------------------------------------------------------------------

Number: IntegralNumber
      | RealNumber
      ;

IntegralNumber: Based
              | BaseLess
              | AllBit
              ;

RealNumber: FixedPoint
          | Exponent
          ;

// ----------------------------------------------------------------------------
// Complex Identifier
// ----------------------------------------------------------------------------

HierarchicalIdentifier: Identifier { Select } { Dot Identifier { Select } };
ScopedIdentifier      : ( DollarIdentifier | Identifier [ WithGenericArgument ] ) { ColonColon Identifier [ WithGenericArgument ] };
ExpressionIdentifier  : ScopedIdentifier [ Width ] { Select } { Dot Identifier { Select } };

// ----------------------------------------------------------------------------
// Expression
// ----------------------------------------------------------------------------

Expression  : IfExpression;
IfExpression: { If Expression Question Expression Colon } 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 Expression10 };
Expression10: Expression11 { ( Operator11 | Star ) Expression11 };
Expression11: Expression12 { Operator12 Expression12 };
Expression12: Expression13 [ As CastingType ];
Expression13: { ( UnaryOperator | Operator10 | Operator06 | Operator04 | Operator05 ) } Factor;

Factor: Number
      | BooleanLiteral
      | IdentifierFactor
      | LParen Expression RParen
      | LBrace ConcatenationList RBrace
      | QuoteLBrace ArrayLiteralList RBrace
      | CaseExpression
      | SwitchExpression
      | StringLiteral
      | ( Msb | Lsb )
      | InsideExpression
      | OutsideExpression
      | TypeExpression
      | FactorTypeFactor
      ;

BooleanLiteral: True | False;

IdentifierFactor: ExpressionIdentifier [ FunctionCall | StructConstructor ];

FactorTypeFactor: { TypeModifier } FactorType;

FunctionCall: LParen [ ArgumentList ] RParen;

ArgumentList: ArgumentItem { Comma ArgumentItem } [ Comma ];

ArgumentItem: ArgumentExpression [ Colon Expression ];

ArgumentExpression: Expression;

StructConstructor: QuoteLBrace StructConstructorList [ DotDot Defaul LParen Expression RParen ] RBrace;

StructConstructorList: StructConstructorItem { Comma StructConstructorItem } [ Comma ];

StructConstructorItem: Identifier Colon Expression;

ConcatenationList: ConcatenationItem { Comma ConcatenationItem } [ Comma ];

ConcatenationItem: Expression [ Repeat Expression ];

ArrayLiteralList: ArrayLiteralItem { Comma ArrayLiteralItem } [ Comma ];

ArrayLiteralItem: ( Expression [ Repeat Expression ] | Defaul Colon Expression );

CaseExpression: Case Expression LBrace CaseCondition Colon Expression Comma { CaseCondition Colon Expression Comma } Defaul Colon Expression [ Comma ] RBrace;

SwitchExpression: Switch LBrace SwitchCondition Colon Expression Comma { SwitchCondition Colon Expression Comma } Defaul Colon Expression [ Comma ] RBrace;

TypeExpression: Type LParen Expression RParen;

InsideExpression: Inside Expression LBrace RangeList RBrace;

OutsideExpression: Outside Expression LBrace RangeList RBrace;

RangeList: RangeItem { Comma RangeItem } [ Comma ];

RangeItem: Range;

// ----------------------------------------------------------------------------
// Select / Width / Array / Range
// ----------------------------------------------------------------------------

Select: LBracket Expression [ SelectOperator Expression ] RBracket;

SelectOperator: Colon
              | PlusColon
              | MinusColon
              | Step
              ;

Width: LAngle Expression { Comma Expression } RAngle;

Array: LBracket Expression { Comma Expression } RBracket;

Range: Expression [ RangeOperator Expression ];

RangeOperator: DotDot
             | DotDotEqu
             ;

// ----------------------------------------------------------------------------
// ScalarType / ArrayType / CastingType
// ----------------------------------------------------------------------------

FixedType: U8 | U16 | U32 | U64 | I8 | I16| I32 | I64 | F32 | F64 | Bool | Strin;

VariableType: Clock
            | ClockPosedge
            | ClockNegedge
            | Reset
            | ResetAsyncHigh
            | ResetAsyncLow
            | ResetSyncHigh
            | ResetSyncLow
            | Logic
            | Bit;

UserDefinedType: ScopedIdentifier;

TypeModifier: Tri | Signed | Defaul;

FactorType: ( VariableType [ Width ] | FixedType );

ScalarType: { TypeModifier } ( UserDefinedType [ Width ] | FactorType );

ArrayType: ScalarType [ Array ];

CastingType: U8
           | U16
           | U32
           | U64
           | I8
           | I16
           | I32
           | I64
           | F32
           | F64
           | Bool
           | Clock
           | ClockPosedge
           | ClockNegedge
           | Reset
           | ResetAsyncHigh
           | ResetAsyncLow
           | ResetSyncHigh
           | ResetSyncLow
           | UserDefinedType
           | Based
           | BaseLess
           ;

// ----------------------------------------------------------------------------
// ClockDomain
// ----------------------------------------------------------------------------

ClockDomain: Quote Identifier;

// ----------------------------------------------------------------------------
// Statement
// ----------------------------------------------------------------------------

StatementBlock: LBrace { StatementBlockGroup } RBrace;

StatementBlockGroup: { Attribute } ( LBrace { StatementBlockGroup } RBrace | StatementBlockItem );

StatementBlockItem: VarDeclaration | LetStatement | ConstDeclaration | Statement;

Statement: IdentifierStatement
         | IfStatement
         | IfResetStatement
         | ReturnStatement
         | BreakStatement
         | ForStatement
         | CaseStatement
         | SwitchStatement
         ;

LetStatement: Let Identifier Colon [ ClockDomain ] ArrayType Equ Expression Semicolon;

IdentifierStatement: ExpressionIdentifier ( FunctionCall | Assignment ) Semicolon;

Assignment: ( Equ | AssignmentOperator | DiamondOperator ) Expression;

IfStatement: If Expression StatementBlock { Else If Expression StatementBlock } [ Else StatementBlock ];

IfResetStatement: IfReset StatementBlock { Else If Expression StatementBlock } [ Else StatementBlock ];

ReturnStatement: Return Expression Semicolon;

BreakStatement: Break Semicolon;

ForStatement: For Identifier Colon ScalarType In [ Rev ] Range [ Step AssignmentOperator Expression ] StatementBlock;

CaseStatement: Case Expression LBrace { CaseItem } RBrace;

CaseItem: ( CaseCondition | Defaul ) Colon ( Statement | StatementBlock );

CaseCondition: RangeItem { Comma RangeItem } ;

SwitchStatement: Switch LBrace { SwitchItem } RBrace;

SwitchItem: ( SwitchCondition | Defaul ) Colon ( Statement | StatementBlock );

SwitchCondition: Expression { Comma Expression } ;

// ----------------------------------------------------------------------------
// Attribute
// ----------------------------------------------------------------------------

Attribute: HashLBracket Identifier [ LParen AttributeList RParen ] RBracket ;

AttributeList: AttributeItem { Comma AttributeItem } [ Comma ];

AttributeItem: Identifier
             | StringLiteral
             ;

// ----------------------------------------------------------------------------
// Declaration
// ----------------------------------------------------------------------------

LetDeclaration: Let Identifier Colon [ ClockDomain ] ArrayType Equ Expression Semicolon;

VarDeclaration: Var Identifier Colon [ ClockDomain ] ArrayType Semicolon;

ConstDeclaration: Const Identifier Colon ( ArrayType | Type ) Equ Expression Semicolon;

TypeDefDeclaration: Type Identifier Equ ArrayType Semicolon;

AlwaysFfDeclaration: AlwaysFf [ AlwaysFfEventList ] StatementBlock;

AlwaysFfEventList: LParen AlwaysFfClock [ Comma AlwaysFfReset ] RParen;

AlwaysFfClock: HierarchicalIdentifier;

AlwaysFfReset: HierarchicalIdentifier;

AlwaysCombDeclaration: AlwaysComb StatementBlock;

AssignDeclaration: Assign AssignDestination Equ Expression Semicolon;

AssignDestination: HierarchicalIdentifier
                 | LBrace AssignConcatenationList RBrace;

AssignConcatenationList: AssignConcatenationItem { Comma AssignConcatenationItem } [ Comma ];

AssignConcatenationItem: HierarchicalIdentifier;

ConnectDeclaration: Connect HierarchicalIdentifier DiamondOperator Expression Semicolon;

ModportDeclaration: Modport Identifier LBrace [ ModportList ] [ DotDot ModportDefault ] RBrace;

ModportList: ModportGroup { Comma ModportGroup } [ Comma ];

ModportGroup: { Attribute } ( LBrace ModportList RBrace | ModportItem );

ModportItem: Identifier Colon Direction;

ModportDefault: Input
              | Output
              | Same LParen Identifier RParen
              | Converse LParen Identifier RParen;

EnumDeclaration: Enum Identifier [ Colon ScalarType ] LBrace EnumList RBrace;

EnumList: EnumGroup { Comma EnumGroup } [ Comma ];

EnumGroup: { Attribute } ( LBrace EnumList RBrace | EnumItem );

EnumItem: Identifier [ Equ Expression ];

StructUnion: Struct | Union;

StructUnionDeclaration: StructUnion Identifier [ WithGenericParameter ] LBrace StructUnionList RBrace;

StructUnionList: StructUnionGroup { Comma StructUnionGroup } [ Comma ];

StructUnionGroup: { Attribute } ( LBrace StructUnionList RBrace | StructUnionItem );

StructUnionItem: Identifier Colon ScalarType;

InitialDeclaration: Initial StatementBlock;

FinalDeclaration: Final StatementBlock;

// ----------------------------------------------------------------------------
// InstDeclaration/BindDeclaration
// ----------------------------------------------------------------------------

InstDeclaration: Inst ComponentInstantiation Semicolon;

BindDeclaration: Bind ScopedIdentifier LTMinus ComponentInstantiation Semicolon;

ComponentInstantiation: Identifier Colon [ ClockDomain ] ScopedIdentifier [ Array ] [ InstParameter ] [ InstPort ];

InstParameter: Hash LParen [ InstParameterList ] RParen;

InstParameterList: InstParameterGroup { Comma InstParameterGroup } [ Comma ];

InstParameterGroup: { Attribute } ( LBrace InstParameterList RBrace | InstParameterItem );

InstParameterItem: Identifier [ Colon Expression ];

InstPort: LParen [ InstPortList ] RParen;

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: ( Param | Const ) Identifier Colon ( ArrayType | Type ) [ Equ Expression ];

// ----------------------------------------------------------------------------
// WithGenericParameter
// ----------------------------------------------------------------------------

GenericBound: Type
            | Inst ScopedIdentifier
            | GenericProtoBound;

WithGenericParameter: ColonColonLAngle WithGenericParameterList RAngle;

WithGenericParameterList: WithGenericParameterItem { Comma WithGenericParameterItem } [ Comma ];

WithGenericParameterItem: Identifier Colon GenericBound [ Equ WithGenericArgumentItem ];

GenericProtoBound: ScopedIdentifier | FixedType;

// ----------------------------------------------------------------------------
// WithGenericArgument
// ----------------------------------------------------------------------------

WithGenericArgument: ColonColonLAngle [ WithGenericArgumentList ] RAngle;

WithGenericArgumentList: WithGenericArgumentItem { Comma WithGenericArgumentItem } [ Comma ];

WithGenericArgumentItem: ExpressionIdentifier
                       | FixedType
                       | Number
                       | BooleanLiteral
                       ;

// ----------------------------------------------------------------------------
// PortDeclaration
// ----------------------------------------------------------------------------

PortDeclaration: LParen [ PortDeclarationList ] RParen;

PortDeclarationList: PortDeclarationGroup { Comma PortDeclarationGroup } [ Comma ];

PortDeclarationGroup: { Attribute } ( LBrace PortDeclarationList RBrace | PortDeclarationItem );

PortDeclarationItem: Identifier Colon ( PortTypeConcrete | PortTypeAbstract );

PortTypeConcrete: Direction [ ClockDomain ] ArrayType [ Equ PortDefaultValue ];

PortDefaultValue: Expression;

PortTypeAbstract: [ ClockDomain ] Interface [ ColonColon Identifier ] [ Array ];

Direction: Input
         | Output
         | Inout
         | Modport
         | Import
         ;

// ----------------------------------------------------------------------------
// Function
// ----------------------------------------------------------------------------

FunctionDeclaration: Function Identifier [ WithGenericParameter ] [ PortDeclaration ] [ MinusGT ScalarType ] StatementBlock;

// ----------------------------------------------------------------------------
// Import
// ----------------------------------------------------------------------------

ImportDeclaration: Import ScopedIdentifier [ ColonColon Star ] Semicolon;

// ----------------------------------------------------------------------------
// Unsafe
// ----------------------------------------------------------------------------

UnsafeBlock: Unsafe LParen Identifier RParen LBrace { GenerateGroup } RBrace;

// ----------------------------------------------------------------------------
// Module/Interface
// ----------------------------------------------------------------------------

ModuleDeclaration: Module Identifier [ WithGenericParameter ] [ For ScopedIdentifier ] [ WithParameter ] [ PortDeclaration ] LBrace { ModuleGroup } RBrace;

ModuleGroup: { Attribute } ( LBrace { ModuleGroup } RBrace | ModuleItem );

ModuleItem: GenerateItem;

InterfaceDeclaration: Interface Identifier [ WithGenericParameter ] [ For ScopedIdentifier ] [ WithParameter ] LBrace { InterfaceGroup } RBrace;

InterfaceGroup: { Attribute } ( LBrace { InterfaceGroup } RBrace | InterfaceItem );

InterfaceItem: GenerateItem | ModportDeclaration;

GenerateIfDeclaration: If Expression GenerateNamedBlock { Else If Expression GenerateOptionalNamedBlock } [ Else GenerateOptionalNamedBlock ];

GenerateForDeclaration: For Identifier In [ Rev ] Range [ Step AssignmentOperator Expression ] GenerateNamedBlock;

GenerateBlockDeclaration: GenerateNamedBlock;

GenerateNamedBlock: Colon Identifier LBrace { GenerateGroup } RBrace;

GenerateOptionalNamedBlock: [ Colon Identifier ] LBrace { GenerateGroup } RBrace;

GenerateGroup: { Attribute } ( LBrace { GenerateGroup } RBrace | GenerateItem );

GenerateItem: LetDeclaration
            | VarDeclaration
            | InstDeclaration
            | BindDeclaration
            | ConstDeclaration
            | AlwaysFfDeclaration
            | AlwaysCombDeclaration
            | AssignDeclaration
            | ConnectDeclaration
            | FunctionDeclaration
            | GenerateIfDeclaration
            | GenerateForDeclaration
            | GenerateBlockDeclaration
            | TypeDefDeclaration
            | EnumDeclaration
            | StructUnionDeclaration
            | ImportDeclaration
            | AliasDeclaration
            | InitialDeclaration
            | FinalDeclaration
            | UnsafeBlock
            | EmbedDeclaration
            ;

// ----------------------------------------------------------------------------
// Package
// ----------------------------------------------------------------------------

PackageDeclaration: Package Identifier [ WithGenericParameter ] [ For ScopedIdentifier ] LBrace { PackageGroup } RBrace;

PackageGroup: { Attribute } ( LBrace { PackageGroup } RBrace | PackageItem );

PackageItem: ConstDeclaration
           | TypeDefDeclaration
           | EnumDeclaration
           | StructUnionDeclaration
           | FunctionDeclaration
           | ImportDeclaration
           | AliasDeclaration
           | EmbedDeclaration
           ;

// ----------------------------------------------------------------------------
// Alias
// ----------------------------------------------------------------------------

AliasDeclaration: Alias ( Module | Interface | Package ) Identifier Equ ScopedIdentifier Semicolon;

// ----------------------------------------------------------------------------
// Proto
// ----------------------------------------------------------------------------

ProtoDeclaration: Proto ( ProtoModuleDeclaration | ProtoInterfaceDeclaration | ProtoPackageDeclaration );

ProtoModuleDeclaration: Module Identifier [ WithParameter ] [ PortDeclaration ] Semicolon;

ProtoInterfaceDeclaration: Interface Identifier [ WithParameter ] LBrace { ProtoInterfaceItem } RBrace;

ProtoInterfaceItem: VarDeclaration
                  | ProtoConstDeclaration
                  | ProtoFunctionDeclaration
                  | ProtoTypeDefDeclaration
                  | ProtoAliasDeclaration
                  | ModportDeclaration
                  | ImportDeclaration
                  ;

ProtoPackageDeclaration: Package Identifier LBrace { ProtoPacakgeItem } RBrace;

ProtoPacakgeItem: ProtoConstDeclaration
                | ProtoTypeDefDeclaration
                | EnumDeclaration
                | StructUnionDeclaration
                | ProtoFunctionDeclaration
                | ProtoAliasDeclaration
                | ImportDeclaration
                ;

ProtoConstDeclaration: Const Identifier Colon ( ArrayType | Type ) Semicolon;

ProtoTypeDefDeclaration: Type Identifier [ Equ ArrayType ] Semicolon;

ProtoFunctionDeclaration: Function Identifier [ WithGenericParameter ] [ PortDeclaration ] [ MinusGT ScalarType ] Semicolon;

ProtoAliasDeclaration: Alias ( Module | Interface | Package ) Identifier Colon ScopedIdentifier Semicolon;

// ----------------------------------------------------------------------------
// Embed
// ----------------------------------------------------------------------------

EmbedDeclaration: Embed LParen Identifier RParen Identifier EmbedContent;

EmbedContent: TripleLBrace { EmbedItem } TripleRBrace;

EmbedScopedIdentifier: EscapedLBrace ScopedIdentifier EscapedRBrace;

EmbedItem: EmbedLBrace { EmbedItem } EmbedRBrace
         | EmbedScopedIdentifier
         | Any;

// ----------------------------------------------------------------------------
// Include
// ----------------------------------------------------------------------------

IncludeDeclaration: Include LParen Identifier Comma StringLiteral RParen Semicolon;

// ----------------------------------------------------------------------------
// Description
// ----------------------------------------------------------------------------

DescriptionGroup: { Attribute } ( LBrace { DescriptionGroup } RBrace | DescriptionItem );

DescriptionItem: [ Pub ] PublicDescriptionItem
               | ImportDeclaration
               | BindDeclaration
               | EmbedDeclaration
               | IncludeDeclaration
               ;

PublicDescriptionItem: ModuleDeclaration
                     | InterfaceDeclaration
                     | PackageDeclaration
                     | AliasDeclaration
                     | ProtoDeclaration
                     ;

// ----------------------------------------------------------------------------
// SourceCode
// ----------------------------------------------------------------------------

Veryl: Start { DescriptionGroup };