簡體   English   中英

BNF中的遞歸定義

[英]Recursion definitions in BNF

我最近開始學習編程語言,並且我試圖更好地理解BNF中的遞歸定義。

例如,如果我們將標識符視為由字母和數字組成但始終以字母開頭的任何事物,則該標識符的定義為

<identifier> ::= <letter> | <identifier> <character>
<character>  ::= <digit> | <letter>

但是當我們考慮數字的定義時,它變得很有趣。 應該是這個嗎

<number> ::= <digit> | <number> <digit>

或這個?

<number> ::= <digit> | <digit> <number>

–語法上它們似乎都是正確的,但我的膽量說它們的語義會有所不同–一個數字將是0123456789,另一個將是–9876543210。我是否錯,兩個數字定義都有效?

如果允許數字以前導零開頭,則這兩個數字定義都是正確的。 由於我們通常不允許這樣做,因此更常見的定義是:

<non-zero-number> ::= <non-zero-digit> | <non-zero-number> <digit>
<number> ::= 0 | <non-zero-number>

此定義和<identifier>定義都是左遞歸的,因為它們描述的字符串的最左邊字符是特殊的(因為其可能的值是有限的)。 如果我們試圖描述一組最后(最右邊)個字符受限制的字符串,則可能會使用右遞歸。

由於我們是從左到右閱讀的,因此,最左邊的元素是特殊的語法比最右邊的元素是特殊的語法要多得多。 (並且解析算法(從左到右也起作用)傾向於針對這種常見情況進行優化。)

(我完全意識到,並非所有人都從左到右閱讀。我們中的許多人從右到左閱讀,我無意暗示一個或另一個更好。在文化上講中立關於閱讀或解析“從頭到尾”,並區分“領先遞歸”和“尾隨遞歸”。的確,在與語言關系不大的不同CS上下文中,通常談論“尾遞歸” ;即在函數的最后進行遞歸。但是負責現代解析理論的數學家正在用英語寫作,並且從左到右的偏見逐漸滲透到術語中。)

由於左遞歸和右遞歸都同樣擅長描述字符位置沒有區別的字符串集,因此,正如您所問的那樣,我們可以使用任一種來描述數字。 我們甚至可以使用右遞歸語法來描述左區別字符串,方法是分離出第一個位置,然后再粘貼回去:

<suffix> ::=  <empty> | <letter> <suffix> | <digit> <suffix>
<identifier> ::= <letter> <suffix>

但這感覺不自然,因為標識符實際上只是一件事。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM