Refactor token_t and token_type_t to have scpi_ prefix
| | |
| | | typedef int (*scpi_error_callback_t)(scpi_t * context, int_fast16_t error); |
| | | |
| | | /* scpi lexer */ |
| | | enum _token_type_t { |
| | | enum _scpi_token_type_t { |
| | | TokComma, |
| | | TokSemicolon, |
| | | TokQuiestion, |
| | |
| | | TokInvalid, |
| | | TokUnknown, |
| | | }; |
| | | typedef enum _token_type_t token_type_t; |
| | | typedef enum _scpi_token_type_t scpi_token_type_t; |
| | | |
| | | struct _token_t { |
| | | token_type_t type; |
| | | struct _scpi_token_t { |
| | | scpi_token_type_t type; |
| | | const char * ptr; |
| | | int len; |
| | | }; |
| | | typedef struct _token_t token_t; |
| | | typedef struct _scpi_token_t scpi_token_t; |
| | | |
| | | struct _lex_state_t { |
| | | const char * buffer; |
| | |
| | | typedef enum _message_termination_t message_termination_t; |
| | | |
| | | struct _scpi_parser_state_t { |
| | | token_t programHeader; |
| | | token_t programData; |
| | | scpi_token_t programHeader; |
| | | scpi_token_t programData; |
| | | int numberOfParameters; |
| | | message_termination_t termination; |
| | | }; |
| | |
| | | typedef struct _scpi_data_parameter_t scpi_data_parameter_t; |
| | | |
| | | struct _scpi_parameter_t { |
| | | token_type_t type; |
| | | scpi_token_type_t type; |
| | | scpi_data_parameter_t data; |
| | | scpi_number_parameter_t number; |
| | | }; |
| | |
| | | } |
| | | |
| | | /* tokens */ |
| | | int lexWhiteSpace(lex_state_t * state, token_t * token) { |
| | | int lexWhiteSpace(lex_state_t * state, scpi_token_t * token) { |
| | | token->ptr = state->pos; |
| | | |
| | | skipWs(state); |
| | |
| | | } |
| | | } |
| | | |
| | | int lexProgramHeader(lex_state_t * state, token_t * token) { |
| | | int lexProgramHeader(lex_state_t * state, scpi_token_t * token) { |
| | | int res; |
| | | token->ptr = state->pos; |
| | | token->type = TokUnknown; |
| | |
| | | } |
| | | |
| | | /* 7.7.1 <CHARACTER PROGRAM DATA> */ |
| | | int lexCharacterProgramData(lex_state_t * state, token_t * token) { |
| | | int lexCharacterProgramData(lex_state_t * state, scpi_token_t * token) { |
| | | token->ptr = state->pos; |
| | | |
| | | if (!iseos(state) && isalpha(state->pos[0])) { |
| | |
| | | return someNumbers; |
| | | } |
| | | |
| | | int lexDecimalNumericProgramData(lex_state_t * state, token_t * token) { |
| | | int lexDecimalNumericProgramData(lex_state_t * state, scpi_token_t * token) { |
| | | const char * rollback; |
| | | token->ptr = state->pos; |
| | | |
| | |
| | | } |
| | | |
| | | /* 7.7.3 <SUFFIX PROGRAM DATA> */ |
| | | int lexSuffixProgramData(lex_state_t * state, token_t * token) { |
| | | int lexSuffixProgramData(lex_state_t * state, scpi_token_t * token) { |
| | | token->ptr = state->pos; |
| | | |
| | | skipChr(state, '/'); |
| | |
| | | return someNumbers; |
| | | } |
| | | |
| | | int lexNondecimalNumericData(lex_state_t * state, token_t * token) { |
| | | int lexNondecimalNumericData(lex_state_t * state, scpi_token_t * token) { |
| | | token->ptr = state->pos; |
| | | int someNumbers = 0; |
| | | if (skipChr(state, '#')) { |
| | |
| | | skipQuoteProgramData(state, '\''); |
| | | } |
| | | |
| | | int lexStringProgramData(lex_state_t * state, token_t * token) { |
| | | int lexStringProgramData(lex_state_t * state, scpi_token_t * token) { |
| | | token->ptr = state->pos; |
| | | |
| | | if (!iseos(state)) { |
| | |
| | | return isdigit(c) && (c != '0'); |
| | | } |
| | | |
| | | int lexArbitraryBlockProgramData(lex_state_t * state, token_t * token) { |
| | | int lexArbitraryBlockProgramData(lex_state_t * state, scpi_token_t * token) { |
| | | int i; |
| | | int j = 0; |
| | | const char * ptr = state->pos; |
| | |
| | | |
| | | // TODO: 7.7.7.2-2 recursive - any program data |
| | | |
| | | int lexProgramExpression(lex_state_t * state, token_t * token) { |
| | | int lexProgramExpression(lex_state_t * state, scpi_token_t * token) { |
| | | token->ptr = state->pos; |
| | | |
| | | if (!iseos(state) && ischr(state, '(')) { |
| | |
| | | return token->len; |
| | | } |
| | | |
| | | int lexComma(lex_state_t * state, token_t * token) { |
| | | int lexComma(lex_state_t * state, scpi_token_t * token) { |
| | | token->ptr = state->pos; |
| | | |
| | | if (skipChr(state, ',')) { |
| | |
| | | return token->len; |
| | | } |
| | | |
| | | int lexSemicolon(lex_state_t * state, token_t * token) { |
| | | int lexSemicolon(lex_state_t * state, scpi_token_t * token) { |
| | | token->ptr = state->pos; |
| | | |
| | | if (skipChr(state, ';')) { |
| | |
| | | return token->len; |
| | | } |
| | | |
| | | int lexNewLine(lex_state_t * state, token_t * token) { |
| | | int lexNewLine(lex_state_t * state, scpi_token_t * token) { |
| | | token->ptr = state->pos; |
| | | |
| | | skipChr(state, '\r'); |
| | |
| | | #endif |
| | | |
| | | int lexIsEos(lex_state_t * state) LOCAL; |
| | | int lexWhiteSpace(lex_state_t * state, token_t * token) LOCAL; |
| | | int lexProgramHeader(lex_state_t * state, token_t * token) LOCAL; |
| | | int lexCharacterProgramData(lex_state_t * state, token_t * token) LOCAL; |
| | | int lexDecimalNumericProgramData(lex_state_t * state, token_t * token) LOCAL; |
| | | int lexSuffixProgramData(lex_state_t * state, token_t * token) LOCAL; |
| | | int lexNondecimalNumericData(lex_state_t * state, token_t * token) LOCAL; |
| | | int lexStringProgramData(lex_state_t * state, token_t * token) LOCAL; |
| | | int lexArbitraryBlockProgramData(lex_state_t * state, token_t * token) LOCAL; |
| | | int lexProgramExpression(lex_state_t * state, token_t * token) LOCAL; |
| | | int lexComma(lex_state_t * state, token_t * token) LOCAL; |
| | | int lexSemicolon(lex_state_t * state, token_t * token) LOCAL; |
| | | int lexNewLine(lex_state_t * state, token_t * token) LOCAL; |
| | | int lexWhiteSpace(lex_state_t * state, scpi_token_t * token) LOCAL; |
| | | int lexProgramHeader(lex_state_t * state, scpi_token_t * token) LOCAL; |
| | | int lexCharacterProgramData(lex_state_t * state, scpi_token_t * token) LOCAL; |
| | | int lexDecimalNumericProgramData(lex_state_t * state, scpi_token_t * token) LOCAL; |
| | | int lexSuffixProgramData(lex_state_t * state, scpi_token_t * token) LOCAL; |
| | | int lexNondecimalNumericData(lex_state_t * state, scpi_token_t * token) LOCAL; |
| | | int lexStringProgramData(lex_state_t * state, scpi_token_t * token) LOCAL; |
| | | int lexArbitraryBlockProgramData(lex_state_t * state, scpi_token_t * token) LOCAL; |
| | | int lexProgramExpression(lex_state_t * state, scpi_token_t * token) LOCAL; |
| | | int lexComma(lex_state_t * state, scpi_token_t * token) LOCAL; |
| | | int lexSemicolon(lex_state_t * state, scpi_token_t * token) LOCAL; |
| | | int lexNewLine(lex_state_t * state, scpi_token_t * token) LOCAL; |
| | | |
| | | #ifdef __cplusplus |
| | | } |
| | |
| | | /* parsing parameters */ |
| | | |
| | | scpi_bool_t SCPI_Parameter(scpi_t * context, scpi_parameter_t * parameter, scpi_bool_t mandatory) { |
| | | token_t token; |
| | | scpi_token_t token; |
| | | lex_state_t * state; |
| | | int32_t value; |
| | | |
| | |
| | | } |
| | | } |
| | | |
| | | int parseProgramData(lex_state_t * state, token_t * token) { |
| | | token_t tmp; |
| | | int parseProgramData(lex_state_t * state, scpi_token_t * token) { |
| | | scpi_token_t tmp; |
| | | int result = 0; |
| | | int wsLen; |
| | | int suffixLen; |
| | |
| | | return result + realLen; |
| | | } |
| | | |
| | | int parseAllProgramData(lex_state_t * state, token_t * token, int * numberOfParameters) { |
| | | int parseAllProgramData(lex_state_t * state, scpi_token_t * token, int * numberOfParameters) { |
| | | |
| | | int result; |
| | | token_t tmp; |
| | | scpi_token_t tmp; |
| | | int paramCount = 0; |
| | | |
| | | token->len = -1; |
| | |
| | | return token->len; |
| | | } |
| | | |
| | | static void invalidateToken(token_t * token, const char * ptr) { |
| | | static void invalidateToken(scpi_token_t * token, const char * ptr) { |
| | | token->len = 0; |
| | | token->ptr = ptr; |
| | | token->type = TokUnknown; |
| | |
| | | |
| | | int detectProgramMessageUnit(scpi_parser_state_t * state, const char * buffer, int len) { |
| | | lex_state_t lex_state; |
| | | token_t tmp; |
| | | scpi_token_t tmp; |
| | | int result = 0; |
| | | |
| | | lex_state.buffer = lex_state.pos = buffer; |
| | |
| | | extern "C" { |
| | | #endif |
| | | |
| | | int parseProgramData(lex_state_t * state, token_t * token) LOCAL; |
| | | int parseAllProgramData(lex_state_t * state, token_t * token, int * numberOfParameters) LOCAL; |
| | | int parseProgramData(lex_state_t * state, scpi_token_t * token) LOCAL; |
| | | int parseAllProgramData(lex_state_t * state, scpi_token_t * token, int * numberOfParameters) LOCAL; |
| | | int detectProgramMessageUnit(scpi_parser_state_t * state, const char * buffer, int len) LOCAL; |
| | | |
| | | #ifdef __cplusplus |
| | |
| | | * @return |
| | | */ |
| | | scpi_bool_t SCPI_ParamTranslateNumberVal(scpi_t * context, scpi_parameter_t * parameter) { |
| | | token_t token; |
| | | scpi_token_t token; |
| | | lex_state_t state; |
| | | |
| | | state.buffer = parameter->data.ptr; |
| | |
| | | return 0; |
| | | } |
| | | |
| | | typedef int (*lexfn_t)(lex_state_t * state, token_t * token); |
| | | typedef int (*lexfn2_t)(lex_state_t * state, token_t * token, int * cnt); |
| | | typedef int (*lexfn_t)(lex_state_t * state, scpi_token_t * token); |
| | | typedef int (*lexfn2_t)(lex_state_t * state, scpi_token_t * token, int * cnt); |
| | | |
| | | const char * typeToStr(token_type_t type) { |
| | | const char * typeToStr(scpi_token_type_t type) { |
| | | switch (type) { |
| | | case TokComma: return "TokComma"; |
| | | case TokSemicolon: return "TokSemicolon"; |
| | |
| | | } |
| | | } |
| | | |
| | | void printToken(token_t * token) { |
| | | void printToken(scpi_token_t * token) { |
| | | printf("Token:\r\n"); |
| | | printf("\t->type = %s\r\n", typeToStr(token->type)); |
| | | printf("\t->ptr = %p (\"%.*s\")\r\n", token->ptr, token->len, token->ptr); |
| | |
| | | |
| | | #if 0 |
| | | |
| | | static void TEST_TOKEN(const char * str, lexfn_t fn, int offset, int len, token_type_t tp) { |
| | | static void TEST_TOKEN(const char * str, lexfn_t fn, int offset, int len, scpi_token_type_t tp) { |
| | | lex_state_t state; |
| | | token_t token; |
| | | scpi_token_t token; |
| | | |
| | | state.buffer = state.pos = str; |
| | | state.len = strlen(str); |
| | |
| | | lexfn_t fn = f; \ |
| | | int offset = o; \ |
| | | int len = l; \ |
| | | token_type_t tp = t; \ |
| | | scpi_token_type_t tp = t; \ |
| | | lex_state_t state; \ |
| | | token_t token; \ |
| | | scpi_token_t token; \ |
| | | \ |
| | | state.buffer = state.pos = str; \ |
| | | state.len = strlen(str); \ |
| | |
| | | lexfn2_t fn = f; \ |
| | | int offset = o; \ |
| | | int len = l; \ |
| | | token_type_t tp = t; \ |
| | | scpi_token_type_t tp = t; \ |
| | | lex_state_t state; \ |
| | | token_t token; \ |
| | | scpi_token_t token; \ |
| | | int count; \ |
| | | \ |
| | | state.buffer = state.pos = str; \ |