from Child import Child from Node import Node # noqa: I201 STMT_NODES = [ # continue-stmt -> 'continue' label? ';'? Node('ContinueStmt', kind='Stmt', children=[ Child('ContinueKeyword', kind='ContinueToken'), Child('Label', kind='IdentifierToken', is_optional=True), Child('Semicolon', kind='SemicolonToken', is_optional=True), ]), # while-stmt -> label? ':'? 'while' condition-list code-block ';'? Node('WhileStmt', kind='Stmt', children=[ Child('LabelName', kind='IdentifierToken', is_optional=True), Child('LabelColon', kind='ColonToken', is_optional=True), Child('WhileKeyword', kind='WhileToken'), Child('Conditions', kind='ConditionList'), Child('Body', kind='CodeBlock'), Child('Semicolon', kind='SemicolonToken', is_optional=True), ]), # defer-stmt -> 'defer' code-block ';'? Node('DeferStmt', kind='Stmt', children=[ Child('DeferKeyword', kind='DeferToken'), Child('Body', kind='CodeBlock'), Child('Semicolon', kind='SemicolonToken', is_optional=True), ]), # expr-stmt -> expression ';'? Node('ExpressionStmt', kind='Stmt', children=[ Child('Expression', kind='Expr'), Child('Semicolon', kind='SemicolonToken', is_optional=True), ]), # switch-case-list -> switch-case switch-case-list? Node('SwitchCaseList', kind='SyntaxCollection', element='SwitchCase'), # repeat-while-stmt -> label? ':'? 'repeat' code-block 'while' expr ';'? Node('RepeatWhileStmt', kind='Stmt', children=[ Child('LabelName', kind='IdentifierToken', is_optional=True), Child('LabelColon', kind='ColonToken', is_optional=True), Child('RepeatKeyword', kind='RepeatToken'), Child('Body', kind='CodeBlock'), Child('WhileKeyword', kind='WhileToken'), Child('Condition', kind='Expr'), Child('Semicolon', kind='SemicolonToken', is_optional=True), ]), # guard-stmt -> 'guard' condition-list 'else' code-block ';'? Node('GuardStmt', kind='Stmt', children=[ Child('GuardKeyword', kind='GuardToken'), Child('Conditions', kind='ConditionList'), Child('ElseKeyword', kind='ElseToken'), Child('Body', kind='CodeBlock'), Child('Semicolon', kind='SemicolonToken', is_optional=True), ]), Node('ExprList', kind='SyntaxCollection', element='Expr', element_name='Expression'), Node('WhereClause', kind='Syntax', children=[ Child('WhereKeyword', kind='WhereToken'), Child('Expressions', kind='ExprList'), ]), # for-in-stmt -> label? ':'? 'for' 'case'? pattern 'in' expr 'where'? # expr code-block ';'? Node('ForInStmt', kind='Stmt', children=[ Child('LabelName', kind='IdentifierToken', is_optional=True), Child('LabelColon', kind='ColonToken', is_optional=True), Child('ForKeyword', kind='ForToken'), Child('CaseKeyword', kind='CaseToken', is_optional=True), Child('ItemPattern', kind='Pattern'), Child('InKeyword', kind='InToken'), Child('CollectionExpr', kind='Expr'), Child('WhereClause', kind='WhereClause', is_optional=True), Child('Body', kind='CodeBlock'), Child('Semicolon', kind='SemicolonToken', is_optional=True), ]), # switch-stmt -> identifier? ':'? 'switch' expr '{' # switch-case-list '}' ';'? Node('SwitchStmt', kind='Stmt', children=[ Child('LabelName', kind='IdentifierToken', is_optional=True), Child('LabelColon', kind='ColonToken', is_optional=True), Child('SwitchKeyword', kind='SwitchToken'), Child('Expression', kind='Expr'), Child('OpenBrace', kind='LeftBraceToken'), Child('Cases', kind='SwitchCaseList'), Child('CloseBrace', kind='RightBraceToken'), Child('Semicolon', kind='SemicolonToken', is_optional=True), ]), # catch-clause-list -> catch-clause catch-clause-list? Node('CatchClauseList', kind='SyntaxCollection', element='CatchClause'), # do-stmt -> identifier? ':'? 'do' code-block catch-clause-list ';'? Node('DoStmt', kind='Stmt', children=[ Child('LabelName', kind='IdentifierToken', is_optional=True), Child('LabelColon', kind='ColonToken', is_optional=True), Child('DoKeyword', kind='DoToken'), Child('Body', kind='CodeBlock'), Child('CatchClauses', kind='CatchClauseList'), Child('Semicolon', kind='SemicolonToken', is_optional=True), ]), # return-stmt -> 'return' expr? ';'? Node('ReturnStmt', kind='Stmt', children=[ Child('ReturnKeyword', kind='ReturnToken'), Child('Expression', kind='Expr', is_optional=True), Child('Semicolon', kind='SemicolonToken', is_optional=True), ]), # fallthrough-stmt -> 'fallthrough' ';'? Node('FallthroughStmt', kind='Stmt', children=[ Child('FallthroughKeyword', kind='FallthroughToken'), Child('Semicolon', kind='SemicolonToken', is_optional=True), ]), # break-stmt -> 'break' identifier? ';'? Node('BreakStmt', kind='Stmt', children=[ Child('BreakKeyword', kind='BreakToken'), Child('Label', kind='IdentifierToken', is_optional=True), Child('Semicolon', kind='SemicolonToken', is_optional=True), ]), # code-block -> '{' stmt-list '}' Node('CodeBlock', kind='Syntax', children=[ Child('OpenBrace', kind='LeftBraceToken'), Child('Statments', kind='StmtList'), Child('CloseBrace', kind='RightBraceToken'), ]), # case-item-list -> case-item case-item-list? Node('CaseItemList', kind='SyntaxCollection', element='CaseItem'), Node('Condition', kind='Syntax', children=[ Child('Condition', kind='Syntax'), Child('TrailingComma', kind='CommaToken', is_optional=True), ]), # condition-list -> condition # | condition ','? condition-list # condition -> expression # | availability-condition # | case-condition # | optional-binding-condition Node('ConditionList', kind='SyntaxCollection', element='Condition'), # A declaration in statement position. # struct Foo {}; Node('DeclarationStmt', kind='Stmt', children=[ Child('Declaration', kind='Decl'), Child('Semicolon', kind='SemicolonToken', is_optional=True), ]), # throw-stmt -> 'throw' expr ';'? Node('ThrowStmt', kind='Stmt', children=[ Child('ThrowKeyword', kind='ThrowToken'), Child('Expression', kind='Expr'), Child('Semicolon', kind='SemicolonToken', is_optional=True), ]), # if-stmt -> identifier? ':'? 'if' condition-list code-block # else-clause ';'? Node('IfStmt', kind='Stmt', children=[ Child('LabelName', kind='IdentifierToken', is_optional=True), Child('LabelColon', kind='ColonToken', is_optional=True), Child('IfKeyword', kind='IfToken'), Child('Conditions', kind='ConditionList'), Child('Body', kind='CodeBlock'), Child('ElseClause', kind='Syntax', is_optional=True), Child('Semicolon', kind='SemicolonToken', is_optional=True), ]), # else-if-continuation -> label? ':'? 'while' condition-list code-block ';' Node('ElseIfContinuation', kind='Syntax', children=[ Child('IfStatement', kind='IfStmt'), ]), # else-clause -> 'else' code-block Node('ElseBlock', kind='Syntax', children=[ Child('ElseKeyword', kind='ElseToken'), Child('Body', kind='CodeBlock'), Child('Semicolon', kind='SemicolonToken', is_optional=True), ]), # stmt-list -> stmt stmt-list? Node('StmtList', kind='SyntaxCollection', element='Stmt'), # switch-case -> switch-case-label stmt-list # | default-label stmt-list Node('SwitchCase', kind='Syntax', children=[ Child('Label', kind='Syntax'), Child('Body', kind='StmtList'), ]), # switch-default-label -> 'default' ':' Node('SwitchDefaultLabel', kind='Syntax', children=[ Child('DefaultKeyword', kind='DefaultToken'), Child('Colon', kind='ColonToken'), ]), # case-item -> pattern where-clause? ','? Node('CaseItem', kind='Syntax', children=[ Child('Pattern', kind='Pattern'), Child('WhereClause', kind='WhereClause', is_optional=True), Child('Comma', kind='CommaToken', is_optional=True), ]), # switch-case-label -> 'case' case-item-list ':' Node('SwitchCaseLabel', kind='Syntax', children=[ Child('CaseKeyword', kind='CaseToken'), Child('CaseItems', kind='CaseItemList'), Child('Colon', kind='ColonToken'), ]), # catch-clause 'catch' pattern? where-clause? code-block Node('CatchClause', kind='Syntax', children=[ Child('CatchKeyword', kind='CatchToken'), Child('Pattern', kind='Pattern', is_optional=True), Child('WhereClause', kind='WhereClause', is_optional=True), Child('Body', kind='CodeBlock'), ]), ]