我们是否应该尽早解析通用语言(在Lex中)或者更方便的地方(在Yacc中)提供更多信息时发现错误?各种语言如何解决这个问题?
答案 0 :(得分:3)
通常错误越复杂,用于声明错误的代码就越复杂。词典和解析器相当简单(在实践中),因此可以捕获简单的错误。
复杂错误通常发生在运行时的其他位置或编译时的各种转换中。示例可能包括引用不存在的函数/方法。关闭范围/绑定,对象和引用标识符,参数有效性,重载以及大量其他语言相关的东西。
在非常狭窄的令牌/语法范围之外的任何东西(或应该被处理)远远超出AST分析或中间代码生成中的那些工具。
考虑:
a.b();
ab();
两个都应通过词法分析器/解析器使其成为面向对象的语言,其中两个语句都是有效的。 是否有错误?
如果语言是相当静态的,并且可以在编译时解析标识符,那么编译器可能会在编译时时断言。
您可以使用ID解析代码替换两个语句,以便在运行时下运行,以产生运行时错误而不是编译器错误。
运行时和编译时解析和语义之间的差异可能很微妙,而且语言与语言之间存在很大差异。
错误通常在已知为错误且您拥有最多信息时被捕获。这在语言和实现之间有所不同。
答案 1 :(得分:0)
错误处理应在词法分析和解析过程中完成。 应尽可能早地通过扫描程序本身捕获诸如无效字符之类的令牌错误。 但是扫描程序无法捕获语法错误等错误,因此可以在解析器中处理这些错误。