2011-09-29 3 views
2

Flex를 사용하여 템플릿 엔진 파서를 만들고 싶습니다. & Bison. 문제는 {{..}} 및 $ {..} 내에서 표현식 만 구문 분석하려고한다는 것입니다.Flex를 사용하여 컨텍스트 내에서만 토큰을 스캔하는 방법은 무엇입니까?

 </table:table-row> 
     {{$(/report/row.xml).embed()}} 
     {{$(//Accreditation/AccreditationDocument/Report).each(fragment(row) """ 
      <table:row> 
       <table:table-cell office:value-type="string" office:string-value="${row["name"]}" /> 
      </table:row> 
     """)}} 
     <table:table-row table:number-rows-repeated="1048574" table:style-name="ro1"> 
      <table:table-cell table:number-columns-repeated="16384"/> 
     </table:table-row> 
    </table:table> 

답변

1

내가 솔루션 나 자신을 발견했다 :

템플릿은 같은 코드에 포함 된 토큰과 함께 임의의 텍스트가 될 수 있습니다. Flex에는 Start Conditions이라는 기능이 있습니다.

다음은 {{}}에서만 토큰을 반환하는 코드입니다.이 코드는 lexer.l입니다. 다른 텍스트는 GENERAL_BODY로 반환됩니다.

%{ 
#include "bisondef.h" 
%} 

%option reentrant noyywrap never-interactive nounistd 
%option bison-bridge 

WS [ \t\n]+ 
ID [A-z_][[:alnum:]]* 

%x stmt 

%% 
    int stmt_level = 0; 

"{{" { stmt_level = 0; BEGIN(stmt); } 

<stmt>{ 
    "{{" { stmt_level++; printf("stmt {{\n"); } 
    "}}" { 
     if (0 == stmt_level) BEGIN(INITIAL); 
     else stmt_level--; 
    } 
    {WS} {} 
    [0-9]+ { yylval->num = atoi(yytext); return NUM; } 
    "+"|"-"|"*"|"/"|"("|")" { return *yytext; } 
    ";"  { return SEMICOLON; } 
    {ID} { yylval->str = strdup(yytext); return ID; } 
} 

. { 
    yylval->str = strdup(yytext); 
    return GENERAL_BODY; 
} 

%% 

int yyerror(const char *msg) { fprintf(stderr,"Error: %s\n",msg); return 0; } 
관련 문제