Parsing 我应该如何在yacc/bison和lex中创建递归规则?
我正在使用yacc(bison)和flex编写一个简单的HTML解析器。 如何制定此规则:Parsing 我应该如何在yacc/bison和lex中创建递归规则?,parsing,bison,yacc,lex,Parsing,Bison,Yacc,Lex,我正在使用yacc(bison)和flex编写一个简单的HTML解析器。 如何制定此规则: column -> <td>text</td>column | NULL //标记在lex中指定 不幸的是,它不起作用。它给了我移位/减少误差。无论我是将列放在规则的开头还是结尾。我是否像这样使用空值: COLUMN : L_TAG T_OPEN R_TAG ID L_TAG T_CLOSE R_TAG COLUMN | ; {$$ = NULL} <tr>
column -> <td>text</td>column | NULL
//标记在lex中指定
不幸的是,它不起作用。它给了我移位/减少误差。无论我是将列放在规则的开头还是结尾。我是否像这样使用空值:
COLUMN : L_TAG T_OPEN R_TAG ID L_TAG T_CLOSE R_TAG COLUMN
|
;
{$$ = NULL}
<tr>name</tr><tr>age</tr>
或者让它空着。
我需要空的东西使规则递归,并且能够多次将同一个标记彼此相邻。大概是这样的:
COLUMN : L_TAG T_OPEN R_TAG ID L_TAG T_CLOSE R_TAG COLUMN
|
;
{$$ = NULL}
<tr>name</tr><tr>age</tr>
nameage
我怎样才能做到这一点呢?你通常会把它分成若干部分:
table : TABLE rows CLOSE_TABLE
;
rows:
| rows row
;
row: TR row_header cells CLOSE_TR
;
row_header: TH text CLOSE_TH
;
cells:
| cells cell
;
cell: TD TEXT CLOSE_TD
;
其中表
为
,关闭表
为
,依此类推
哦,我只是想说清楚:我还没有做过很多工作,所以我必须确保它能够正确解析HTML。事实上,我很确定现在没有。举个明显的例子,我认为行标题应该是可选的。列:/*空*/
column :/* empty */
| column '<' TD '>' TEXT '<' '/' TD '>'
|列“”文本“”
你可以优化你的规则,只要你让它更具体。对于递归,您应该在lalr(1)语法中使其左递归
祝你好运不幸的是:细胞:|细胞细胞;单元格:TD TEXT CLOSE\u TD;不行!:(我不知道如何使空规则工作。我甚至尝试了{$$=NULL;}没有帮助。