2013-02-19 87 views
0

我想將「[a; b; c; d; e; f; g]」解析爲「a :: b :: c :: d :: e :: f :: g :: []」 在我的我的解析器的一部分,我有OCaml解析列表

listOps: 
    | combOps COLONCOLON listOps { Bin($1,Cons,$3) } 
    | combOps SEMI listOps  { Bin($1,Cons,$3) } 
    | combOps     { $1 } 
; 

,我有這樣的進一步下跌。

| LBRAC RBRAC    { NilExpr } 
    | LBRAC listOps RBRAC  { $2 } 

但我不知道如何得到它的閱讀之間的「[」和「]」列表中具有「:: []」在它的結束。 任何想法?

回答

2

你的語法看起來不太合適。從本質上講,它同等對待::;。所以它會將[a::b][a;b]視爲相同。如果你想知道如何處理這兩種情況,你可能會發現一個地方在::指定的清單末尾處理[]

作爲一方的意見,如果您允許a :: b :: []您允許::的右側是一個非空列表。因此,您可能需要允許a :: [b],因爲它在OCaml中。或者,也許你不想,這是你的語法!