语法和语法有什么区别?


14

我了解语法和语义之间的区别-

语法:如何将符号组合以形成有效的表达式或语句。
语义:构成表达式或陈述的那些符号的含义。

但是语法是什么?例如:有时我听到人们说某些结构“在语法上是不正确的,但在语法上是正确的”。这是什么意思?


FWIW,对我来说这听起来像胡话。如果语言的语法接受一段代码,则它符合语法。也许有人对“语法”有非常宽泛的(非标准的)定义。上下文/来源?

@delnan。不对。例如,int;在语法上有效,但是在C ++中语法上格式错误。该代码的语法没有问题,但是如果声明的第一部分不包含class-specifierenum-specifier,或者在C ++ 11 中不是friend-specifier,则语法约束要求提供名称。
Johannes Schaub-litb 2011年

@ JohannesSchaub-litb:想要引用语法中使之有效的部分吗?

@Johanes那是问题的反面。
妮可

2
// @ Johannes Schaub:什么规则使“ int;” 有效?语法定义语法。
凯西·帕顿

Answers:


6

语法是定义特定语言语法的一组规则。

当人们特别谈论解析器时(尤其是解析器生成器生成的解析器,如yacc,Byacc,ANTLR等),他们可能会做更多的拆分工作,并专门谈论那些使用生成器的编码进行编码的语法规则规则,以及由规则附带的代码分别实施的那些部分。例如,在C中定义数组时,为数组指定的大小必须严格为正(不为零)。语法规则基本上可以说如下:

typename var_name '[' unsigned_int ']'

...然后分别进行一些代码检查unsigned_int是否为非零。在这种情况下,它可能会做一些有意义的谈语法和彼此分开语法的要求,具有略微不同的要求,这两个(即,强制执行一起,我们假设符合语言本身的要求)。


3

区别是模糊的,不值得过多担心。

人们有时会在句法正确性的保护下包含上下文相关的约束。最常见的示例是类型系统。另一个是Java的“返回后不声明”规则。这简化了形式化的讨论:语法产生一种语言(一组句子/表达式/程序),这是语义的领域;其他任何东西都是“不是程序”,并且语义不必理会它。

相反,“语法”通常是指描述上下文无关语言的方法(尽管有属性语法)。

不必担心太多的原因是,类型系统被视为语言的“静态语义 ”,而被视为“ 正确性的语法规则”。有时,一种语言没有完全正确的上下文无关语法;例如,C必须将信息从解析器反馈回词法分析器。

务实的是,任何依赖“句法”和“语法”之间区别的人最好这样说并解释它们的意思。


我不明白为什么差异如此模糊。语法描述了语法。
凯西·帕顿

1
@Casey,不,根据单词“ syntax”的一种用法,语法指定了语法的超集
Ryan Culpepper

0

语法是定义语言的一组规则。而是,语法描述了语法和语义。一种语言可能具有两种不同的语法:

  • 语法语法(描述语言中符号顺序的一组规则)
  • 语义语法(描述这些符号的有效语义位置和使用的一组规则)

例如,C语言中的部分语法可能类似于:

if statement -> if_keyword "(" expression ")" if_block
if_keyword -> "if"
logical_statement -> some other stuff here...

含义:

an if statement is made of an if keyword followed by a parenthesis followed by an expression followed by a parenthesis followed by an if block
an if keyword is ....

看一下这种定义语法的方式。如果您真的对语法感到好奇,请看一下GNU Bison,它基本上是一种描述语言语法的工具。

“语法上不正确,但语法上正确”并没有太大意义。也许他们指的是描述一种语言语义的语法。不过,只说“在语义上不正确”肯定会更有意义。


7
不,语法不会定义语义,并且永远不要这么做,除非它是一种异国情调的东西,例如contextfreeart.org
SK-logic,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.