0

「[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 }

しかし、「[」と「]」の間のリストを最後に「:: []」があるものとして読み取る方法がわかりません。何か案は?

4

1 に答える 1

2

与えられたあなたの文法は、私にはまったく正しくないようです。::本質的に、それはと;同じように扱います。したがって、[a::b][a;b]を同じものとして扱います。[]2 つのケースを異なる方法で処理する方法がわかれば、で指定されたリストの最後にプレース ハンドルが見つかるはず::です。

副次的なコメントとして、許可するa :: b :: []場合は、右側::を空でないリストにすることを許可しています。a :: [b]そのため、OCaml にあるように、許可することをお勧めします。または、むしろしたくないかもしれませんが、それはあなたの文法です!

于 2013-02-19T01:18:47.103 に答える