web-dev-qa-db-ja.com

単純なマークアップ言語パーサーをいつどのように設計する必要がありますか?

レンダリングエンジンを使って簡単なマークアップ言語を書きたいです。

まず、完全にはわかりませんwhenこれを試してみるべきです...私は12歳です...しかし私はWebや本を通じて学んだC++の有能者。

私はJavaScript、PHP、HTMLも得意です。現在RubyとHaskellの変更について学んでいます。

私はすべての低レベルと高レベルの概念を理解しています。しかし、私をいつも混乱させていた唯一のことは、マークアップ言語やプログラミング言語などを理解し、コンパイルまたは解釈するために、人々がこれらのパーサーをどのように設計するかということです。

私の質問は、さらに単純なマークアップ言語用の単純なレンダリングエンジンをいつ書き始めるべきかということです。

フレームワークがインターフェイスに使用するカスタムxmlのようなカスタム言語に似ています(QtはXMLに似た.uiファイルを使用してフォームを定義します)。

私はそのようなものをデザインするつもりですか?読むのに良い論文、記事、本はありますか?

優先言語:C++、JavaScript、Haskell、Ruby

2
user126162

あなたの特定の状況については、時間があれば、パーサーを作成してみます。 XMLベースのパーサーから始めることをお勧めします。これらは最も単純だからです(構文ツリーはすでにXMLファイルにきちんと書かれているため)。

パーサーを書くことがいつ有効であるかというより一般的な質問については、次のことが当てはまるはずだと私は主張します。

  1. パーサーへの入力は頻繁に変更され、ハードコードされた同等のパーサー出力に変更を加えるには、パーサー入力を変更するよりも時間がかかります。
  2. パーサーは、めったに変更されず、変更を通知する、有限でよく理解されている問題ドメインに取り組みます。
  3. すべての入力ファイルからのすべてのパーサー出力にハードコードされた同等物を書き込むのにかかる合計時間は、パーサー自体を書き込むのにかかる時間よりも長くなります。
  4. パーサーによって処理される言語は、同等のハードコードされた出力が記述される言語よりも、エンドユーザーにとって単純または便利です。

これは少し意見に基づいて複雑に見えるかもしれませんが、私の推論は本質的にパーサーがうまく書くのに非常に長い時間がかかるということです。パーサーがその負債を完済するために(それを書くのにかかる時間の観点から)、パーサーの代わりに、潜在的な各入力を処理する多くのコードを書くことになる問題ドメインを処理している必要があります。パーサー。それでは、HTMLおよびHTMLパーサーの例を使用して、上記の信念を実行してみましょう。

  1. 実際、HTMLページは頻繁に変更されるため、C++で作成されたビジュアルツリーを変更するには、HTMLで作成されたビジュアルツリーを変更するよりも時間がかかります。 HTMLのdivの場所を変更したり、そのスタイルを変更したりするには、既存のdivをツリー内の別の場所にカットアンドペーストし、新しいcssクラスを適用するだけです。同じコードをC++ファイルの他の部分にカットアンドペーストするだけの簡単な方法ではないため、C++で同等の作業を行うのは非常に困難です。
  2. HTML仕様は有限であり、十分に理解されています。 W3Cは変更のたびに多くの会議を開催するため、仕様がいつ変更されるかはよく知られています。これは、HTMLパーサーの作成者が変更のタイミングを知っているため、変更に備えることができ、問題のあるドメインでの変更を予測するために大量の時間を無駄にすることがないことを意味します。問題のドメインが十分に理解されており、有限であるという事実は、パーサー作成者に、パーサーが完全である、つまり、読み取る既知のHTML要素をすべて処理するときにHTMLパーサーが完全であると言うための良い根拠を提供します。絶えず変化し、漠然と定義されている何かのためにパーサーを書き込もうとしていると想像してみてください。パーサーが完成したことをどうやって知ることができますか?
  3. ポイント1と同様に、C++命令のセットとしてWebページを書き込もうとしていると想像してください。画面上の要素のレイアウトを処理する一貫した方法を考え出すと、単純なdivを書くよりも時間がかかります。さらに、約25億1千万のWebページがあるという事実を踏まえて、独自のフレームワークを使用して、独自のC++ファイルで各Webページを書き込む時間の損失を想像してみてください。パーサーが別の選択肢よりもhuge時間を節約し、パーサーが頻繁に使用される場合は、パーサーがネットポジティブ。
  4. 繰り返しますが、WebページがC++で書かれている場合、それらを書くことができる人々のプールは大幅に減少します。卑劣なことではありませんが、複雑な落とし穴やセグメンテーション違反が多数あるC++は、HTMLよりもはるかに難しいことに同意できると思います。熱心なC++開発者だけがWebページを作成できるとしたら、25億1000万のWebページがないことは間違いないでしょう。

個人的なanecdataの一部として、私の会社はXMLを取得し、そのXMLを使用してSQLストアドプロシージャとの間でデータを読み書きするスプレッドシートへの書き込みを行うクライアント用のパーサーを作成しました。クライアントは次のようなことを理解できます。

<Workbook name="SomeWorkbook">
    <Sheet name="SomeWorksheet">
        <DataCell range="A1" name="employee" input="SPGetEmployees" />
        <DataCell range="A2" name="salary" input="SPGetEmployees" />
        <DataCell range="B3" name="total" input="SPGetEmployees" />
        <DataCell range="B4" name"isApproved" output="SPApproveWorksheet" />
    </Sheet>
    <DataSources>
        <DataSource direction="input" type="SP" database="someDatabase" name="SPGetEmployees">
            <Parameters>
                <Parameter name="financialYear" type="DateTime" isDataCell="false" />
            </Parameters>
        </DataSource>
        <DataSource direction="output" type="SP" database="someDatabase" name="SPApproveWorksheet">
            <Parameters>
                <Parameter name="isApproved" type="Bit" isDataCell="true" />
            </Parameters>
        </DataSource>
    </DataSources>
</Workbook>

それはすべて彼らの職務(半技術システム管理者)ではなじみがあるように見えますが、クライアントは、そうでなければこのワークブックを生成するC#コードを確実に理解しません。ワークシートのデータソースも頻繁に変更され、多くのC#コードを変更するよりも、一部のXMLを変更する方が迅速です。問題のドメインもよく理解されています。これは、一部のよく理解されたデータソースから一部のよく理解された出力(Excelファイル)を読み書きしているだけなので、クライアントのすべてのニーズに対応するXMLベースの言語を書くことができるためです。頻繁に変更する必要はありません。

パーサーなどの最適化のトピックに関するxkcdからのこの最後の注意を残しておきます: http://xkcd.com/1205/

0
Ben H