(prec iast.Precedence)
| 981 | } |
| 982 | |
| 983 | func (p *parser) parse(prec iast.Precedence) (ast.Node, errors.StaticError) { |
| 984 | begin := p.peek() |
| 985 | |
| 986 | switch begin.kind { |
| 987 | // These cases have effectively iast.MaxPrecedence as the first |
| 988 | // call to parse will parse them. |
| 989 | case tokenAssert: |
| 990 | p.pop() |
| 991 | cond, err := p.parse(iast.MaxPrecedence) |
| 992 | if err != nil { |
| 993 | return nil, err |
| 994 | } |
| 995 | var msg ast.Node |
| 996 | var colonFodder ast.Fodder |
| 997 | if p.peek().kind == tokenOperator && p.peek().data == ":" { |
| 998 | colon := p.pop() |
| 999 | colonFodder = colon.fodder |
| 1000 | msg, err = p.parse(iast.MaxPrecedence) |
| 1001 | if err != nil { |
| 1002 | return nil, err |
| 1003 | } |
| 1004 | } |
| 1005 | semicolon, err := p.popExpect(tokenSemicolon) |
| 1006 | if err != nil { |
| 1007 | return nil, err |
| 1008 | } |
| 1009 | rest, err := p.parse(iast.MaxPrecedence) |
| 1010 | if err != nil { |
| 1011 | return nil, err |
| 1012 | } |
| 1013 | return &ast.Assert{ |
| 1014 | NodeBase: ast.NewNodeBaseLoc(locFromTokenAST(begin, rest), begin.fodder), |
| 1015 | Cond: cond, |
| 1016 | ColonFodder: colonFodder, |
| 1017 | Message: msg, |
| 1018 | SemicolonFodder: semicolon.fodder, |
| 1019 | Rest: rest, |
| 1020 | }, nil |
| 1021 | |
| 1022 | case tokenError: |
| 1023 | p.pop() |
| 1024 | expr, err := p.parse(iast.MaxPrecedence) |
| 1025 | if err != nil { |
| 1026 | return nil, err |
| 1027 | } |
| 1028 | return &ast.Error{ |
| 1029 | NodeBase: ast.NewNodeBaseLoc(locFromTokenAST(begin, expr), begin.fodder), |
| 1030 | Expr: expr, |
| 1031 | }, nil |
| 1032 | |
| 1033 | case tokenIf: |
| 1034 | p.pop() |
| 1035 | cond, err := p.parse(iast.MaxPrecedence) |
| 1036 | if err != nil { |
| 1037 | return nil, err |
| 1038 | } |
| 1039 | thenToken, err := p.popExpect(tokenThen) |
| 1040 | if err != nil { |
no test coverage detected