2

Jadeのサブセット用の単純なパーサーを作成し、さらに処理するためにいくつかのXmlHtmlを生成したいと考えています。

パーサーは非常に単純ですが、Parsecと同様に少し長くなります。このような長いコードの投稿を許可されているかどうかわからないので、ここに完全な動作例があります。

以前に Parsec に手を出したことがありますが、成功することはめったにありません。今のところ、次の行を飲み込むように見える理由がよくわかりません。たとえば、

.foo.bar
    | Foo
    | Bar
    | Baz

でテストするとparseTest tag txt、次のように返されます。

Element {elementTag = "div", elementAttrs = [("class","foo bar")], elementChildren = [TextNode "Foo"]}

私のパーサーは、あらゆる種類のネストを処理できるようですが、複数の行を処理することはできません。私は何を取りこぼしたか?

4

1 に答える 1

6

Parsec が残りの入力と一致しない場合、その時点で解析を停止し、単にその入力を無視します。ここでの問題は、タグを解析した後、次のタグの前の行の先頭にある空白を消費しないため、Parsec が残りの入力を解析できず、ベイルすることです。(他にも問題があるかもしれません。今はコードをテストできません)

スペースを消費するものを追加する方法はたくさんありますが、私はジェイドに慣れていないので、どの方法が「正しい」方法であるかはわかりません (インデント構文がどのように機能するかわかりません) whiteSpace。終了するtag必要があります。

ところで、パーサーをレクサーとパーサーに分割することを検討する必要があります。Lexer は次のようなトークン ストリームを生成し[Ident "bind", OpenParen, Ident "tag", Equals, StringLiteral "longname", ..., Indentation 1, ...]、パーサーはそのトークン ストリームを解析します (はい、Parsec はあらゆるリストを解析できます)。あなたの仕事がより簡単になり、混乱が少なくなると思います。

于 2012-05-05T23:26:26.077 に答える