使用 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();
}
我有一个 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();
}