2016-12-21 22 views
0

Linux 시스템에서 Flex 유틸리티를 사용하여 HTML 테이블 코드를 일반 텍스트로 변환해야합니다. 다음과 같이
내가는 내 .lex이다 파일의 토큰을 마련했습니다 :
HTML 테이블을 Lex 및 Yacc을 사용하여 일반 텍스트로 변환

OPENTABLE  <table> 
    CLOSETABLE  </table> 
    OPENROW   <tr> 
    CLOSEROW  </tr> 
    OPENHEADING  <th> 
    CLOSEHEADING </th> 
    OPENDATA  <td> 
    CLOSEDATA  </td> 
    STRING   [0-9a-zA-Z]* 
    %% 
    %% 

내 CGF (번역 계획 포함) HTML 구문 분석의 모양을 위해 :

TABLE  --> OPENTABLE ROWLIST CLOSETABLE ; 
    ROWLIST --> ROWLIST ROW |^    ; 
    ROW  --> OPENROW DATALIST CLOSEROW  printf("\n"); 
    DATALIST --> DATALIST DATA |^    ; 
    DATA  --> OPENDATA STRIN CLOSEDATA  printf(yytext+"\t"); 

몇 가지 예를 살펴 봤지만 .lex 파일의 규칙 섹션에 무엇을 써야하는지 알 수 없습니다.

답변

0

나는 기초에 약간 시간을 소요하고 그것을 알아 냈다. Flex의 정보 페이지는 큰 도움이되었습니다. 이것은 필요한 파일입니다. 잘 작동하지만 개선해야합니다.

%{ 
#include <string.h> 
char *substring(char* str) 
    { 
     int i = 0; 
     int l = strlen(str); 
     char *str2; 
     str2 = malloc(l+1); 
     for (i=4; i < l-5;i++) 
     { 
      str2[i-4] = str[i]; 
     } 
     return str2; 
    } 
%} 
OPENTABLE "<table>" 
CLOSETABLE "</table>" 
OPENROW "<tr>" 
CLOSEROW "</tr>" 
OPENHEADING "<th>" 
CLOSEHEADING "</th>" 
OPENDATA "<td>" 
CLOSEDATA "</td>" 
STRING [a-zA-Z0-9]* 
%% 
{OPENDATA}.{STRING}.{CLOSEDATA} printf("%s\t", substring(yytext)); 
{OPENHEADING}.{STRING}.{CLOSEHEADING} printf("%s\t", substring(yytext)); 
{CLOSEROW} printf("\n"); 
. ; 
[ \n\t] ; 
%% 
int main(int argc, char** argv) 
{ 
    ++argv, --argc; 
    yyin = fopen(argv[0], "r"); 
    yylex(); 
}