Cのコメントを解析していることを確認したい場合は、モデルをC仕様に直面させる必要があります。C99は、次のように§6.4.9コメントの構文を定義しています。
1.文字定数、文字列リテラル、またはコメント内を除き、文字/*
はコメントを示します。このようなコメントの内容は、マルチバイト文字を識別し、*/
それを終了させる文字を見つけるためにのみ検査されます。
2.文字定数、文字列リテラル、またはコメント内を除いて、文字//
は次の改行文字までのすべてのマルチバイト文字を含むコメントを導入します。このようなコメントの内容は、マルチバイト文字を識別し、終了する改行文字を見つけるためにのみ検査されます。
これは英語の散文であり、正式な定義ではありませんが、コメントを消費する非決定的有限オートマトン(NFA)に関してかなり明確な解釈があります。
- 初期状態から
/
続いて*
、マルチコメント内の状態に入り、/
続いて/
シングルコメント内の状態に入ります。
- 複数行コメント内の状態から
*
続き、コメント後状態に/
入ります。
- 単一行コメント状態から、改行はコメント後状態になります。
- 他の文字は状態を変更しません。
初期状態が適用されるかどうかを知るには、文字列リテラルと文字リテラルを検出するためにもう少し分析を行う必要があることに注意してください。
NFAを取得したら、標準的な手法を使用して正規表現を作成できます(Wikipediaの記事には記載されていませんが、教科書で説明する必要があります)。
すでに正規表現があり、それをテストしたい場合は、生成された言語を、言語仕様から推定されたNFAの言語と比較できます。正規言語の同等性は決定可能です。等しいかどうかを判断する1つの方法は、それぞれに対して最小の決定論的オートマトンを構築することです。言語が同等の場合、最小DFAは同型になります。