Answers:
语法与语言的结构或语法有关。它回答了以下问题:如何构造有效的句子?所有语言,甚至英语和其他人类(也称为“自然”)语言都具有语法,即定义句子是否正确构建的规则。
以下是一些C语言语法规则:
语义与句子的含义有关。它回答了以下问题:这句话是否有效?如果是这样,那句话是什么意思?例如:
x++; // increment
foo(xyz, --b, &qrs); // call foo
是语法上有效的C语句。但是它们是什么意思呢?尝试将这些语句转换为可执行的指令序列甚至有效吗?这些问题是语义学的核心。
在第一条语句中考虑++运算符。首先,尝试这样做是否有效?
最后,请注意,某些语义无法在编译时确定,因此必须在运行时进行评估。在++运算符示例中,如果x已经是其数据类型的最大值,那么当您尝试向其添加1时会发生什么?另一个例子:如果您的程序尝试取消引用值为NULL的指针会发生什么?
总而言之,语法是仅针对句子本身是否对该语言的语法有效的概念。语义是关于句子是否具有有效含义。
x
将的数据1
设为最大值并添加到数据中,则会导致输出奇怪的输出(0
),这不是语义错误吗?
UINT_MAX + 1 == 0
)。签名溢出未定义。现代编译器通常都有INT_MAX + 1 == INT_MIN
,但有你不能指望这样的情况如(for (i = 0; i <= N; ++i) { ... }
这里N
是INT_MAX
不是无限取决于优化;见blog.llvm.org/2011/05/what-every-c-programmer-should-know。 html)。
语法是指一种语言的结构,其词源可追溯到事物的组合方式。
例如,您可能需要通过声明一个类型,一个名称,然后一个分号来将代码组合在一起,以使语法正确。
Type token;
另一方面,语义是关于意义的。编译器或解释器可能会抱怨语法错误。您的同事会抱怨语义。
语法是表达式,语句和程序单元的结构或形式,而语义是这些表达式,语句和程序单元的含义。语义学直接源自语法。 语法指的是特定编程语言指定的代码结构/形式,但是语义处理分配给符号,字符和单词的含义。
语法:它指的是语言的语法结构。您必须非常小心地使用数据类型,标记[它可以是文字或符号,例如“ printf()”。它具有3个令牌,“ printf,(,)”]。同样,您必须非常小心如何使用函数,函数语法,函数声明,定义,初始化和调用它。
在语义上,它与句子或陈述的逻辑或概念有关。如果您出于概念或逻辑说或写某事,那么您在语义上是错误的。
通常,代码的语法和语义分析是在编译器的“前端”部分完成的。
语法:编译器为每个关键字和符号生成令牌:令牌包含关键字的信息类型及其在代码中的位置。使用这些标记,可以创建并分析AST(抽象语法树的缩写)。编译器实际上在这里检查的是代码是否在词法上有意义,即“关键字序列”是否符合语言规则?如先前答案中所建议,您可以将其视为语言的语法(而不是代码的含义/含义)。旁注:此阶段报告语法错误。(将具有错误类型的令牌返回给系统)
语义:现在,编译器将检查您的代码操作是否“有意义”。例如,如果语言支持类型推断,则在尝试将字符串分配给浮点数时将报告语义错误。或两次声明同一变量。这些是“语法上” /语法上正确的错误,但在操作过程中没有任何意义。旁注:为了检查同一变量是否被声明两次,编译器管理符号表
因此,这两个前端阶段的输出是带注释的AST(具有数据类型)和符号表。
考虑到我们使用的普通语言;在这里,英语:
他去学校了。-错误的语法/语法,尽管他想传达正确的意义/语义。
他去感冒了。-感冒是一个形容词。用英语,我们可能会说这不符合语法,但实际上它是我想到的最接近具有正确语法的不正确语义的示例。