List OCaml解析列表

List OCaml解析列表,list,parsing,ocaml,lexical-analysis,cons,List,Parsing,Ocaml,Lexical Analysis,Cons,我想将“[a;b;c;d;e;f;g]”解析为“a::b::c::d::e::f::g::[]” 在我的解析器中,我有 listOps: | combOps COLONCOLON listOps { Bin($1,Cons,$3) } | combOps SEMI listOps { Bin($1,Cons,$3) } | combOps { $1 } ; 我把这个放在更下面 | LBRAC RBRAC

我想将“[a;b;c;d;e;f;g]”解析为“a::b::c::d::e::f::g::[]” 在我的解析器中,我有

listOps:
   | combOps COLONCOLON listOps { Bin($1,Cons,$3) }
   | combOps SEMI listOps       { Bin($1,Cons,$3) }
   | combOps                    { $1 }
;
我把这个放在更下面

   | LBRAC RBRAC                { NilExpr }
   | LBRAC listOps RBRAC        { $2 }
但我不知道如何让它阅读“[”和“]”之间的列表,因为它的末尾有一个“:[]”。
有什么想法吗

我觉得你给出的语法不太正确。本质上,它处理
相同。因此,它将把
[a::b]
[a;b]
视为相同。如果您知道如何以不同的方式处理这两种情况,您可能会在用
指定的列表末尾找到一个位置来处理
[]

作为旁注,如果允许
a::b::[]
则允许
::
的右侧为非空列表。因此,您可能希望允许
a::[b]
,就像在OCaml中一样。也许你不想,这是你的语法问题