diff options
author | Wim <wim@42.be> | 2022-11-27 00:42:16 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-11-27 00:42:16 +0100 |
commit | 4fd0a7672777f0ed15692ae2ba47838208537558 (patch) | |
tree | b119834a8b9ee78aa8f1b2ad05efa7da50516cbf /vendor/modernc.org/cc/v3/parser.go | |
parent | 6da9d567dc9195e9a5211f23a6795a41f56a1bfc (diff) | |
download | matterbridge-msglm-4fd0a7672777f0ed15692ae2ba47838208537558.tar.gz matterbridge-msglm-4fd0a7672777f0ed15692ae2ba47838208537558.tar.bz2 matterbridge-msglm-4fd0a7672777f0ed15692ae2ba47838208537558.zip |
Update dependencies (#1929)
Diffstat (limited to 'vendor/modernc.org/cc/v3/parser.go')
-rw-r--r-- | vendor/modernc.org/cc/v3/parser.go | 73 |
1 files changed, 46 insertions, 27 deletions
diff --git a/vendor/modernc.org/cc/v3/parser.go b/vendor/modernc.org/cc/v3/parser.go index d73b2c6b..a2b5f3c7 100644 --- a/vendor/modernc.org/cc/v3/parser.go +++ b/vendor/modernc.org/cc/v3/parser.go @@ -3162,28 +3162,49 @@ func (p *parser) designator(acceptCol bool) (*Designator, bool) { // iteration-statement // jump-statement // asm-statement -func (p *parser) statement() *Statement { - switch p.rune() { - case IDENTIFIER: - if p.peek(false) == ':' { - return &Statement{Case: StatementLabeled, LabeledStatement: p.labeledStatement()} +func (p *parser) statement() (r *Statement) { + var r0 *Statement + var prevLS, ls *LabeledStatement + + defer func() { + if ls != nil { + ls.Statement = r + r = r0 } + }() - return &Statement{Case: StatementExpr, ExpressionStatement: p.expressionStatement()} - case '{': - return &Statement{Case: StatementCompound, CompoundStatement: p.compoundStatement(nil, nil)} - case IF, SWITCH: - return &Statement{Case: StatementSelection, SelectionStatement: p.selectionStatement()} - case WHILE, DO, FOR: - return &Statement{Case: StatementIteration, IterationStatement: p.iterationStatement()} - case GOTO, BREAK, CONTINUE, RETURN: - return &Statement{Case: StatementJump, JumpStatement: p.jumpStatement()} - case CASE, DEFAULT: - return &Statement{Case: StatementLabeled, LabeledStatement: p.labeledStatement()} - case ASM: - return &Statement{Case: StatementAsm, AsmStatement: p.asmStatement()} - default: - return &Statement{Case: StatementExpr, ExpressionStatement: p.expressionStatement()} + for { + switch p.rune() { + case IDENTIFIER: + switch { + case p.peek(false) == ':': + ls = p.labeledStatement() + default: + return &Statement{Case: StatementExpr, ExpressionStatement: p.expressionStatement()} + } + case '{': + return &Statement{Case: StatementCompound, CompoundStatement: p.compoundStatement(nil, nil)} + case IF, SWITCH: + return &Statement{Case: StatementSelection, SelectionStatement: p.selectionStatement()} + case WHILE, DO, FOR: + return &Statement{Case: StatementIteration, IterationStatement: p.iterationStatement()} + case GOTO, BREAK, CONTINUE, RETURN: + return &Statement{Case: StatementJump, JumpStatement: p.jumpStatement()} + case CASE, DEFAULT: + ls = p.labeledStatement() + case ASM: + return &Statement{Case: StatementAsm, AsmStatement: p.asmStatement()} + default: + return &Statement{Case: StatementExpr, ExpressionStatement: p.expressionStatement()} + } + + switch { + case r0 == nil: + r0 = &Statement{Case: StatementLabeled, LabeledStatement: ls} + default: + prevLS.Statement = &Statement{Case: StatementLabeled, LabeledStatement: ls} + } + prevLS = ls } } @@ -3220,7 +3241,7 @@ func (p *parser) labeledStatement() (r *LabeledStatement) { p.block.hasLabel() r = &LabeledStatement{ Case: LabeledStatementLabel, Token: t, Token2: t2, AttributeSpecifierList: attr, - Statement: p.statement(), lexicalScope: p.declScope, block: p.block, + lexicalScope: p.declScope, block: p.block, } p.declScope.declare(t.Value, r) return r @@ -3246,8 +3267,7 @@ func (p *parser) labeledStatement() (r *LabeledStatement) { return &LabeledStatement{ Case: LabeledStatementRange, Token: t, ConstantExpression: e, Token2: t2, ConstantExpression2: e2, Token3: t3, - Statement: p.statement(), lexicalScope: p.declScope, - block: p.block, + lexicalScope: p.declScope, block: p.block, } case ':': t2 = p.shift() @@ -3256,8 +3276,7 @@ func (p *parser) labeledStatement() (r *LabeledStatement) { } return &LabeledStatement{ Case: LabeledStatementCaseLabel, Token: t, ConstantExpression: e, - Token2: t2, Statement: p.statement(), lexicalScope: p.declScope, - block: p.block, + Token2: t2, lexicalScope: p.declScope, block: p.block, } case DEFAULT: if p.switches == 0 { @@ -3271,12 +3290,12 @@ func (p *parser) labeledStatement() (r *LabeledStatement) { p.err("expected :") } return &LabeledStatement{ - Case: LabeledStatementDefault, Token: t, Token2: t2, Statement: p.statement(), + Case: LabeledStatementDefault, Token: t, Token2: t2, lexicalScope: p.declScope, block: p.block, } default: p.err("expected labeled-statement") - return nil + return &LabeledStatement{} } } |