我如何表示这种语法的语义?

时间:2013-04-11 16:18:08

标签: bnf formal-semantics denotational-semantics

我正在编写语言规范,我需要解决以下基本问题。假设我有(公认的人为的)抽象语法:

<A> ::= <B> | <C>
<B> ::= 1 | 2 | 3
<C> ::= 4 | 5 | 6

这种语言的指称语义是什么样的?非终端包含在'&lt;'中和'&gt;'和终端不是。我想将1 ... 6映射到自然数字域。对我来说根本不清楚的是我是否需要为非终端提供映射。似乎我不应该这样,因为例如<A> ::= <B> | <C>没有意义;它只是一点结构。忽略,目前我们可能完全消除此规则。

所以,就目前而言,这就是我认为完整的指称定义应该是这样的,其中右侧(斜体)代表自然数字的对应值:

[[1]] = 一个

[[2]] = 2

[[3]] = 3

[[4]] = 4

[[5]] = 5

[[6]] = 6

在美学上,似乎很奇怪,根本不提ABC,但我想这些符号永远不会出现在实际程序中(例如:4),所以也许这就足够了。我在这个主题上的所有材料都忽略了语言定义过程中的这个非常简单,具体的方面。

1 个答案:

答案 0 :(得分:2)

语义应用于语法生成的程序。当您从该语法生成​​程序时,您将看不到非终端,因此您不需要为它们定义语义。

考虑例子:

Exp ::= Num | Exp + Exp
Num ::= 0,1,2,...

在这个例子中,有必要逐个定义整个Num的语义,但定义Exp的语义也很重要,因为其中一个产品即使不是终端(但是它有一些终结的概念 - +不会改变)有一些特殊含义 - 添加。

所以你会这样做:

[[0]] = 0 // first 0 is just some string, the second is a number from N
[[1]] = 1 ...
[[Exp + Exp]] = [[Exp]] + [[Exp]] // first + sign is just string,
                                  // the second is addtion in N

正如您所看到的,当您定义语义时,您正在努力为每个可能由您的语法生成的程序赋予意义。

您可以将其想象如下:当您的生产可以递归应用时,您需要为其定义语义 - 这就是Exp + Exp的情况。然而,Num无论您尝试做什么,都会直接前往终点站。

旁注: 值得一提的是为什么我们会用语法来定义语义。

语法是定义语义的最方便的语言定义。这是因为可以使用我们语言结构的归纳来轻松定义语义。 我们提供基本案例的规则 - 终端和非平凡的生产,例如我们的例子中的+