使用 Lex 和 Yacc 将 HTML table 转换为纯文本

Convert HTML table into plain text using Lex and Yacc

我有一个 HTML table 代码,需要在 Linux 系统中使用 Flex 实用程序将其转换为纯文本。
我在我的 .lex 文件中列出了一个标记列表,如下所示:

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

我的 HTML 解析的 CGF(包括翻译方案)看起来像:

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

我看过一些例子,但我不知道我应该在我的 .lex 文件的规则部分写什么。

我花了一些时间在基础上,然后弄明白了。 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();
}