2013-02-19 83 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中。或者,也许你不想,这是你的语法!