Parsing 我应该如何在yacc/bison和lex中创建递归规则?

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>

我正在使用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>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;}没有帮助。