2012-01-22 29 views
3

我正在寫一個簡單的HTML解析器,使用yacc(野牛)和flex。 我怎麼能做出這樣的規則:我應該如何在yacc/bison和lex中做出遞歸規則?

column -> <td>text</td>column | NULL 

我試過很多這樣的形式:

COLUMN : L_TAG T_OPEN R_TAG ID L_TAG T_CLOSE R_TAG COLUMN 
| 
; 

// Lex中指定的令牌。

不幸的是它不起作用。它給我的轉變/減少錯誤。無論我是將COLUMN放在規則的開頭還是結尾。是否使用這樣的NULL:

{$$ = NULL} 

或讓它爲空。 我需要NULL的東西,使規則遞歸,並能夠有相同的標籤多次相鄰。像這樣:

<tr>name</tr><tr>age</tr> 

我該如何做這項工作?

回答

0

你通常把它分解成若干塊:

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 
    ; 

哪裏TABLE<table>CLOSE_TABLE</table>,等等。

哦,只是要清楚:我沒有非常努力,確保這真正解析HTML正確。事實上,我很確定它現在不正確。只是一個明顯的例子,我相信一個行標題應該是可選的。

+0

不幸的事情是這樣的: 細胞: |細胞細胞 ; cell:TD TEXT CLOSE_TD ; 不起作用! :(我不知道如何做一個空的規則工作,我甚至嘗試過{$$ = NULL;}沒有幫助。 – Milad

2
column  :/* empty */ 
      | column '<' TD '>' TEXT '<' '/' TD '>' 

只要您更具體,就可以優化您的規則。對於遞歸的事情,你應該用lalr(1)語法使它遞歸。

好運