2014-07-08 35 views
1

我使用re2c 0.10.5,我無法正確匹配字符串的開頭。與re2c匹配的開頭行

例如,我定義:

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

其中w定義爲:

w    =  s*; 

,但如果我的字符串

b=my string a=foobar 

我去拿ATTRKEYWORD當我不應該,因爲它是從b =開始的,我想要得到BWKEYWORD。按照http://re2c.org/manual.html,^不是新行的開始。

這意味着

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

仍然沒有工作了我的問題。

任何解決方案?

回答

2

這找到了屬性關鍵字。

#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] 
相關問題