2

C++で記述されたコンパイラーのASTを変換するのに役立つツリーパーサージェネレーターを見つけたいと思います。

いくつかの簡単な調査の結果、ANTLR(Cで動作するようにターゲットを設定できますが、C ++では動作しない)について知りました。また、C ++でANTLRを使用しないように警告するWebサイトを見つけました:http://www.bearcave.com/software/antlr/antlr_treeparse.html。この記事も10年前のものであるため、苦情は古くなっている可能性があります。

とにかく、私が知りたいのは、そこに代替手段があるかどうか、または私はANTLRを使用するか、自分で書くことに固執していますか?

4

8 に答える 8

4

他にもたくさんのパーサジェネレータがありますが、ANTLRに何年も不満を持っていた後、最新バージョンはかなり良いように思えます。

于 2009-06-04T03:39:03.483 に答える
3

パーサーは、レクサーから事前定義された方法で入力トークンのストリームを必要とします。ツリーパーサーの場合、それを理解できるようにAST'ストリーム'を定義する必要があります。したがって、パーサーとレクサーはインターフェースについて合意する必要があり、ツリーパーサーとパーサーも合意する必要があります。

ツリー解析を使用すると、ASTツリーで変換を行うことができます。これは非常に便利です。私が聞いた唯一のc/c++ツリーパーサーはiBurgです。私はそれを使用していません、そして私はツリーパーサーが主に学界で使用されていると思います。私が見たほとんどのアプリケーションでは、ASTを使用している場合、すべての作業をツリー上で直接実行します。これは、彼らも独自のマッチングルールを実行する必要があることを意味します。

于 2009-06-04T03:50:43.957 に答える
3

スピリット ブーストライブラリ、特に解析ツリーと ASTに関する章を確認してください。

于 2009-06-04T04:19:16.040 に答える
2

Propを使用できる場合があります。これは、MLのような代数的データ型とパターンマッチングをサポートするC++拡張機能です。それはそれを使ってコンパイラを書くことを本当に楽しいものにする多くの機能を持っています。

パターンマッチングを使用すると、ツリーの変換が非常に簡単になります。

残念ながら、開発は終わったようですが、かなりうまく機能しています。私はそれを使っておもちゃのスキームのような言語を作りました、そしてそれは本当に素晴らしかったです。何の問題もありません。

于 2009-06-10T23:25:33.040 に答える
1

「PCCTSとC++を使用した言語翻訳(リファレンスガイド)」というタイトルのこの論文を見つけました:http ://citeseerx.ist.psu.edu/viewdoc/summary?doi = 10.1.1.2.9850

(これは、ANTLRとSorcererの両方を参照します。Sorcererは、ANTLRになる前のANTLRのツリーパーサーの名前でした)。これはまさに私が必要としているものかもしれません。

于 2009-06-04T03:40:56.073 に答える
1

既にコンパイラーを持っていて、ライブラリーを使用して AST をウォーク / 変換したい場合、Antlr がそれを処理できるのか、それともこれを行うように設計されているのかわかりません。

Antlr の通常の使用法では、AST の設定は lexer と parser を定義することによって Antlr で行われます。次に、この AST でツリー ウォーカーと変換を定義できます。

于 2009-06-10T23:09:00.937 に答える
1

また、コンパイラに ANTLR 生成 C++ コードを使用していますが、問題はありません。確かに、ANTLR は C++ を直接サポートしていませんが、技術的には C++ での使用を妨げるものではありません。

ANTLR には、構文を視覚的に確認できる GUI ANTLRWorks に関する別の利点もあります。これは、文法を開発する際に非常に役立ちます。

そして何よりも、無料です。:) (とは言っても、を買うのに役立ちます)

于 2009-06-04T05:56:35.323 に答える
0

ANTLRを使用してCコードを生成し、C++から呼び出すことができます。これを使用してC++コード自体を生成すると、問題が発生する可能性があると思います。特定の問題についてはよくわかりませんが、ANTLRを使用してC++コードを問題なく生成しています。

于 2009-06-04T03:38:23.843 に答える