5

レクサーはこのあいまいさをどのように解決しますか?

/*/*/

それは、複数行のコメントの始まりであり、その後に別の複数行のコメントが続くというだけではないのはどうしてですか。

貪欲なレクサーは、次のトークンを返すだけではないでしょうか。

  • / *
  • / *
  • /

私はCSS用のshift-reduceパーサーを書いている最中ですが、この単純なコメントが邪魔になっています。これ以上の背景情報が必要ない場合は、この質問を読むことができます。

アップデート

そもそもこれを省略してすみません。このフォームでCSS言語に拡張機能を追加することを計画していますが、 /* @ func ( args, ... ) */CSSを理解しているが、私のこの拡張機能コメントを理解していないエディターを混乱させたくありません。そのため、レクサーはコメントを無視できません。

4

6 に答える 6

9

これを行う1つの方法は、レクサーが最初のに遭遇したときに別の内部状態に入ること/*です。たとえば、これらを「開始条件」flexと呼びます(Cスタイルのコメントの一致はそのページの例の1つです)。

于 2010-04-13T23:43:26.570 に答える
6

/*(anything)*/最も簡単な方法は、おそらくコメントを1つのトークンとしてlexすることです。つまり、「START COMMENT」トークンを発行せず、代わりに、ビット全体を含む「COMMENTBLOCK」トークンを発行できるようになるまで入力を読み取り続けます。。

コメントは実行可能コードの実際の解析とは関係がないため、基本的にレクサーによってコメントが削除される(または少なくとも単一のトークンにまとめられる)ことは問題ありません。コメント内のトークンの一致は気にしません。

于 2010-04-13T23:42:20.407 に答える
3

ほとんどの言語では、これはあいまいではありません。最初のスラッシュとアステリックスは、「複数行コメントの開始」トークンを生成するために使用されます。その後に、コメント内のプレーンな「コンテンツ」であるスラッシュが続き、最後の2文字は「複数行コメントの終わり」トークンです。

最初の2文字が消費されるため、最初のアステリックスを使用してコメントの終わりトークンを生成することもできません。2番目の「コメントの開始」トークンが生成される可能性があることに注意しました...おっと、パーサーで使用可能なコンテキストの量によっては、問題になる可能性があります。

ここでは、コメントのパーサーレベルの処理を想定して、トークンについて説明します。ただし、同じことがレクサーにも当てはまります。これにより、基本的なルールは、最初に開始し'/*'、検出されるまで停止しない'*/'ことです。事実上、コメント全体のレクサーレベルの処理は、2番目の「コメントの開始」と混同されることはありません。

于 2010-04-13T23:37:47.880 に答える
0

正規表現のアルゴリズムを使用して、文字列の先頭から現在の場所まで検索します。

if (chars[currentLocation] == '/' and chars[currentLocation - 1] == '*') {
  for (int i = currentLocation - 2; i >= 0; i --) {
    if (chars[i] == '/' && chars[i + 1] == '*') {
      // .......
    }
  }
}

これは、正規表現の/\*([^\*]|\*[^\/])\*/欲張りとボトムアップを適用するようなものです。

于 2010-04-13T23:36:34.100 に答える
0

CSSはネストされたコメントをサポートしていないため、例では通常、単一のトークンに解析されますCOMMENT。つまり、レクサーは開始コメントマーカーと見なし、シーケンス/*までのすべてを消費します。*/

于 2010-04-13T23:47:15.737 に答える
0

これを解決する1つの方法は、レクサーを返すことです。

/
*
/
*
/

そして、そこからパーサーに対処してもらいます。/や*は乗算などにも使用できるため、ほとんどのプログラミング言語でおそらくこれを実行します。これらはすべて、レクサーが心配するのは複雑すぎます。レクサーは実際には基本記号を返すだけです。

トークンがコンテキストに依存しすぎている場合は、探しているものがより単純なトークンである可能性があります。

そうは言っても、CSSはプログラミング言語ではないので、/と*をオーバーロードすることはできません。コメント以外の目的には使用できません。ですから、あなたがそうしない正当な理由がない限り、私はコメントトークンとして全部を渡すことを非常に誘惑するでしょう:/\*.*\*/

于 2010-04-14T00:01:29.200 に答える