0

複数の言語のインラインドキュメンテーションを抽出できる汎用ドキュメンテーションシステムを使用するには、各言語のパーサーが必要です。したがって、パーサジェネレータ(実際にはそれほど完全または効率的である必要はありません)が必要です。

http://antlr.org/は、人気のある言語用の多数の文法をすでに備えている優れたパーサジェネレータです。より良い代替案、つまり、すぐに使用できるさらに多くの言語のパーサーの生成をサポートする単純な代替案はありますか?

4

3 に答える 3

0

「部分的な解析」のみを探している場合は、ANTLR のオプションを使用して、トークン ストリームを部分的に「lex」し、残りのトークンを無視できます。filter=truelexer-grammar でを有効にすることで、これを行うことができます。lexer は、文法で定義した任意のトークンとの一致を試みます。トークンの 1 つと一致しない場合は、1 文字進めて (無視し)、次の文字でトークンの 1 つとの一致を再度試みます。 :

lexer grammar Foo;

options {filter=true;}

StringLiteral
  :  ...
  ;

CharLiteral
  :  ...
  ;

SingleLineComment
  :  ...
  ;

MultiLineComment
  :  ...
  ;

適切に実装すると、Java ファイルからMultiLineComments ( /* ... */) を非常に簡単に取得できます。1 行のコメントや文字列または文字リテラルが混乱することを恐れることはありません。

明らかに、ファイルを適切にトークン化できるようにするには、ソース ファイルが有効である必要があります。そうしないと、奇妙な結果が得られます。

于 2010-04-04T18:45:23.167 に答える
0

私のコンパイラは Dypgen を使用しています。これはユーザーが拡張可能な GLR パーサーであり、多くの拡張機能を備えているため、多くの言語を解析できます。ブートストラップ文法は EBNF に似ています (プロダクションで * + と ? を直接サポートします)。拡張機能を動的にロードするのに十分なほど強力です。これは、私のコンパイラが活用している事実です。私のプログラミング言語の大部分は、コンパイラの起動時に構文が動的にロードされます。

Dypgen は Ocaml で書かれており、Ocaml コードを生成します。

ほとんどの C++ を解析するのに十分強力な Elkhound と呼ばれる C++ GLR パーサーがあります。

ただし、実際の要件については、深刻な解析を行う必要はありません。おそらく、正規表現マッチング エンジンで十分です。Google の re2 が適している可能性があります (ほとんどの PCRE 機能を提供し、はるかに高速で、C++ インターフェイスを備えています)。

これは正確ではありませんが、インライン ドキュメントがいくつかの単純な形式に準拠するように要求できるため、十分です。ほとんどの既存のインライン ドキュメントは、まさにこの理由で既にそうしています。

于 2010-12-04T20:57:56.797 に答える
-1

私が働いている場所では、 GOLDパーサーを使用していました。これはAntlrよりもはるかに単純で、複数の言語をサポートしています。その後、より複雑な解析を行う必要があったため、Antlrに移行しました。これは、Antlrの方がGOLDよりも優れていることがわかりました。

于 2010-04-03T22:22:37.147 に答える