コンパイラを書く必要があります。大学の宿題です。先生は、それが良いものである限り、コードの解析を行いたい任意の API を使用できると教えてくれました。そうすれば、生成する JVM に集中できます。
そうです、Java でコンパイラを作成して Java を生成します。
これに適したAPIを知っていますか? 正規表現を使用する必要がありますか? このシナリオではお勧めできませんが、私は通常、独自のパーサーを手動で作成します。
どんな助けでも大歓迎です。
コンパイラを書く必要があります。大学の宿題です。先生は、それが良いものである限り、コードの解析を行いたい任意の API を使用できると教えてくれました。そうすれば、生成する JVM に集中できます。
そうです、Java でコンパイラを作成して Java を生成します。
これに適したAPIを知っていますか? 正規表現を使用する必要がありますか? このシナリオではお勧めできませんが、私は通常、独自のパーサーを手動で作成します。
どんな助けでも大歓迎です。
正規表現はコンパイラで使用するのに適していますが、トークンを認識するためだけです (つまり、再帰構造はありません)。
コンパイラを書く古典的な方法は、トークンを認識するための字句解析器、構造を認識するための構文解析器、意味を認識するための意味解析器、中間コード ジェネレーター、オプティマイザー、そして最後にターゲット コード ジェネレーターを使用することです。コンパイラの記述が容易になる場合は、これらのステップのいずれかをマージしたり、完全にスキップしたりできます。
このプロセスを支援するために開発された多くのツールがあります。Java の場合は、以下を参照できます。
主に StringTemplate を介した出力生成機能のため、ANTLRをお勧めします。
より良いのは、同じことに関するTerence Parr の本が、パーサー ジェネレーターを使用してコンパイラーを作成することを目的とした優れた本の 1 つであることです。
次に、文法をオンザフライで学習およびデバッグできるANTLRWorksがあります。
さらに言えば、ANTLR wiki + documentation (ただし、私の好みでは十分に包括的ではありません) は、初心者が始めるのに適した場所です。1 週間でコンパイラの作成に関する知識を更新するのに役立ちました。
Java の言語パーサーであるJavaCCを見てください。とても使いやすく、コツをつかむことができます
JFlexはスキャナージェネレーターであり、マニュアルによれば、パーサージェネレーターCUPと連動するように設計されています。
JFlexの主な設計目標の1つは、無料のJavaパーサージェネレーターCUPとのインターフェースを可能な限り簡単にすることでした[原文のまま]。
また、 BYACC / Jもサポートしています。これは、その名前が示すように、Javaコードを生成するためのBerkeleyYACCの移植版です。
私はJFlex自体を使用していて、気に入っています。しかし、私が行っていたプロジェクトは、パーサーを手作業で作成するほど単純だったので、CUPとBYACC/Jのどちらが優れているかはわかりません。
パーサー・コンビネーターは良い選択です。一般的な Java 実装は JParsec です。
選択ではありませんが、コンパイラコースで SableCC を使用しました。
非常にかさばり、重量があり、利便性よりも清潔さが重視されていたことを覚えています (演算子の優先順位などはありません。文法でそれを述べる必要があります)。
選択肢があれば他のものを使いたいと思うかもしれません。yacc (C の場合) と happy (Haskell の場合) での私の経験はどちらも楽しいものでした。
BeanShellのソースを確認することをお勧めします。Java用のコンパイラがあり、読むのはかなり簡単です。
あなたがハードコアに行くつもりなら、ミックスにhttp://llvm.orgを少し入れてください:)
http://java-source.net/open-source/parser-generatorsおよびhttp://catalog.compilertools.net/java.htmlには、このためのツールのカタログが含まれています。Stackoverflow の質問Alternatives to Regular Expressionsも比較してください。
JParsecなどのパーサーコンビネータを使用します。それを使用する方法についての良いビデオチュートリアルがあります。