27

私は主にScalaで書かれたアプリの式パーサーを書いています。ScalaでASTオブジェクトを作成しましたが、パーサーを作成する必要があります。Scalaに組み込まれているパーサーコンビネーターとANTLR3について聞いたことがありますが、どちらがより優れたパフォーマンスとコードの記述のしやすさを提供するのでしょうか。ここのところ:

ANTLRの長所

  1. よく知られている
  2. 速い
  3. 外部DSL
  4. ANTLRWorks(パーサー文法のデバッグ/テストに最適なIDE)

ANTLRの短所

  1. Javaベース(Scalaの相互運用は難しいかもしれませんが、経験はありますか?)
  2. 実行時に大きな依存関係が必要

パーサーコンビネーターの長所

  1. Scalaの一部
  2. ビルドステップが1つ少なくなります
  3. 実行時の依存関係は必要ありません。たとえば、Scalaのランタイムライブラリにすでに含まれています

パーサーコンビネーターの短所

  1. 内部DSL(実行が遅くなる可能性がありますか?)
  2. ANTLRWorksはありません(優れたパーサーテストおよび視覚化機能を提供します)

何かご意見は?

編集:この式パーサーは、代数/微積分式を解析します。ファイナライズされると、Android用アプリMagnificalcで使用されます。

4

6 に答える 6

18

Scalaのパーサーコンビネーターはあまり効率的ではありません。それらはそうなるように設計されていませんでした。これらは、比較的小さな入力で小さなタスクを実行するのに適しています。

だからそれは本当にあなたの要件に依存します。ANTLRとの相互運用の問題はないはずです。JavaからScalaを呼び出すのは面倒ですが、ScalaからJavaを呼び出すことはほとんどの場合うまくいきます。

于 2011-05-15T22:37:29.180 に答える
6

数ページの長さの代数式を解析することを計画していない限り、パーサーコンビネーターのパフォーマンスの制限について心配する必要はありません。Programming Scalaの本は、パーサーコンビネーターのより効率的な実装が実現可能であると述べています。たぶん誰かがそれを書くための時間とエネルギーを見つけるでしょう。

ANTLRでは、 2つの追加のビルドステップについて話していると思います。ANTLRはJavaにコンパイルされ、ScalaだけでなくScalaとJavaの両方をバイトコードにコンパイルする必要があります。

于 2011-05-17T20:52:51.537 に答える
2

私はANTLRv4とScalasパーサーコンビネーターの両方を使用して外部DSLを作成しました。言語を設計するときに優れたエディターサポートが得られ、解析結果を任意のASTケースクラスデータ構造に変換するのが非常に簡単であるため、パーサーコンビネーターを明らかに好みます。ANTLRWorksエディターのサポートがあっても、文法の開発は非常にエラーが発生しやすいため、ANTLR文法の開発にははるかに時間がかかります。ANTLRワークフロー全体は、パーサーコンビネーターのものと比較して私にはかなり肥大化したように感じます。

于 2015-12-24T13:09:51.777 に答える
0

私はパーサーコンビネーターを使用して外部DSLを作成しようとする傾向があります。内部DSLである必要はありません。しかし、それが良いかどうかはわかりません。

これを理解するための最良のアプローチは、文法の簡略化されたバージョンを取り、それを両方の方法で試し、違いを評価することです。

于 2011-05-15T21:13:18.407 に答える
0

自作の8ビットCPUアセンブラ用のパーサーを書いているところです。

もっと良い方法が必要だと感じる前に、私はこれまでAntlr4を使いました。私はScalaパーサーコンビネーターを試してみることにしました。それは私見の方がはるかに生産的であると言わざるを得ません。しかし、私はscalaを知っています。

于 2020-11-11T13:40:28.577 に答える
0

それでも整数式パーサーに興味がある場合は、https ://github.com/scala-szeged/hrank-while-languageにある私のサンプルインタープリターをご覧ください 。これは、officailパーサーコンビネーターを使用した200百行のScalaコードです。式の解析があります。また、ネストされたif、ネストされたwhile、変数、およびブール式も処理します。また、このgithubリポジトリに配列処理を実装しました。文字列の処理が必要な場合は、私もお手伝いします。

もう1つの、もう少し単純な式パーサーも、他のパブリックリポジトリhttps://github.com/scala-szeged/top-calc-dslにあります。

于 2021-03-31T09:27:29.733 に答える