编程中的语义与语法分析
Semantic vs Syntax analyzing in Programming
我是编译器构造的新手,我试图在编译器构造中的语法分析器编程中制作赋值语句的 CFG(上下文无关文法),我想知道这个非法语句是语义错误还是语法错误?
5=一个;
谢谢!
我们在 "syntax" 和 "semantic" 之间使用的区别在我看来很大程度上是我们目前如何使用 "weak parsers".
构建编译器的偶然结果
编译器的目的是识别已为其提供的有效程序,在可行的情况下诊断该程序中的错误,并将该代码编译成可执行形式。
它如何识别有效程序通常是通过使用 解析器 来完成的,该解析器对程序的句法结构有所了解(在许多情况下由语法明确驱动),然后通过一组 "semantic" 检查来验证提供的结构不违反语言参考手册定义的约束。
作为一个实际问题,无法定义 "parser" 检查所有 "syntax" 约束:解析技术通常(总是!)太弱了。我们满足于最多检查程序的 context-free 结构属性的解析器(例如,"parentheses balance")。我们将所有其他内容推入 "semantic checking"(根据上一段中的定义,这是唯一的其他地方)。
因此,可以定义一个 really 弱解析器,它只读取字符并接受任何字符流(当然,您的程序源由字符组成:),并降级其他一切 "semantic checking"。我们选择的解析器技术可能做的任何额外的语法检查只是(无可否认非常方便)肉汁。
所以,是的,您可以定义一个接受“5=a;”的解析器作为匹配(某些)语法约束,稍后进行语义检查以确保左侧有效。
使用大多数传统的解析器生成器(甚至是手动递归下降解析器),您通常可以通过一些适度的努力为您的语言定义一个语法,该语法将拒绝“5=a;”。作为 "syntax error"。因为这很容易,所以我们经常假设这样的检查实际上是通过解析完成的,所以我们通常会说这是一个 "syntax error" 而不管使用的解析技术如何,即使那是草率的。
相比之下,"String S=3.7;" 可能被我们的解析器接受;类型不一致可能是通过语义检查完成的,所以我们会说类型检查是语义错误。但出现这种解释是因为大多数编译器恰好是以这种方式构建的。
如果你有一个足够强大的(图灵能力)规范系统,(例如,Van Wingaarden Grammars or Meta-S),你实际上可以编码你认为的所有 "syntax" 和 "semantics" 在相同的形式中,并使用该形式 "executed" 来验证您的源代码。如果那个引擎抱怨,是 "syntax error" 还是 "semantic error"?在这种情况下,我们不再有单独的 "parsing" 和 "semantic checking" 所以很难说。充其量你可以说你有一个错误 "parsing the source text as a valid program".
我是编译器构造的新手,我试图在编译器构造中的语法分析器编程中制作赋值语句的 CFG(上下文无关文法),我想知道这个非法语句是语义错误还是语法错误?
5=一个;
谢谢!
我们在 "syntax" 和 "semantic" 之间使用的区别在我看来很大程度上是我们目前如何使用 "weak parsers".
构建编译器的偶然结果编译器的目的是识别已为其提供的有效程序,在可行的情况下诊断该程序中的错误,并将该代码编译成可执行形式。
它如何识别有效程序通常是通过使用 解析器 来完成的,该解析器对程序的句法结构有所了解(在许多情况下由语法明确驱动),然后通过一组 "semantic" 检查来验证提供的结构不违反语言参考手册定义的约束。
作为一个实际问题,无法定义 "parser" 检查所有 "syntax" 约束:解析技术通常(总是!)太弱了。我们满足于最多检查程序的 context-free 结构属性的解析器(例如,"parentheses balance")。我们将所有其他内容推入 "semantic checking"(根据上一段中的定义,这是唯一的其他地方)。
因此,可以定义一个 really 弱解析器,它只读取字符并接受任何字符流(当然,您的程序源由字符组成:),并降级其他一切 "semantic checking"。我们选择的解析器技术可能做的任何额外的语法检查只是(无可否认非常方便)肉汁。
所以,是的,您可以定义一个接受“5=a;”的解析器作为匹配(某些)语法约束,稍后进行语义检查以确保左侧有效。
使用大多数传统的解析器生成器(甚至是手动递归下降解析器),您通常可以通过一些适度的努力为您的语言定义一个语法,该语法将拒绝“5=a;”。作为 "syntax error"。因为这很容易,所以我们经常假设这样的检查实际上是通过解析完成的,所以我们通常会说这是一个 "syntax error" 而不管使用的解析技术如何,即使那是草率的。
相比之下,"String S=3.7;" 可能被我们的解析器接受;类型不一致可能是通过语义检查完成的,所以我们会说类型检查是语义错误。但出现这种解释是因为大多数编译器恰好是以这种方式构建的。
如果你有一个足够强大的(图灵能力)规范系统,(例如,Van Wingaarden Grammars or Meta-S),你实际上可以编码你认为的所有 "syntax" 和 "semantics" 在相同的形式中,并使用该形式 "executed" 来验证您的源代码。如果那个引擎抱怨,是 "syntax error" 还是 "semantic error"?在这种情况下,我们不再有单独的 "parsing" 和 "semantic checking" 所以很难说。充其量你可以说你有一个错误 "parsing the source text as a valid program".