1

前もって感謝します!

「192.168.0.0」などのIPv4アドレス形式を解析するコードを実装したいと考えています。

だから、私はこれが好きでした。

#include <stdio.h>
#include <string.h>

typedef struct qppLexerObj
{
    char *mCursor;
    char *mLimit;
    char *mToken;

} qppLexerObj;

int qpfGetOctet(qppLexerObj *aLexer)
{
#define YYFILL(a)                                       \
    do                                                  \
    {                                                   \
        if (aLexer->mCursor > aLexer->mLimit)           \
        {                                               \
            return 0;           \
        }                                               \
        else                                            \
        {                                               \
        }                                               \
    } while (0);

    /*!re2c

      re2c:define:YYCTYPE     = "unsigned char";
      re2c:define:YYCURSOR    = aLexer->mCursor;
      re2c:define:YYLIMIT     = aLexer->mLimit;
      re2c:yyfill:enable      = 0;
      re2c:yyfill:enable      = 1;

      digit   = [0-9];
    */
begin:
    aLexer->mToken = aLexer->mCursor;
    /*!re2c

      digit+ { return 1; }
      [\.]        { return 2;      }
      [\*]        { return 3;     }
      .           { return 9999;  }
    */
}


int main()
{
    qppLexerObj aObj;
    int a;
    char sToken[512];
    char *sBuffer = "255.255.255.255";

    aObj.mCursor = sBuffer;
    aObj.mLimit  = aObj.mCursor + strlen(sBuffer);

    while ( (a = qpfGetOctet(&aObj)) != 0)
    {
        int len;

        len = aObj.mCursor - aObj.mToken;

        memset(sToken, 0, sizeof(sToken));
        strncpy(sToken, aObj.mToken, len);
        printf("Token = %d(%d) [%s]\n", a, len, sToken);
    }

    return 0;
}

しかし、結果は私が期待したものではありません。

re2c --case-insensitive -o addr_so.c addr_so.re
gcc -g -o addr_so addr_so.c

Token = 1(3) [255]
Token = 2(1) [.]
Token = 1(3) [255]
Token = 2(1) [.]
Token = 1(3) [255]
Token = 2(1) [.]
Token = 1(3) [255]
Token = 9999(1) []     <=== Wrong code happens!! SHOULD BE 0!

「9999」、間違ったコードなしでEOFを検出するにはどうすればよいですか?

re2c は EOF をうまく検出できない場合があるようです。

4

1 に答える 1

1

すべてが論理的に見えます。終了テストだけが間違っています。re2c のマニュアル ページで説明されているように、有効な文字を超えた最初のアドレスに制限が設定されていることを思い出してください。

-        if (aLexer->mCursor > aLexer->mLimit)           \
+        if (aLexer->mCursor >= aLexer->mLimit)           \

この 1 行の変更で、期待どおりの結果が得られます。

Token = 1(3) [255]
Token = 2(1) [.]
Token = 1(3) [255]
Token = 2(1) [.]
Token = 1(3) [255]
Token = 2(1) [.]
于 2014-11-26T20:41:32.357 に答える