文法を使用してパーサーを構築する方法を学んでいますが、コメントはほとんどどこにでも表示される可能性があるため、コメントを表現しようとして立ち往生しました。
This は、解析が行われる前にトークンストリームからコメントを削除できることを示します。
それは標準的な習慣ですか、それともコメントは文法で指定されていますか?
それをある種の空白として扱うことは非常に一般的です。 Cのようなセミコロン指向の言語の改行とほとんど同じです。
何らかの形の空白文字になると、パーサーの上位で無視されることがよくあります。
彼らは通常そうではありません。
ソースコードが文字からトークンに変換されるときに、それらはレクサーによって削除されます。
次に、パーサーはトークンを取得してASTを構築します。パーサーがその仕事をするとき、コメントはすでになくなっているので、それらは文法に現れる必要はありません。
Quick Short Answer
はい、「レクサー」または「パーサー」のコメントを検出するのが標準的な方法です
「パーサー」には「レクサー」が組み込まれている場合や、「パーサー」と単一のツール(「レクサーパーサー」)として混在している場合があります。
拡張回答
私はそのケースで働いています。
ほとんどの「スキャナー」(「トークン化」または「レクサー」とも呼ばれます)はコメントを検出しますが、トークンを「パーサー」に返すときに削除されます。
時々、プログラミング言語は、「コンパイラ指令」または「ドキュメント」のような特別な意味を持ついくつかのコメントを使用します。
標準コメントの例:
/*
This function does something cool.
*/
int doSomething()
{
return 0;
}
ディレクティブコメントの例:
/*
##override
*/
int doSomething()
{
return 0;
}
ドキュメントジェネレータの例のコメント:
/*
@description: This Function text will be turn,
into an external pdf file, togheter with other
similar comments.
*/
int doSomething()
{
return 0;
}
ほとんどのコンパイラー関連ツールは、アナライザーまたはプリプロセッサーを使用して、この特別なコメントを検出します。これは、メインのレキサーまたはパーサーではなく、独自の小さなレクサーさえ持っています。
乾杯。
ASTでコメントや不正な入力を保持するパーサーの中には、ASTのすべてのノードにプロパティとして追加するものがあります。
私が正しく思い出せば、それを行うMicrosoft roslynプロジェクトを見ることができます。