文法仕様と意味解析の境界線はどこにあるのだろうと思っています。詳細な文法記述を使用するか、詳細をセマンティック フェーズに残すか、どちらが優れていますか? 例: プリミティブ型から「派生」できる列挙型を持つ C# のような OO 言語を想像してください。
enum X : int { a = 1 }
では、enum の base-type の正しさ (この場合はプリミティブ型か非プリミティブ型か) は、文法チェックまたは意味解析の対象とすべきでしょうか?
文法仕様と意味解析の境界線はどこにあるのだろうと思っています。詳細な文法記述を使用するか、詳細をセマンティック フェーズに残すか、どちらが優れていますか? 例: プリミティブ型から「派生」できる列挙型を持つ C# のような OO 言語を想像してください。
enum X : int { a = 1 }
では、enum の base-type の正しさ (この場合はプリミティブ型か非プリミティブ型か) は、文法チェックまたは意味解析の対象とすべきでしょうか?
これは非常に幅広い質問です。他にも多くの考慮事項があるため、すべての状況で 1 つの戦術が別の戦術よりも優れていると単純に言うのは非常に困難です。それはあなたの目的と残りの言語の定義に依存します。言語の他の部分が本質的に構文的に曖昧である場合 (意味情報を使用して曖昧さを解消する必要がある場合)、意味分析のステップとしてタスクを実行する必要があることは明らかです。
そうは言っても、私はすべてのエラーをできるだけ早く発見するのが好きです。あなたの言語とターゲットが、無効なプログラムを拒否するためのセマンティック分析を必要とせずに、入力の完全に明確なセマンティック表現を解析できる場合、それが断然最良のアプローチになると思います。
基本的に、エラーのあるプログラムをできるだけ早く拒否する能力と、文法とパーサーの複雑さ、および文法記述と意味解析フェーズの間の労力の重複とのバランスをとっていることは間違いありません。ある方法で物事を行う方が別の方法よりも優れているとは決して言えません。