Liqun Wu / Mbed 2 deprecated 90418_mbed_controller

Dependencies:   mbed

Committer:
wuliqunyy
Date:
Mon Jan 17 13:20:09 2022 +0000
Revision:
0:be95bfb06686
a working non_flat + adc_didt for ehp regulation version

Who changed what in which revision?

UserRevisionLine numberNew contents of line
wuliqunyy 0:be95bfb06686 1 /*-
wuliqunyy 0:be95bfb06686 2 * BSD 2-Clause License
wuliqunyy 0:be95bfb06686 3 *
wuliqunyy 0:be95bfb06686 4 * Copyright (c) 2012-2018, Jan Breuer
wuliqunyy 0:be95bfb06686 5 * All rights reserved.
wuliqunyy 0:be95bfb06686 6 *
wuliqunyy 0:be95bfb06686 7 * Redistribution and use in source and binary forms, with or without
wuliqunyy 0:be95bfb06686 8 * modification, are permitted provided that the following conditions are met:
wuliqunyy 0:be95bfb06686 9 *
wuliqunyy 0:be95bfb06686 10 * * Redistributions of source code must retain the above copyright notice, this
wuliqunyy 0:be95bfb06686 11 * list of conditions and the following disclaimer.
wuliqunyy 0:be95bfb06686 12 *
wuliqunyy 0:be95bfb06686 13 * * Redistributions in binary form must reproduce the above copyright notice,
wuliqunyy 0:be95bfb06686 14 * this list of conditions and the following disclaimer in the documentation
wuliqunyy 0:be95bfb06686 15 * and/or other materials provided with the distribution.
wuliqunyy 0:be95bfb06686 16 *
wuliqunyy 0:be95bfb06686 17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
wuliqunyy 0:be95bfb06686 18 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
wuliqunyy 0:be95bfb06686 19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
wuliqunyy 0:be95bfb06686 20 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
wuliqunyy 0:be95bfb06686 21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
wuliqunyy 0:be95bfb06686 22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
wuliqunyy 0:be95bfb06686 23 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
wuliqunyy 0:be95bfb06686 24 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
wuliqunyy 0:be95bfb06686 25 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
wuliqunyy 0:be95bfb06686 26 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
wuliqunyy 0:be95bfb06686 27 */
wuliqunyy 0:be95bfb06686 28
wuliqunyy 0:be95bfb06686 29 /**
wuliqunyy 0:be95bfb06686 30 * @file expression.c
wuliqunyy 0:be95bfb06686 31 *
wuliqunyy 0:be95bfb06686 32 * @brief Expressions handling
wuliqunyy 0:be95bfb06686 33 *
wuliqunyy 0:be95bfb06686 34 *
wuliqunyy 0:be95bfb06686 35 */
wuliqunyy 0:be95bfb06686 36
wuliqunyy 0:be95bfb06686 37 #include "scpi/expression.h"
wuliqunyy 0:be95bfb06686 38 #include "scpi/error.h"
wuliqunyy 0:be95bfb06686 39 #include "scpi/parser.h"
wuliqunyy 0:be95bfb06686 40
wuliqunyy 0:be95bfb06686 41 #include "lexer_private.h"
wuliqunyy 0:be95bfb06686 42
wuliqunyy 0:be95bfb06686 43 /**
wuliqunyy 0:be95bfb06686 44 * Parse one range or single value
wuliqunyy 0:be95bfb06686 45 * @param state lexer state
wuliqunyy 0:be95bfb06686 46 * @param isRange return true if parsed expression is range
wuliqunyy 0:be95bfb06686 47 * @param valueFrom return parsed value from
wuliqunyy 0:be95bfb06686 48 * @param valueTo return parsed value to
wuliqunyy 0:be95bfb06686 49 * @return SCPI_EXPR_OK - parsing was succesful
wuliqunyy 0:be95bfb06686 50 * SCPI_EXPR_ERROR - parser error
wuliqunyy 0:be95bfb06686 51 * SCPI_EXPR_NO_MORE - no more data
wuliqunyy 0:be95bfb06686 52 */
wuliqunyy 0:be95bfb06686 53 static scpi_expr_result_t numericRange(lex_state_t * state, scpi_bool_t * isRange, scpi_token_t * valueFrom, scpi_token_t * valueTo) {
wuliqunyy 0:be95bfb06686 54 if (scpiLex_DecimalNumericProgramData(state, valueFrom)) {
wuliqunyy 0:be95bfb06686 55 if (scpiLex_Colon(state, valueTo)) {
wuliqunyy 0:be95bfb06686 56 *isRange = TRUE;
wuliqunyy 0:be95bfb06686 57 if (scpiLex_DecimalNumericProgramData(state, valueTo)) {
wuliqunyy 0:be95bfb06686 58 return SCPI_EXPR_OK;
wuliqunyy 0:be95bfb06686 59 } else {
wuliqunyy 0:be95bfb06686 60 return SCPI_EXPR_ERROR;
wuliqunyy 0:be95bfb06686 61 }
wuliqunyy 0:be95bfb06686 62 } else {
wuliqunyy 0:be95bfb06686 63 *isRange = FALSE;
wuliqunyy 0:be95bfb06686 64 return SCPI_EXPR_OK;
wuliqunyy 0:be95bfb06686 65 }
wuliqunyy 0:be95bfb06686 66 }
wuliqunyy 0:be95bfb06686 67
wuliqunyy 0:be95bfb06686 68 return SCPI_EXPR_NO_MORE;
wuliqunyy 0:be95bfb06686 69 }
wuliqunyy 0:be95bfb06686 70
wuliqunyy 0:be95bfb06686 71 /**
wuliqunyy 0:be95bfb06686 72 * Parse entry on specified position
wuliqunyy 0:be95bfb06686 73 * @param context scpi context
wuliqunyy 0:be95bfb06686 74 * @param param input parameter
wuliqunyy 0:be95bfb06686 75 * @param index index of position (start from 0)
wuliqunyy 0:be95bfb06686 76 * @param isRange return true if expression at index was range
wuliqunyy 0:be95bfb06686 77 * @param valueFrom return value from
wuliqunyy 0:be95bfb06686 78 * @param valueTo return value to
wuliqunyy 0:be95bfb06686 79 * @return SCPI_EXPR_OK - parsing was succesful
wuliqunyy 0:be95bfb06686 80 * SCPI_EXPR_ERROR - parser error
wuliqunyy 0:be95bfb06686 81 * SCPI_EXPR_NO_MORE - no more data
wuliqunyy 0:be95bfb06686 82 * @see SCPI_ExprNumericListEntryInt, SCPI_ExprNumericListEntryDouble
wuliqunyy 0:be95bfb06686 83 */
wuliqunyy 0:be95bfb06686 84 scpi_expr_result_t SCPI_ExprNumericListEntry(scpi_t * context, scpi_parameter_t * param, int index, scpi_bool_t * isRange, scpi_parameter_t * valueFrom, scpi_parameter_t * valueTo) {
wuliqunyy 0:be95bfb06686 85 lex_state_t lex;
wuliqunyy 0:be95bfb06686 86 int i;
wuliqunyy 0:be95bfb06686 87 scpi_expr_result_t res = SCPI_EXPR_OK;
wuliqunyy 0:be95bfb06686 88
wuliqunyy 0:be95bfb06686 89 if (!isRange || !valueFrom || !valueTo || !param) {
wuliqunyy 0:be95bfb06686 90 SCPI_ErrorPush(context, SCPI_ERROR_SYSTEM_ERROR);
wuliqunyy 0:be95bfb06686 91 return SCPI_EXPR_ERROR;
wuliqunyy 0:be95bfb06686 92 }
wuliqunyy 0:be95bfb06686 93
wuliqunyy 0:be95bfb06686 94 if (param->type != SCPI_TOKEN_PROGRAM_EXPRESSION) {
wuliqunyy 0:be95bfb06686 95 SCPI_ErrorPush(context, SCPI_ERROR_DATA_TYPE_ERROR);
wuliqunyy 0:be95bfb06686 96 return SCPI_EXPR_ERROR;
wuliqunyy 0:be95bfb06686 97 }
wuliqunyy 0:be95bfb06686 98
wuliqunyy 0:be95bfb06686 99 lex.buffer = param->ptr + 1;
wuliqunyy 0:be95bfb06686 100 lex.pos = lex.buffer;
wuliqunyy 0:be95bfb06686 101 lex.len = param->len - 2;
wuliqunyy 0:be95bfb06686 102
wuliqunyy 0:be95bfb06686 103 for (i = 0; i <= index; i++) {
wuliqunyy 0:be95bfb06686 104 res = numericRange(&lex, isRange, valueFrom, valueTo);
wuliqunyy 0:be95bfb06686 105 if (res != SCPI_EXPR_OK) {
wuliqunyy 0:be95bfb06686 106 break;
wuliqunyy 0:be95bfb06686 107 }
wuliqunyy 0:be95bfb06686 108 if (i != index) {
wuliqunyy 0:be95bfb06686 109 if (!scpiLex_Comma(&lex, valueFrom)) {
wuliqunyy 0:be95bfb06686 110 res = scpiLex_IsEos(&lex) ? SCPI_EXPR_NO_MORE : SCPI_EXPR_ERROR;
wuliqunyy 0:be95bfb06686 111 break;
wuliqunyy 0:be95bfb06686 112 }
wuliqunyy 0:be95bfb06686 113 }
wuliqunyy 0:be95bfb06686 114 }
wuliqunyy 0:be95bfb06686 115
wuliqunyy 0:be95bfb06686 116 if (res == SCPI_EXPR_ERROR) {
wuliqunyy 0:be95bfb06686 117 SCPI_ErrorPush(context, SCPI_ERROR_EXPRESSION_PARSING_ERROR);
wuliqunyy 0:be95bfb06686 118 }
wuliqunyy 0:be95bfb06686 119 return res;
wuliqunyy 0:be95bfb06686 120 }
wuliqunyy 0:be95bfb06686 121
wuliqunyy 0:be95bfb06686 122 /**
wuliqunyy 0:be95bfb06686 123 * Parse entry on specified position and convert result to int32_t
wuliqunyy 0:be95bfb06686 124 * @param context scpi context
wuliqunyy 0:be95bfb06686 125 * @param param input parameter
wuliqunyy 0:be95bfb06686 126 * @param index index of position (start from 0)
wuliqunyy 0:be95bfb06686 127 * @param isRange return true if expression at index was range
wuliqunyy 0:be95bfb06686 128 * @param valueFrom return value from
wuliqunyy 0:be95bfb06686 129 * @param valueTo return value to
wuliqunyy 0:be95bfb06686 130 * @return SCPI_EXPR_OK - parsing was succesful
wuliqunyy 0:be95bfb06686 131 * SCPI_EXPR_ERROR - parser error
wuliqunyy 0:be95bfb06686 132 * SCPI_EXPR_NO_MORE - no more data
wuliqunyy 0:be95bfb06686 133 * @see SCPI_ExprNumericListEntry, SCPI_ExprNumericListEntryDouble
wuliqunyy 0:be95bfb06686 134 */
wuliqunyy 0:be95bfb06686 135 scpi_expr_result_t SCPI_ExprNumericListEntryInt(scpi_t * context, scpi_parameter_t * param, int index, scpi_bool_t * isRange, int32_t * valueFrom, int32_t * valueTo) {
wuliqunyy 0:be95bfb06686 136 scpi_expr_result_t res;
wuliqunyy 0:be95bfb06686 137 scpi_bool_t range = FALSE;
wuliqunyy 0:be95bfb06686 138 scpi_parameter_t paramFrom;
wuliqunyy 0:be95bfb06686 139 scpi_parameter_t paramTo;
wuliqunyy 0:be95bfb06686 140
wuliqunyy 0:be95bfb06686 141 res = SCPI_ExprNumericListEntry(context, param, index, &range, &paramFrom, &paramTo);
wuliqunyy 0:be95bfb06686 142 if (res == SCPI_EXPR_OK) {
wuliqunyy 0:be95bfb06686 143 *isRange = range;
wuliqunyy 0:be95bfb06686 144 SCPI_ParamToInt32(context, &paramFrom, valueFrom);
wuliqunyy 0:be95bfb06686 145 if (range) {
wuliqunyy 0:be95bfb06686 146 SCPI_ParamToInt32(context, &paramTo, valueTo);
wuliqunyy 0:be95bfb06686 147 }
wuliqunyy 0:be95bfb06686 148 }
wuliqunyy 0:be95bfb06686 149
wuliqunyy 0:be95bfb06686 150 return res;
wuliqunyy 0:be95bfb06686 151 }
wuliqunyy 0:be95bfb06686 152
wuliqunyy 0:be95bfb06686 153 /**
wuliqunyy 0:be95bfb06686 154 * Parse entry on specified position and convert result to double
wuliqunyy 0:be95bfb06686 155 * @param context scpi context
wuliqunyy 0:be95bfb06686 156 * @param param input parameter
wuliqunyy 0:be95bfb06686 157 * @param index index of position (start from 0)
wuliqunyy 0:be95bfb06686 158 * @param isRange return true if expression at index was range
wuliqunyy 0:be95bfb06686 159 * @param valueFrom return value from
wuliqunyy 0:be95bfb06686 160 * @param valueTo return value to
wuliqunyy 0:be95bfb06686 161 * @return SCPI_EXPR_OK - parsing was succesful
wuliqunyy 0:be95bfb06686 162 * SCPI_EXPR_ERROR - parser error
wuliqunyy 0:be95bfb06686 163 * SCPI_EXPR_NO_MORE - no more data
wuliqunyy 0:be95bfb06686 164 * @see SCPI_ExprNumericListEntry, SCPI_ExprNumericListEntryInt
wuliqunyy 0:be95bfb06686 165 */
wuliqunyy 0:be95bfb06686 166 scpi_expr_result_t SCPI_ExprNumericListEntryDouble(scpi_t * context, scpi_parameter_t * param, int index, scpi_bool_t * isRange, double * valueFrom, double * valueTo) {
wuliqunyy 0:be95bfb06686 167 scpi_expr_result_t res;
wuliqunyy 0:be95bfb06686 168 scpi_bool_t range = FALSE;
wuliqunyy 0:be95bfb06686 169 scpi_parameter_t paramFrom;
wuliqunyy 0:be95bfb06686 170 scpi_parameter_t paramTo;
wuliqunyy 0:be95bfb06686 171
wuliqunyy 0:be95bfb06686 172 res = SCPI_ExprNumericListEntry(context, param, index, &range, &paramFrom, &paramTo);
wuliqunyy 0:be95bfb06686 173 if (res == SCPI_EXPR_OK) {
wuliqunyy 0:be95bfb06686 174 *isRange = range;
wuliqunyy 0:be95bfb06686 175 SCPI_ParamToDouble(context, &paramFrom, valueFrom);
wuliqunyy 0:be95bfb06686 176 if (range) {
wuliqunyy 0:be95bfb06686 177 SCPI_ParamToDouble(context, &paramTo, valueTo);
wuliqunyy 0:be95bfb06686 178 }
wuliqunyy 0:be95bfb06686 179 }
wuliqunyy 0:be95bfb06686 180
wuliqunyy 0:be95bfb06686 181 return res;
wuliqunyy 0:be95bfb06686 182 }
wuliqunyy 0:be95bfb06686 183
wuliqunyy 0:be95bfb06686 184 /**
wuliqunyy 0:be95bfb06686 185 * Parse one channel_spec e.g. "1!5!8"
wuliqunyy 0:be95bfb06686 186 * @param context
wuliqunyy 0:be95bfb06686 187 * @param state lexer state
wuliqunyy 0:be95bfb06686 188 * @param values range values
wuliqunyy 0:be95bfb06686 189 * @param length length of values array
wuliqunyy 0:be95bfb06686 190 * @param dimensions real number of dimensions
wuliqunyy 0:be95bfb06686 191 */
wuliqunyy 0:be95bfb06686 192 static scpi_expr_result_t channelSpec(scpi_t * context, lex_state_t * state, int32_t * values, size_t length, size_t * dimensions) {
wuliqunyy 0:be95bfb06686 193 scpi_parameter_t param;
wuliqunyy 0:be95bfb06686 194 size_t i = 0;
wuliqunyy 0:be95bfb06686 195 while (scpiLex_DecimalNumericProgramData(state, &param)) {
wuliqunyy 0:be95bfb06686 196 if (i < length) {
wuliqunyy 0:be95bfb06686 197 SCPI_ParamToInt32(context, &param, &values[i]);
wuliqunyy 0:be95bfb06686 198 }
wuliqunyy 0:be95bfb06686 199
wuliqunyy 0:be95bfb06686 200 if (scpiLex_SpecificCharacter(state, &param, '!')) {
wuliqunyy 0:be95bfb06686 201 i++;
wuliqunyy 0:be95bfb06686 202 } else {
wuliqunyy 0:be95bfb06686 203 *dimensions = i + 1;
wuliqunyy 0:be95bfb06686 204 return SCPI_EXPR_OK;
wuliqunyy 0:be95bfb06686 205 }
wuliqunyy 0:be95bfb06686 206 }
wuliqunyy 0:be95bfb06686 207
wuliqunyy 0:be95bfb06686 208 if (i == 0) {
wuliqunyy 0:be95bfb06686 209 return SCPI_EXPR_NO_MORE;
wuliqunyy 0:be95bfb06686 210 } else {
wuliqunyy 0:be95bfb06686 211 /* there was at least one number followed by !, but after ! was not another number */
wuliqunyy 0:be95bfb06686 212 return SCPI_EXPR_ERROR;
wuliqunyy 0:be95bfb06686 213 }
wuliqunyy 0:be95bfb06686 214 }
wuliqunyy 0:be95bfb06686 215
wuliqunyy 0:be95bfb06686 216 /**
wuliqunyy 0:be95bfb06686 217 * Parse channel_range e.g. "1!2:5!6"
wuliqunyy 0:be95bfb06686 218 * @param context
wuliqunyy 0:be95bfb06686 219 * @param state lexer state
wuliqunyy 0:be95bfb06686 220 * @param isRange return true if it is range
wuliqunyy 0:be95bfb06686 221 * @param valuesFrom return array of values from
wuliqunyy 0:be95bfb06686 222 * @param valuesTo return array of values to
wuliqunyy 0:be95bfb06686 223 * @param length length of values arrays
wuliqunyy 0:be95bfb06686 224 * @param dimensions real number of dimensions
wuliqunyy 0:be95bfb06686 225 */
wuliqunyy 0:be95bfb06686 226 static scpi_expr_result_t channelRange(scpi_t * context, lex_state_t * state, scpi_bool_t * isRange, int32_t * valuesFrom, int32_t * valuesTo, size_t length, size_t * dimensions) {
wuliqunyy 0:be95bfb06686 227 scpi_token_t token;
wuliqunyy 0:be95bfb06686 228 scpi_expr_result_t err;
wuliqunyy 0:be95bfb06686 229 size_t fromDimensions;
wuliqunyy 0:be95bfb06686 230 size_t toDimensions;
wuliqunyy 0:be95bfb06686 231
wuliqunyy 0:be95bfb06686 232 err = channelSpec(context, state, valuesFrom, length, &fromDimensions);
wuliqunyy 0:be95bfb06686 233 if (err == SCPI_EXPR_OK) {
wuliqunyy 0:be95bfb06686 234 if (scpiLex_Colon(state, &token)) {
wuliqunyy 0:be95bfb06686 235 *isRange = TRUE;
wuliqunyy 0:be95bfb06686 236 err = channelSpec(context, state, valuesTo, length, &toDimensions);
wuliqunyy 0:be95bfb06686 237 if (err != SCPI_EXPR_OK) {
wuliqunyy 0:be95bfb06686 238 return SCPI_EXPR_ERROR;
wuliqunyy 0:be95bfb06686 239 }
wuliqunyy 0:be95bfb06686 240 if (fromDimensions != toDimensions) {
wuliqunyy 0:be95bfb06686 241 return SCPI_EXPR_ERROR;
wuliqunyy 0:be95bfb06686 242 }
wuliqunyy 0:be95bfb06686 243 *dimensions = fromDimensions;
wuliqunyy 0:be95bfb06686 244 } else {
wuliqunyy 0:be95bfb06686 245 *isRange = FALSE;
wuliqunyy 0:be95bfb06686 246 *dimensions = fromDimensions;
wuliqunyy 0:be95bfb06686 247 return SCPI_EXPR_OK;
wuliqunyy 0:be95bfb06686 248 }
wuliqunyy 0:be95bfb06686 249 } else if (err == SCPI_EXPR_NO_MORE) {
wuliqunyy 0:be95bfb06686 250 err = SCPI_EXPR_ERROR;
wuliqunyy 0:be95bfb06686 251 }
wuliqunyy 0:be95bfb06686 252
wuliqunyy 0:be95bfb06686 253 return err;
wuliqunyy 0:be95bfb06686 254 }
wuliqunyy 0:be95bfb06686 255
wuliqunyy 0:be95bfb06686 256 /**
wuliqunyy 0:be95bfb06686 257 * Parse one list entry at specific position e.g. "1!2:5!6"
wuliqunyy 0:be95bfb06686 258 * @param context
wuliqunyy 0:be95bfb06686 259 * @param param
wuliqunyy 0:be95bfb06686 260 * @param index
wuliqunyy 0:be95bfb06686 261 * @param isRange return true if it is range
wuliqunyy 0:be95bfb06686 262 * @param valuesFrom return array of values from
wuliqunyy 0:be95bfb06686 263 * @param valuesTo return array of values to
wuliqunyy 0:be95bfb06686 264 * @param length length of values arrays
wuliqunyy 0:be95bfb06686 265 * @param dimensions real number of dimensions
wuliqunyy 0:be95bfb06686 266 */
wuliqunyy 0:be95bfb06686 267 scpi_expr_result_t SCPI_ExprChannelListEntry(scpi_t * context, scpi_parameter_t * param, int index, scpi_bool_t * isRange, int32_t * valuesFrom, int32_t * valuesTo, size_t length, size_t * dimensions) {
wuliqunyy 0:be95bfb06686 268 lex_state_t lex;
wuliqunyy 0:be95bfb06686 269 int i;
wuliqunyy 0:be95bfb06686 270 scpi_expr_result_t res = SCPI_EXPR_OK;
wuliqunyy 0:be95bfb06686 271 scpi_token_t token;
wuliqunyy 0:be95bfb06686 272
wuliqunyy 0:be95bfb06686 273 if (!isRange || !param || !dimensions || (length && (!valuesFrom || !valuesTo))) {
wuliqunyy 0:be95bfb06686 274 SCPI_ErrorPush(context, SCPI_ERROR_SYSTEM_ERROR);
wuliqunyy 0:be95bfb06686 275 return SCPI_EXPR_ERROR;
wuliqunyy 0:be95bfb06686 276 }
wuliqunyy 0:be95bfb06686 277
wuliqunyy 0:be95bfb06686 278 if (param->type != SCPI_TOKEN_PROGRAM_EXPRESSION) {
wuliqunyy 0:be95bfb06686 279 SCPI_ErrorPush(context, SCPI_ERROR_DATA_TYPE_ERROR);
wuliqunyy 0:be95bfb06686 280 return SCPI_EXPR_ERROR;
wuliqunyy 0:be95bfb06686 281 }
wuliqunyy 0:be95bfb06686 282
wuliqunyy 0:be95bfb06686 283 lex.buffer = param->ptr + 1;
wuliqunyy 0:be95bfb06686 284 lex.pos = lex.buffer;
wuliqunyy 0:be95bfb06686 285 lex.len = param->len - 2;
wuliqunyy 0:be95bfb06686 286
wuliqunyy 0:be95bfb06686 287 /* detect channel list expression */
wuliqunyy 0:be95bfb06686 288 if (!scpiLex_SpecificCharacter(&lex, &token, '@')) {
wuliqunyy 0:be95bfb06686 289 SCPI_ErrorPush(context, SCPI_ERROR_EXPRESSION_PARSING_ERROR);
wuliqunyy 0:be95bfb06686 290 return SCPI_EXPR_ERROR;
wuliqunyy 0:be95bfb06686 291 }
wuliqunyy 0:be95bfb06686 292
wuliqunyy 0:be95bfb06686 293 for (i = 0; i <= index; i++) {
wuliqunyy 0:be95bfb06686 294 res = channelRange(context, &lex, isRange, valuesFrom, valuesTo, (i == index) ? length : 0, dimensions);
wuliqunyy 0:be95bfb06686 295 if (res != SCPI_EXPR_OK) {
wuliqunyy 0:be95bfb06686 296 break;
wuliqunyy 0:be95bfb06686 297 }
wuliqunyy 0:be95bfb06686 298 if (i != index) {
wuliqunyy 0:be95bfb06686 299 if (!scpiLex_Comma(&lex, &token)) {
wuliqunyy 0:be95bfb06686 300 res = scpiLex_IsEos(&lex) ? SCPI_EXPR_NO_MORE : SCPI_EXPR_ERROR;
wuliqunyy 0:be95bfb06686 301 break;
wuliqunyy 0:be95bfb06686 302 }
wuliqunyy 0:be95bfb06686 303 }
wuliqunyy 0:be95bfb06686 304 }
wuliqunyy 0:be95bfb06686 305
wuliqunyy 0:be95bfb06686 306 if (res == SCPI_EXPR_ERROR) {
wuliqunyy 0:be95bfb06686 307 SCPI_ErrorPush(context, SCPI_ERROR_EXPRESSION_PARSING_ERROR);
wuliqunyy 0:be95bfb06686 308 }
wuliqunyy 0:be95bfb06686 309 if (res == SCPI_EXPR_NO_MORE) {
wuliqunyy 0:be95bfb06686 310 if (!scpiLex_IsEos(&lex)) {
wuliqunyy 0:be95bfb06686 311 res = SCPI_EXPR_ERROR;
wuliqunyy 0:be95bfb06686 312 SCPI_ErrorPush(context, SCPI_ERROR_EXPRESSION_PARSING_ERROR);
wuliqunyy 0:be95bfb06686 313 }
wuliqunyy 0:be95bfb06686 314 }
wuliqunyy 0:be95bfb06686 315 return res;
wuliqunyy 0:be95bfb06686 316 }
wuliqunyy 0:be95bfb06686 317