From b4e38d7ea765422bf301980634b7b948fe989ae1 Mon Sep 17 00:00:00 2001 From: Jan Breuer <jan.breuer@jaybee.cz> Date: 周三, 19 6月 2013 23:10:02 +0800 Subject: [PATCH] Convert parameter handling to new lexer --- libscpi/src/lexer.c | 96 ++++++++++++++++++++---------------------------- 1 files changed, 40 insertions(+), 56 deletions(-) diff --git a/libscpi/src/lexer.c b/libscpi/src/lexer.c index abca2de..0b3bf09 100644 --- a/libscpi/src/lexer.c +++ b/libscpi/src/lexer.c @@ -217,79 +217,62 @@ } /* 7.6.1 <COMMAND PROGRAM HEADER> */ -int SCPI_LexCommonProgramHeader(lex_state_t * state, token_t * token) { - token->ptr = state->pos; - +static int skipCommonProgramHeader(lex_state_t * state) { if (skipStar(state)) { if(!skipProgramMnemonic(state)) { state->pos--; + } else { + return 1; } } - - token->len = state->pos - token->ptr; - - if((token->len > 0)) { - token->type = TokCommonProgramHeader; - } else { - token->type = TokUnknown; - state->pos = token->ptr; - token->len = 0; - } - - return token->len; + return 0; } -int SCPI_LexCompoundProgramHeader(lex_state_t * state, token_t * token) { - token->ptr = state->pos; +static int skipCompoundProgramHeader(lex_state_t * state) { + const char * rollback = state->pos; skipColon(state); if(skipProgramMnemonic(state)) { while(skipColon(state)) { if(!skipProgramMnemonic(state)) { - // TODO: lexer error - break; + state->pos = rollback; + return 0; } } - } - - token->len = state->pos - token->ptr; - - if((token->len > 0)) { - token->type = TokCompoundProgramHeader; + return 1; } else { - token->type = TokUnknown; - state->pos = token->ptr; - token->len = 0; + state->pos = rollback; + return 0; } - - return token->len; } int SCPI_LexProgramHeader(lex_state_t * state, token_t * token) { - int res; - - res = SCPI_LexCommonProgramHeader(state, token); - if(res > 0) return res; - - res = SCPI_LexCompoundProgramHeader(state, token); - if(res > 0) return res; - - return 0; -} - -int SCPI_LexQuestion(lex_state_t * state, token_t * token) { token->ptr = state->pos; + token->type = TokUnknown; - if (skipChr(state, '?')) { - token->len = 1; - token->type = TokQuiestion; - } else { - token->len = 0; - token->type = TokUnknown; + if(skipCommonProgramHeader(state)) { + if (skipChr(state, '?')) { + token->type = TokCommonQueryProgramHeader; + } else { + token->type = TokCommonProgramHeader; + } + } else if(skipCompoundProgramHeader(state)) { + if (skipChr(state, '?')) { + token->type = TokCompoundQueryProgramHeader; + } else { + token->type = TokCompoundProgramHeader; + } } - return token->len; + if (token->type != TokUnknown) { + token->len = state->pos - token->ptr; + } else { + token->len = 0; + state->pos = token->ptr; + } + + return token->len; } /* 7.7.1 <CHARACTER PROGRAM DATA> */ @@ -454,8 +437,9 @@ } else { token->type = TokUnknown; state->pos = token->ptr; + token->len = 0; } - return token->len; + return token->len > 0 ? token->len + 2 : 0; } @@ -527,7 +511,7 @@ token->len = 0; } - return token->len; + return token->len > 0 ? token->len + 2 : 0; } /* 7.7.6 <ARBITRARY BLOCK PROGRAM DATA> */ @@ -538,7 +522,7 @@ int SCPI_LexArbitraryBlockProgramData(lex_state_t * state, token_t * token) { int i; int j = 0; - + const char * ptr = state->pos; token->ptr = state->pos; if (skipChr(state, '#')) { @@ -559,11 +543,11 @@ if(i == 0) { state->pos += j; - if (!iseos(state)) { + if ((state->buffer + state->len) < (state->pos)) { + token->len = 0; + } else { token->ptr = state->pos - j; token->len = j; - } else { - token->len = 0; } } else { token->len = 0; @@ -581,7 +565,7 @@ token->len = 0; } - return token->len; + return token->len + (token->ptr - ptr); } /* 7.7.7 <EXPRESSION PROGRAM DATA> */ -- Gitblit v1.9.1