我了解语法和语义之间的区别-
语法:如何将符号组合以形成有效的表达式或语句。
语义:构成表达式或陈述的那些符号的含义。
但是语法是什么?例如:有时我听到人们说某些结构“在语法上是不正确的,但在语法上是正确的”。这是什么意思?
int;
在语法上有效,但是在C ++中语法上格式错误。该代码的语法没有问题,但是如果声明的第一部分不包含class-specifier或enum-specifier,或者在C ++ 11 中不是friend-specifier,则语法约束要求提供名称。
我了解语法和语义之间的区别-
语法:如何将符号组合以形成有效的表达式或语句。
语义:构成表达式或陈述的那些符号的含义。
但是语法是什么?例如:有时我听到人们说某些结构“在语法上是不正确的,但在语法上是正确的”。这是什么意思?
int;
在语法上有效,但是在C ++中语法上格式错误。该代码的语法没有问题,但是如果声明的第一部分不包含class-specifier或enum-specifier,或者在C ++ 11 中不是friend-specifier,则语法约束要求提供名称。
Answers:
语法是定义特定语言语法的一组规则。
当人们特别谈论解析器时(尤其是解析器生成器生成的解析器,如yacc,Byacc,ANTLR等),他们可能会做更多的拆分工作,并专门谈论那些使用生成器的编码进行编码的语法规则规则,以及由规则附带的代码分别实施的那些部分。例如,在C中定义数组时,为数组指定的大小必须严格为正(不为零)。语法规则基本上可以说如下:
typename var_name '[' unsigned_int ']'
...然后分别进行一些代码检查unsigned_int是否为非零。在这种情况下,它可能会做一些有意义的谈语法和彼此分开语法的要求,具有略微不同的要求,这两个(即,强制执行一起,我们假设符合语言本身的要求)。
区别是模糊的,不值得过多担心。
人们有时会在句法正确性的保护下包含上下文相关的约束。最常见的示例是类型系统。另一个是Java的“返回后不声明”规则。这简化了形式化的讨论:语法产生一种语言(一组句子/表达式/程序),这是语义的领域;其他任何东西都是“不是程序”,并且语义不必理会它。
相反,“语法”通常是指描述上下文无关语言的方法(尽管有属性语法)。
不必担心太多的原因是,类型系统被视为语言的“静态语义 ”,而被视为“ 正确性的语法规则”。有时,一种语言没有完全正确的上下文无关语法;例如,C必须将信息从解析器反馈回词法分析器。
务实的是,任何依赖“句法”和“语法”之间区别的人最好这样说并解释它们的意思。
语法是定义语言的一组规则。而是,语法描述了语法和语义。一种语言可能具有两种不同的语法:
例如,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,它基本上是一种描述语言语法的工具。
“语法上不正确,但语法上正确”并没有太大意义。也许他们指的是描述一种语言语义的语法。不过,只说“在语义上不正确”肯定会更有意义。