1

我正在编写语言规范,我需要解决以下基本问题。假设我有(诚然做作的)抽象语法:

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

这种语言的指称语义是什么样的?非终结符包含在 '<' 和 '>' 中,终结符不是。我想将1...映射6到自然数域。我完全不清楚的是我是否需要为非终端提供映射。似乎我不需要,因为,例如,<A> ::= <B> | <C>没有意义;它只是一个结构。忽略,暂时我们可以完全消除这条规则。

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

[[1]] =

[[2]] =

[[3]] =

[[4]] =

[[5]] =

[[6]] =

A从美学上讲,不提,B或根本不提似乎很奇怪C,但我认为这些符号永远不会出现在实际程序中(如4:),所以也许这就足够了。我所拥有的关于这个主题的所有材料都在他们的讨论中忽略了语言定义过程的这个非常简单的具体细节。

4

1 回答 1

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但是,无论您尝试做什么,都会直接导致终端。

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

语法是定义语义的最方便的语言定义。这是因为语义可以很容易地使用对我们语言结构的归纳来定义。我们为基本案例提供规则——终端和非平凡的生产,就像+​​我们的例子一样。

于 2013-04-11T16:37:22.770 回答