Compiler construction 语法与语义分析

Compiler construction 语法与语义分析,compiler-construction,grammar,semantic-analysis,Compiler Construction,Grammar,Semantic Analysis,我想知道语法规范和语义分析之间的界限在哪里。更好的方法是:使用详细的语法描述,还是将细节留给语义阶段?例如:想象一种像C#这样的OO语言,其enum类型可以“派生”自原始类型 enum X : int { a = 1 } 现在,enum基类型的正确性(在本例中为原语或非原语类型)应该成为语法检查或语义分析的主题吗?这是一个非常广泛的问题。还有许多其他考虑因素,因此很难简单地说,在所有情况下,一种策略优于另一种策略。这取决于你的目的和其他语言的定义。如果语言的其他部分在句法上具有固有的歧义性(并

我想知道语法规范和语义分析之间的界限在哪里。更好的方法是:使用详细的语法描述,还是将细节留给语义阶段?例如:想象一种像C#这样的OO语言,其enum类型可以“派生”自原始类型

enum X : int { a = 1 }

现在,enum基类型的正确性(在本例中为原语或非原语类型)应该成为语法检查或语义分析的主题吗?

这是一个非常广泛的问题。还有许多其他考虑因素,因此很难简单地说,在所有情况下,一种策略优于另一种策略。这取决于你的目的和其他语言的定义。如果语言的其他部分在句法上具有固有的歧义性(并且必须使用语义信息消除歧义),那么显然有必要将执行任务作为语义分析的一个步骤

也就是说,我喜欢尽早发现所有错误。如果您的语言和目标允许您解析输入的完全明确的语义表示,而不需要任何语义分析来拒绝无效的程序,那么我相信这将是目前为止最好的方法


基本上,您肯定是在平衡您尽早拒绝错误程序的能力与语法和解析器的复杂性以及语法描述和语义分析阶段之间的重复工作。我不认为用一种方式做事比用另一种方式做事更好。这本书很好地描述了在不同层次上实现语言功能的一些权衡:尽管我必须承认我并不肯定,但它直接解决了这个问题。我读过这本书,由于缺乏此类信息,我提出了这样的问题问题在这里。我认为我的问题纯粹是理论性的。我想知道哪种方法更好。