1

re2c 0.10.5 を使用していますが、文字列の先頭を正しく一致させることができません。

たとえば、次のように定義しました。

[aA] w "="      { return ATTRKEYWORD;}
[bB] w "="      { return BWKEYWORD;}

ここで、w は次のように定義されます。

w               =       s*;

しかし、もし私が文字列を持っているなら

b=my string a=foobar

BWKEYWORD を取得したいのですが、b= で始まっているため、すべきでないときに ATTRKEYWORD を取得します。

http://re2c.org/manual.htmlによると、^ は改行ではありません。

つまり

[^aA] w "="      { return ATTRKEYWORD;}
[^bB] w "="      { return BWKEYWORD;}

私の問題ではまだ機能していません。

解決策はありますか?

4

1 に答える 1

3

これにより、属性キーワードが検索されます。

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

typedef struct lexerObj
{
    char *mCursor;
    char *mLimit;
    char *mMarker;
    char *mToken;

} lexerObj;

 #define ATTRKEYWORD  1
 #define BWKEYWORD    2
 #define OTHERKEYWORD 3

int scanner(lexerObj *aLexer)
{
#define YYFILL(n)                                \
    do {                                         \
        if (aLexer->mCursor >= aLexer->mLimit) { \
            return 0;                            \
        }                                        \
    } while (0);

    /*!re2c
      re2c:define:YYCTYPE     = "char";
      re2c:define:YYCURSOR    = aLexer->mCursor;
      re2c:define:YYLIMIT     = aLexer->mLimit;
      re2c:define:YYMARKER    = aLexer->mMarker;
      re2c:yyfill:enable      = 1;

      s = [ ];
      w = s*;
    */

    aLexer->mToken = aLexer->mCursor;

    /*!re2c
      [aA] w "=" { return ATTRKEYWORD;}
      [bB] w "=" { return BWKEYWORD;}
      .          { return OTHERKEYWORD;  }
    */
}


int main()
{
    lexerObj aObj;
    int a;
    char sToken[512];
    char *sBuffer = "b=my string a=foobar";

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

    while ( (a = scanner(&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;
}

これが出力です。

Token = 2(2) [b=]
Token = 3(1) [m]
Token = 3(1) [y]
Token = 3(1) [ ]
Token = 3(1) [s]
Token = 3(1) [t]
Token = 3(1) [r]
Token = 3(1) [i]
Token = 3(1) [n]
Token = 3(1) [g]
Token = 3(1) [ ]
Token = 1(2) [a=]
Token = 3(1) [f]
Token = 3(1) [o]
Token = 3(1) [o]
Token = 3(1) [b]
Token = 3(1) [a]
Token = 3(1) [r]
于 2014-11-26T21:42:03.370 に答える