web-dev-qa-db-ja.com

コメントはプログラミング言語の文法でどのように表現されますか?

文法を使用してパーサーを構築する方法を学んでいますが、コメントはほとんどどこにでも表示される可能性があるため、コメントを表現しようとして立ち往生しました。

This は、解析が行われる前にトークンストリームからコメントを削除できることを示します。

それは標準的な習慣ですか、それともコメントは文法で指定されていますか?

8
user39685

それをある種の空白として扱うことは非常に一般的です。 Cのようなセミコロン指向の言語の改行とほとんど同じです。

何らかの形の空白文字になると、パーサーの上位で無視されることがよくあります。

2
user1249

彼らは通常そうではありません。

ソースコードが文字からトークンに変換されるときに、それらはレクサーによって削除されます。

次に、パーサーはトークンを取得してASTを構築します。パーサーがその仕事をするとき、コメントはすでになくなっているので、それらは文法に現れる必要はありません。

17
deadalnix

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;
}

ほとんどのコンパイラー関連ツールは、アナライザーまたはプリプロセッサーを使用して、この特別なコメントを検出します。これは、メインのレキサーまたはパーサーではなく、独自の小さなレクサーさえ持っています。

乾杯。

5
umlcat

ASTでコメントや不正な入力を保持するパーサーの中には、ASTのすべてのノードにプロパティとして追加するものがあります。

私が正しく思い出せば、それを行うMicrosoft roslynプロジェクトを見ることができます。

0
Patrick