4

私の会社は、Android 用のソフトウェアを作成しようとしています。私たちは Java を使用したいと考えており、会社のソフトウェアには C++ のコンポーネントがあり、移植する必要があります (または、少なくとも NDK を試す前に移植を試みる必要があります)。このコードはAccentを使用して作成され、文法文法を定義します。私が知る限り、元の作家 (現在は亡くなっています) は、文法を指定する方法を指定する文法を書き、その文法とアクセントを使用してコンパイラー コンパイラーをコンパイルしました。コンパイラ-コンパイラは、指定された形式の文法を取得し、バイナリ コードを生成して、その文法に準拠した文字列を解析します。文法のスニペットの例を次に示します。

    //include rules from from this file (such as <alpha>)
include "alphabet.bnf"

<<topSymbol>> = <alpha> <alpha> <alpha>? .//two letters with an optional third
//square brackets enclose an XML statement clarifying semantics of the rule
[
    <topSymbol>
        <letter>
                       <command val="doSomethingToLetter"/>
        </letter>
        <!--etc.-->
    </topSymbol>
]

私の質問は、Antlr またはその他のツールを使用して、Java でこれを行う方法です。コンパイラ-コンパイラ-コンパイラは、私にはかなり複雑に思えます。または、文法的およびセマンティックな XML 情報を含むこのタイプの文法を簡単にコンパイル/解析する方法を知りたいです。

4

3 に答える 3

3

元のデザイナーが自分のしていることを知っていて、それが正当である場合は、そのコンセプトを維持したいと考えています。別のパーサー ジェネレーター (または少なくとも何らかの解析スキーム) を使用するのが正しいアプローチです。JavaCC または ANTLR のいずれかがパーサー ジェネレーターとして適切です。文法を手動で翻訳する必要があります。文法が十分に単純であれば、再帰降下パーサーを手作業でコーディングすることもできます。

元のデザイナーが単にやり過ぎだった場合、おそらく文法主導の側面を置き換えることができますが、彼が何を達成したかを理解せずにそれを行うことはできません. これが「私にはかなり複雑に思える」という事実は、解析/パーサー ジェネレーター テクノロジを本当に理解していないことを示唆しており、理解していないものを保持するよりも、理解していることを実行したいという願望に駆り立てられています。しかし、理解していないという理由だけで、適切に設計/実装されているものをバラバラにするのは悪い考えです。この種のテクノロジーについてもっと学び、なぜこのように実装されたのかを尋ねることを強くお勧めします。最終的にあなたは正しいかもしれないし、彼のアプローチを別のものに置き換える必要がありますが、恐れではなく知識に基づいて選択してください.

于 2012-06-13T14:39:34.283 に答える
1

私の質問は、Antlrまたは他のツールを使用してJavaでこれを行う方法です。コンパイラ-コンパイラ-コンパイラは私にはかなり複雑に思えます。

私にも複雑に聞こえます!

あるいは、文法的および意味論的なXML情報を含むこのタイプの文法を簡単にコンパイル/解析する方法を知りたいです。

いいえ...これに対する簡単な答えはありません。あなたの元同僚が複雑さの面でトップを超えたようです。次のことを行う必要があります。

  • 彼のコードが何をするのか、そしてそれがどのように行われるのかを頭に入れて、Antlrがどのように機能するかを学び、手で翻訳してください。
  • または彼のコードとデザインを捨てて、それがしていることを行うためのより簡単な方法を見つけてください。

幸運を!


(実際には、コードが見た目ほど複雑ではない可能性があります...頭を悩ませたら、コンパイラーとコンパイラーのテクノロジーです。)

于 2012-06-13T14:10:20.023 に答える
1

最善の策は、持っている文法を ANTLR や Java CC などのツールに変換することです。

もう 1 つの可能性は、JNI を使用して C++ コードを呼び出すことですが、これには危険が伴います。

私は助けることができるものを知りません。シャベルを手に入れて掘り始めるだけです。

于 2012-06-13T14:12:43.360 に答える