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

sest 发布于 2019-03-09 bnf 最后更新 2019-03-09 14:37 3 浏览

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

<A> ::= <B> | <C>
<B> ::= 1 | 2 | 3
<C> ::= 4 | 5 | 6
这种语言的指称语义是什么样的?非终端包含在'<'中和'>'和终端不是。我想将1 ... 6映射到自然数域。我不清楚的是我是否需要为非终端提供映射。看起来我不需要这样做,例如,<A> ::= <B> | <C>没有意义;它只是一个结构。忽略,现在我们可以完全消除这个规则。 所以,就目前而言,这就是我认为完整的指称定义应该是这样的:右侧(斜体)代表自然数的相应值: [[1]] =one [[2]] =two [[3]] =three [[4]] =four [[5]] =five [[6]] =six 从美学角度来看,根本就不提ABC,但我想这些符号永远不会出现在实际的程序中(例如:4),所以这可能就足够了。关于这个主题的所有材料都省略了这些非常简单的细节,从他们的讨论中可以看出语言定义过程的方面。
已邀请:

fearum

赞同来自:

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

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都会直接进入终端。 边注: 值得一提的是为什么我们给定语法来定义语义。 语法是定义语义的最方便的语言定义。这是因为可以使用我们语言结构的归纳来轻松定义语义。 我们提供基本案例的规则 - 终端和非平凡的生产,例如我们的例子中的+