0

私はDSLコンパイラに取り組んでおり、ユーザーによりわかりやすい情報を提供したいと考えています。したがって、GCCやGHCのような成熟したコンパイラーはすべて、どの行でどのセマンティクスエラーが発生したかを指摘でき、生成されたコードからそれらを取り除くことさえできることを覚えています。

最初のアイデアは、解析中にASTに行番号を追加することです。しかし、これが標準的な解決策であるかどうか、またはそれを行うための他のより良い方法があるかどうかはわかりませんか?このソリューションはAST内のすべてのノードに追加のデータをもたらすように要求し、それらが負担になる可能性があるため、私はそれを疑っています。

4

2 に答える 2

1

それらはすべて、どのセマンティクスエラーがどの行で発生したかを指摘できます

むしろ構文上の誤り(まあ、議論することができます...)。重要な点は、これは完全にデバッグ情報ではないということです。むしろ、レクサーパスが現在の行番号で更新できる解析コンテキストを維持するために行きたいと思います。デバッグ情報が必要な場合、それは別のことです。そのためには、最終的に行番号を格納し、デバッガー出力を出力する必要があります(たとえば、Cプログラムをデバッグする場合、行情報を表示するのはデバッガーであり、コンパイラ)。

于 2013-01-20T15:20:30.820 に答える
1

ご存知のように、レクサーは行番号を知っている人です。不明なトークンや構文エラーの場合は、問題なく行番号を取得できます。ただし、デバッグの目的で、デバッグ情報を生成してどこかに保存する必要があります(たとえば、.Netには、コンパイル済みファイルとデバッグ情報ファイルの2つの異なるファイルがあります。Javaでは、デバッグ情報は同じ.classファイルにあります。命令をコード行番号にマップする特別なテーブル内)。その情報は、とりわけASTを使用するデバッグ情報パスによって生成されます。

次に、答えは「はい」です。ASTノードには、デバッグ情報ジェネレーター/コードジェネレーターに使用されるlineNumberプロパティが含まれている可能性があります。これは、コンパイラーとインタープリターの両方で重要です。

私はこのようにして良い結果を出しました。

于 2013-01-20T16:04:39.457 に答える