Используя YYLIMIT в re2c
Заранее спасибо!
Я хотел бы реализовать код для анализа формата адреса IPv4, например, "192.168.0.0".
Итак, мне это понравилось.
#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!
Как я могу определить EOF без "9999", неправильный код?
re2c кажется, что иногда он не может обнаружить EOF успешно.
1 ответ
Все выглядит логично. Просто завершающий тест не подходит. Напомним, что ограничение установлено для первого адреса после допустимого символа, как сказано в справочной странице re2c.
- if (aLexer->mCursor > aLexer->mLimit) \
+ if (aLexer->mCursor >= aLexer->mLimit) \
С этим изменением в одну строку я получаю результаты, которые, я думаю, вы ожидали.
Token = 1(3) [255]
Token = 2(1) [.]
Token = 1(3) [255]
Token = 2(1) [.]
Token = 1(3) [255]
Token = 2(1) [.]