2013-04-11 81 views
1

我在寫一個語言規範,我需要解決以下基本問題。假設我有(被認爲是人爲的)抽象語法:我如何表示這個語法的語義?

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

這種語言的指稱語義是什麼樣的?非終端包含在'<'和'>'中,終端不是。我想將1 ... 6映射到自然數域。我不清楚的是我是否需要爲非終端提供映射。似乎我不需要,因爲,例如,<A> ::= <B> | <C>沒有意義;它只是一個結構。忽略,暫時我們可能完全消除這個規則。

所以,它的立場,這是我認爲整個指稱定義應該是什麼樣子,在右手邊(以斜體)表示從自然數相應的值:

[[1]] =一個

[[2]] =

[[3]] =

[[4]] =

[[5]] =

[[6]] =

美學,它似乎很奇怪何況AB,或C所有,但我想,那些符號將永遠不會出現在實際程序中 (如:4),所以也許這就夠了。關於這個主題的所有資料都省略了這些非常簡單的細節,從他們的討論中可以看出語言定義過程的方方面面。

回答

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的情況。但是,無論您嘗試做什麼,它都會直接通向終端。

旁註: 值得一提的是爲什麼我們給語法來定義語義。

語法是定義語義的最方便的語言定義。這是因爲語義可以通過歸納我們語言的結構來輕鬆定義。 我們爲基礎案例 - 終端和非平凡生產提供規則,如我們示例中的+