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


8

文法を使用してパーサーを作成する方法を学習していますが、コメントをほとんどどこにでも表示できるため、コメントを表現するのに行き詰まりました。

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

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


「ほとんどどこにでも出現する可能性がある」というのは、ややストレッチです。ステートメント間のコメントのみを許可する言語はかなり多くあります。
MSalters 2012年

1
解析前にコメントが削除されない言語の例として、TCLを参照してください。コメントは文法の一部であり、コメントを間違った場所に配置すると、パーサーが怒鳴ることが予想されます。
マイケルコーン

@Michael TCLの文法が見つかりませんが、このページには静的な文法がないことが示されているようです。

1
@MattFenwick-良い肉汁。そんなに可鍛性があるとは知りませんでした。それが言っていることによると、あなたはTCL文法を持つことができません、それは意味がありません。誤解を招いて申し訳ありませんでした。
Michael Kohne

回答:


2

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

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


17

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

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

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


5

簡単な回答

はい。「レクサー」または「パーサー」のコメントを検出するのが標準的な方法です。

「パーサー」に「レクサー」が組み込まれている場合や、「パーサー」と単一のツールとして混合されている場合があります(「レクサーパーサー」)。

拡張回答

私はそのケースで働いています。

ほとんどの「スキャナー」(「トークン化」または「レクサー」とも呼ばれます)はコメントを検出しますが、トークンを「パーサー」に返すときに削除されます。

時々、プログラミング言語は、「コンパイラ指令」または「ドキュメント」のような特別な意味を持ついくつかのコメントを使用します。

標準コメントの例:

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

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

乾杯。


0

ASTにコメントや不正な入力を保持する一部のパーサーは、ASTのすべてのノードにプロパティとしてそれらを追加します。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.