在手冊的參考部分提到了生產這個詞:
本手冊描述了由 1988 年 10 月 31 日提交給 ANSI 的草案指定的 C 語言,該草案被批準為“美國資訊系統標準 - 編程語言 C,X3.159-1989”。該手冊是對提議的解釋標準,而不是標準本身,盡管已經注意使其成為該語言的可靠指南。在大多數情況下,本檔案遵循標準的大致輪廓,而后者又遵循本書第一版的大致輪廓,盡管組織結構在細節上有所不同。除了重命名一些產生式,并且沒有形式化詞法標記或前處理器的定義外,這里給出的語言本身的語法與標準的語法是等價的。
但是,我似乎無法弄清楚它的實際含義。我的猜測是它指的是語法部分中鍵的值:
翻譯單元:外部宣告翻譯單元外部宣告
以下文章應該暗示作者的意思,但我似乎無法自己弄清楚,因為我錯過了一些基本術語:
該文法具有未定義的終結符號整數常量、字符常量、浮點常量、識別符號、字串和列舉常量;打字機風格的單詞和符號是 字面上給出的終端。該語法可以機械地轉換為自動決議器生成器可接受的輸入。除了添加用于指示產生式中的替代的任何句法標記外,有必要擴展“one of”結構,并且(取決于決議器生成器的規則)使用 opt 符號復制每個產生式,一次使用符號和一次沒有。通過進一步的更改,即洗掉產生式 typedef-name: identifier 并使 typedef-name 成為終端符號,該語法對于 YACC 決議器生成器是可以接受的。它只有一個沖突,由 if-else 歧義產生。
我也不知道那些大膽的詞/句子是什么意思。有人可以給我一個見解嗎?
uj5u.com熱心網友回復:
在計算機科學中,形式語法是使用產生式規則來描述的。例如,以下形式的規則:
P → xyz
表示符號P可以被符號 xyz 替換,并且形式的規則
Q → 一個P | 乙_
表示符號Q可以由符號 a 和符號P或由符號 b 和符號P代替。
形式語法指定一個開始符號,例如Q,并說明哪些符號是非終結符號(未出現在最終字串中的占位符),哪些是終結符號(可能出現在最終字串中)。如果Q是具有上述兩個規則的文法的開始符號,那么這些規則描述了一個包含兩個字串 axyz 和 bxyz 的文法,因為它們是唯一可以使用這些規則生成的兩個字串。語法可以產生的字串集合稱為它的語言。
λ 常用來表示一個空字串,一個沒有符號的字串。
該文法具有非終結符號S、終結符號 a 和 b 以及起始符號S:
S → a S bb | λ
可以通過將S替換為空字串來生成空字串,或者可以通過將S替換為S bb 然后將新的S替換為空字串來生成 abb,或者可以通過將S替換為S bb 然后替換來生成 aabbbb新的S帶有一個S bb,產生 aa S bbbb,然后用空字串替換S ,產生 aabbbb。我們可以看到這個語法的語言是所有字串的集合,其中包含一定數量的 a 字符(可能為零),后跟兩倍的 b 字符。
C 標準使用形式語法定義 C 語言(有一些限定和英語修改)。例如,它包含這個產生式(它使用“:”而不是我上面使用的“→”,并使用單獨的行而不是“|”來表示選擇):
陳述句:
標記陳述句
復合陳述句
運算式陳述句
選擇陳述句
迭代陳述句
跳轉陳述句
關于您以粗體標記的其他術語:
未定義的終端符號整數常量,…
整數常量符號是官方 ANSI C 1990 標準中定義的非終結符。將其稱為未定義的終端符號表明它未在提交的草案中定義。我沒有要檢查的草稿副本。
字面上給出的終端
我不確定這意味著什么。終端符號通常是字面的;據說產生 e 的產生式實際上產生了字符“e”,除了我們經常使用“λ”來表示空字串。
使用 opt 符號復制每個產品,一次使用該符號,一次不使用
該標準使用下標“opt”,如下所示:
P : Q R選擇
表示R是可選的。形式上,這實際上是兩條規則:
P → Q R
P → Q
意思是有一條規則用Q R代替P和一條用 Q 代替 P 的規則,兩者都可以使用。因此,R是可選的。使用“opt”下標只是撰寫規則的另一種方式。
… 這個語法對于 YACC 決議器生成器是可以接受的。它只有一個沖突,由 if-else 歧義產生。
在計算機科學理論中,決議器是檢查字串是否屬于某種語言的軟體。(在實踐中,它經常同時做其他有用的事情,比如通過將字串的一部分解釋為數字、部分解釋為變數等來為字串分配“含義”。) YACC 是讀取語法規范的軟體并為語法描述的語言的決議器生成源代碼。
當一個字串可以由語法以兩種不同的方式產生時,就會發生沖突。在 C 形式文法中,if (x) if (y) S1 else S2可以通過兩種方式產生,一種else S2與第if一種關聯,另一種else S2與第二種關聯if。這必須通過在語法中添加資訊來解決;YACC 被告知將else S2與if當前沒有else.
uj5u.com熱心網友回復:
“符號”是語法的一個元素。
例如在你參考的部分:
翻譯單元:
外部宣告翻譯單元外部宣告
這四個都是象征。
“產品”解釋了符號的組成。您的報價是一個單一的產品,它指出一個翻譯單元按順序由三件事組成:external-declaration,然后是 translation-unit,然后是 external-declaration。
“終端”符號是在其定義中沒有任何其他符號的符號。
例如,您translation-unit的不是終端,但這個是:
數字:其中之一
0123456789
如果單個數字是終端,或者整個“數字”是終端,那就沒有實際意義了;可能是前者。
這些也是“字面上給出的”,這意味著數字實際上是在標準中拼寫的。
這是一個沒有按字面意思給出的終端:
basic-c-char:
翻譯字符集的任何成員,除了 U 0027 撇號、U 005c 反斜線或換行符
注意他們沒有拼出所有可能的字符,因為它們太多了,而是提供了純文本描述。
“未定義”終端只是未解釋/定義的終端,使得語法在技術上不完整。如果他們將“整數常量”稱為未定義終端,則意味著他們的語法無法包含integer-constant: blah blah.
使用 opt 符號復制每個產品,一次使用該符號,一次不使用
考慮:
富:
x選擇y
這里foo是xor x y。
他們建議用另一種方法來拼寫相同的東西,而不使用“opt”:
富:
y
xy
它只有一個沖突,由 if-else 歧義產生。
決議程式是通過從單個符號開始,并找出哪些產生式將其轉換為您要決議的文本來完成的。
如果有不止一個生產序列可以做到這一點,則語法是“模棱兩可的”。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/484538.html
上一篇:volatile這一篇就夠了
