我知道需要语法分析以确定给定的一系列标记在某种语言中是否合适(通过解析这些标记以生成语法树),并检测在解析输入代码期间发生的由语法引起的错误错误的陈述。
我还知道,然后对语法树执行语义分析以生成带注释的树,检查与句法形式无关的方面(例如使用前表达式和声明的类型正确性),并检测在代码在语法上正确解析后执行。
但是,我不清楚以下问题:
如果语法分析器检测到语法错误,这是否意味着不应进行语义分析?也许从错误中恢复(在语法分析中)应该可以进行语义分析?
答案 0 :(得分:1)
当您编译不正确的程序时,通常希望编译器通知您尽可能多的问题,以便您可以在尝试再次编译程序之前将其全部修复。但是,您不希望编译器多次报告相同的错误,也不希望报告不是真正错误的东西,而是报告编译器被先前的错误弄糊涂的结果。
或者我对你有期望吗?也许我应该以第一人称写完整的段落,因为这实际上与我对编译器的期望有关。也许您有不同的期望。也许您的期望与我的相似。无论它们是什么,您都应该编写编译器来满足它们。基本上,这就是编写自己的编译器的重点。
因此,如果您同意我的期望,那么您可能希望进行尽可能多的语义分析,以使自己有足够的信心。例如,您可能能够在某些函数中进行类型检查,因为这些函数中没有语法错误。另一方面,这需要进行大量工作,并且总是有可能导致产生的错误消息无济于事。
这不是很精确,因为确实没有确切的答案。但是您至少应该能够代表自己回答自己的问题。如果您的编译器在错误报告方面做得很糟糕,而您在尝试使用编译器时发现这一点令人沮丧,那么您应该努力使报告更好。 (但是,当然,时间是有限的,即使错误报告不是很大,您也可能会感到编译器如果优化得更好会更好。)