()
| 1116 | } |
| 1117 | |
| 1118 | func (self *_parser) parseLogicalOrExpression() ast.Expression { |
| 1119 | var idx file.Idx |
| 1120 | parenthesis := self.token == token.LEFT_PARENTHESIS |
| 1121 | left := self.parseLogicalAndExpression() |
| 1122 | |
| 1123 | if self.token == token.LOGICAL_OR || !parenthesis && isLogicalAndExpr(left) { |
| 1124 | for { |
| 1125 | switch self.token { |
| 1126 | case token.LOGICAL_OR: |
| 1127 | self.next() |
| 1128 | left = &ast.BinaryExpression{ |
| 1129 | Operator: token.LOGICAL_OR, |
| 1130 | Left: left, |
| 1131 | Right: self.parseLogicalAndExpression(), |
| 1132 | } |
| 1133 | case token.COALESCE: |
| 1134 | idx = self.idx |
| 1135 | goto mixed |
| 1136 | default: |
| 1137 | return left |
| 1138 | } |
| 1139 | } |
| 1140 | } else { |
| 1141 | for { |
| 1142 | switch self.token { |
| 1143 | case token.COALESCE: |
| 1144 | idx = self.idx |
| 1145 | self.next() |
| 1146 | |
| 1147 | parenthesis := self.token == token.LEFT_PARENTHESIS |
| 1148 | right := self.parseLogicalAndExpression() |
| 1149 | if !parenthesis && isLogicalAndExpr(right) { |
| 1150 | goto mixed |
| 1151 | } |
| 1152 | |
| 1153 | left = &ast.BinaryExpression{ |
| 1154 | Operator: token.COALESCE, |
| 1155 | Left: left, |
| 1156 | Right: right, |
| 1157 | } |
| 1158 | case token.LOGICAL_OR: |
| 1159 | idx = self.idx |
| 1160 | goto mixed |
| 1161 | default: |
| 1162 | return left |
| 1163 | } |
| 1164 | } |
| 1165 | } |
| 1166 | |
| 1167 | mixed: |
| 1168 | self.error(idx, "Logical expressions and coalesce expressions cannot be mixed. Wrap either by parentheses") |
| 1169 | return left |
| 1170 | } |
| 1171 | |
| 1172 | func (self *_parser) parseConditionalExpression() ast.Expression { |
| 1173 | left := self.parseLogicalOrExpression() |
no test coverage detected