在 C 编程语言的上下文中什么是产生式?
What is a production in the context of the C Programming language?
在 Kernighan 和 Ritchie 编写的 The C Programming Language 第二版的附录 A 中,提到了生产这个词:
This manual describes the C language specified by the draft submitted
to ANSI on 31 October, 1988, for approval as ``American Standard for
Information Systems - programming Language C, X3.159-1989.'' The
manual is an interpretation of the proposed standard, not the standard
itself, although care has been taken to make it a reliable guide to
the language. For the most part, this document follows the broad
outline of the standard, which in turn follows that of the first
edition of this book, although the organization differs in detail.
Except for renaming a few productions, and not formalizing the
definitions of the lexical tokens or the preprocessor, the grammar
given here for the language proper is equivalent to that of the
standard.
不过我似乎无法理解它的实际含义。我的猜测是它指的是语法部分中某个键的值:
translation-unit:
external-declaration translation-unit
external-declaration
A 13 部分的以下文章应该暗示了作者的意思,但我似乎无法自己弄清楚,因为我错过了一些基本术语:
The grammar has undefined terminal symbols integer-constant,
character-constant, floating- constant, identifier, string, and
enumeration-constant; the typewriter style words and symbols are
terminals given literally. This grammar can be transformed
mechanically into input acceptable for an automatic parser-generator.
Besides adding whatever syntactic marking is used to indicate
alternatives in productions, it is necessary to expand the ``one of''
constructions, and (depending on the rules of the parser-generator) to
duplicate each production with an opt symbol, once with the symbol and
once without. With one further change, namely deleting the production
typedef-name: identifier and making typedef-name a terminal symbol,
this grammar is acceptable to the YACC parser-generator. It has only
one conflict, generated by the if-else ambiguity.
我也不知道胆大包天的words/sentences是什么意思。有人可以给我一些见解吗?
“符号”是语法的一个元素。
例如在您引用的部分中:
translation-unit:
external-declaration translation-unit external-declaration
四个都是符号。
一个“产生式”解释了符号的组成。你的引述是一个单一的作品,它指出 translation-unit 按顺序由三件事组成:external-declaration,然后 translation-unit,然后external-declaration.
“终端”符号是其定义中没有任何其他符号的符号。
例如你的 translation-unit
不是终端,但这个是:
digit: one of
0
1
2
3
4
5
6
7
8
9
如果单个数字是终结符,或者整个 “数字” 是终结符,则没有实际意义;可能是前者。
这些也是“按字面给出”,这意味着数字实际上是按标准拼写的。
这是一个没有按字面意思给出的终端:
basic-c-char:
any member of the translation character set except the U+0027 apostrophe, U+005c reverse solidus, or new-line character
请注意他们没有拼写每个可能的字符,因为它们太多了,而是提供了纯文本描述。
“未定义”终端只是一个不是 explained/defined 的终端,这使得语法在技术上不完整。如果他们调用 "integer-constant" 一个未定义的终端,这意味着他们的语法不包括 integer-constant: blah blah
.
to duplicate each production with an opt symbol, once with the symbol and once without
考虑:
foo:
x
opt y
此处 foo 是 x
或 x y
。
他们建议用另一种方式拼写相同的东西,而不使用“opt”:
foo:
y
x
y
It has only one conflict, generated by the if-else ambiguity.
解析程序是通过从单个符号开始,然后找出哪些产品将其转换为您要解析的文本来完成的。
如果有不止一个产生式序列,则语法是“不明确的”。
在计算机科学中,形式语法是使用产生式规则来描述的。例如,以下形式的规则:
P → xyz
表示符号 P 可以用符号 xyz 替换,规则形式为
Q → aP | bP
表示符号Q可以替换为符号a和符号P或符号b和符号P.
形式语法指定一个开始符号,例如Q,并说明哪些符号是非终结符号(占位符不出现在最终字符串中),哪些是终结符号(可能出现在最后的字符串中)。如果 Q 是具有上述两个规则的文法的起始符号,那么这些规则描述了一个包含两个字符串 axyz 和 bxyz 的文法,因为它们是仅有的两个可以被按照这些规则制定的。语法可以产生的字符串集称为它的语言。
λ常用的意思是空字符串,没有符号。
这个文法有非终结符S,终结符a和b,起始符S:
S → aSbb | λ
可以通过将S替换为空字符串来生成空字符串,或者可以通过将S替换为a[=来生成abb 66=]Sbb 然后是新的 S 和空字符串,或者它可以通过用 a 替换 S 来生成 aabbbb Sbb 然后用 aSbb 替换新的 S,得到 aa Sbbbb,然后用空字符串替换 S,生成 aabbbb。我们可以看到这个语法的语言是所有字符串的集合,其中包含一定数量的 a 字符(可能为零)后跟两倍的 b 字符。
C 标准使用形式语法定义 C 语言(在英语中有一些限定和修改)。例如,它包含这个产生式(它使用“:”而不是我上面使用的“→”,并使用单独的行而不是“|”来表示选择):
statement:
labeled-statement
compound-statement
expression-statement
selection-statement
iteration-statement
jump-statement
关于您用粗体标记的其他术语:
undefined terminal symbols integer-constant,…
The C Programming Language中给出的 C 文法似乎是部分文法,留下 integer-constant 未定义符号,因此充当终端符号。在ANSI C 1990官方标准中,是ANSI C 1990官方标准中定义的non-terminal
… the typewriter style words and symbols are terminals given literally.
这在原文中更清楚,其中使用的字体表明“打字机”样式是 fixed-width 字体:
… the typewriter
style words and symbols are terminals given literally.
这及其前面的文本意味着,在语法中,斜体字,如 declaration,是语法的 non-terminal 符号,“成为某种东西” else” 由语法产生,而“打字机”字体中的单词,如 typedef
,是终端符号,它们是名称中文字字符的符号;语法中的typedef
表示源代码中的字符t、y、p、e、d、e、f。
…to duplicate each production with an opt symbol, once with the symbol and once without…
标准使用下标“opt”,像这样:
P: Q Ropt
表示R是可选的。形式上,这实际上是两条规则:
P → Q R
P → Q
意味着有一条规则将 P 替换为 Q R 和一条规则将 P 替换为 Q,两者都可以使用。因此,R 是可选的。使用“opt”下标只是编写规则的一种不同方式。
… this grammar is acceptable to the YACC parser-generator. It has only one conflict, generated by the if-else ambiguity.
在计算机科学理论中,解析器是检查字符串是否属于某种语言的软件。 (在实践中,它经常同时做其他有用的事情,比如通过将字符串的一部分解释为数字、将一部分解释为变量等来为字符串分配“含义”。)YACC 是一种读取语法规范的软件并为语法描述的语言的解析器生成源代码。
YACC 生成的解析器类型需要决定在读取每个标记时将应用哪个产生式。当语法不足以确定应用哪个产生式时,就会发生冲突。在 C 形式语法中,if (x) if (y) S1 else S2
可以通过两种方式产生,一种是将 else S2
与第一个 if
相关联,一种是将 else S2
与第二个 if
相关联].这必须通过向语法中添加信息来解决; YACC 被告知将 else S2
与当前没有 else
.
的最新 if
相关联
在 Kernighan 和 Ritchie 编写的 The C Programming Language 第二版的附录 A 中,提到了生产这个词:
This manual describes the C language specified by the draft submitted to ANSI on 31 October, 1988, for approval as ``American Standard for Information Systems - programming Language C, X3.159-1989.'' The manual is an interpretation of the proposed standard, not the standard itself, although care has been taken to make it a reliable guide to the language. For the most part, this document follows the broad outline of the standard, which in turn follows that of the first edition of this book, although the organization differs in detail. Except for renaming a few productions, and not formalizing the definitions of the lexical tokens or the preprocessor, the grammar given here for the language proper is equivalent to that of the standard.
不过我似乎无法理解它的实际含义。我的猜测是它指的是语法部分中某个键的值:
translation-unit: external-declaration translation-unit external-declaration
A 13 部分的以下文章应该暗示了作者的意思,但我似乎无法自己弄清楚,因为我错过了一些基本术语:
The grammar has undefined terminal symbols integer-constant, character-constant, floating- constant, identifier, string, and enumeration-constant; the typewriter style words and symbols are terminals given literally. This grammar can be transformed mechanically into input acceptable for an automatic parser-generator. Besides adding whatever syntactic marking is used to indicate alternatives in productions, it is necessary to expand the ``one of'' constructions, and (depending on the rules of the parser-generator) to duplicate each production with an opt symbol, once with the symbol and once without. With one further change, namely deleting the production typedef-name: identifier and making typedef-name a terminal symbol, this grammar is acceptable to the YACC parser-generator. It has only one conflict, generated by the if-else ambiguity.
我也不知道胆大包天的words/sentences是什么意思。有人可以给我一些见解吗?
“符号”是语法的一个元素。
例如在您引用的部分中:
translation-unit:
external-declaration translation-unit external-declaration
四个都是符号。
一个“产生式”解释了符号的组成。你的引述是一个单一的作品,它指出 translation-unit 按顺序由三件事组成:external-declaration,然后 translation-unit,然后external-declaration.
“终端”符号是其定义中没有任何其他符号的符号。
例如你的 translation-unit
不是终端,但这个是:
digit: one of
0
1
2
3
4
5
6
7
8
9
如果单个数字是终结符,或者整个 “数字” 是终结符,则没有实际意义;可能是前者。
这些也是“按字面给出”,这意味着数字实际上是按标准拼写的。
这是一个没有按字面意思给出的终端:
basic-c-char:
any member of the translation character set except the U+0027 apostrophe, U+005c reverse solidus, or new-line character
请注意他们没有拼写每个可能的字符,因为它们太多了,而是提供了纯文本描述。
“未定义”终端只是一个不是 explained/defined 的终端,这使得语法在技术上不完整。如果他们调用 "integer-constant" 一个未定义的终端,这意味着他们的语法不包括 integer-constant: blah blah
.
to duplicate each production with an opt symbol, once with the symbol and once without
考虑:
foo:
x
opty
此处 foo 是 x
或 x y
。
他们建议用另一种方式拼写相同的东西,而不使用“opt”:
foo:
y
x
y
It has only one conflict, generated by the if-else ambiguity.
解析程序是通过从单个符号开始,然后找出哪些产品将其转换为您要解析的文本来完成的。
如果有不止一个产生式序列,则语法是“不明确的”。
在计算机科学中,形式语法是使用产生式规则来描述的。例如,以下形式的规则:
P → xyz
表示符号 P 可以用符号 xyz 替换,规则形式为
Q → aP | bP
表示符号Q可以替换为符号a和符号P或符号b和符号P.
形式语法指定一个开始符号,例如Q,并说明哪些符号是非终结符号(占位符不出现在最终字符串中),哪些是终结符号(可能出现在最后的字符串中)。如果 Q 是具有上述两个规则的文法的起始符号,那么这些规则描述了一个包含两个字符串 axyz 和 bxyz 的文法,因为它们是仅有的两个可以被按照这些规则制定的。语法可以产生的字符串集称为它的语言。
λ常用的意思是空字符串,没有符号。
这个文法有非终结符S,终结符a和b,起始符S:
S → aSbb | λ
可以通过将S替换为空字符串来生成空字符串,或者可以通过将S替换为a[=来生成abb 66=]Sbb 然后是新的 S 和空字符串,或者它可以通过用 a 替换 S 来生成 aabbbb Sbb 然后用 aSbb 替换新的 S,得到 aa Sbbbb,然后用空字符串替换 S,生成 aabbbb。我们可以看到这个语法的语言是所有字符串的集合,其中包含一定数量的 a 字符(可能为零)后跟两倍的 b 字符。
C 标准使用形式语法定义 C 语言(在英语中有一些限定和修改)。例如,它包含这个产生式(它使用“:”而不是我上面使用的“→”,并使用单独的行而不是“|”来表示选择):
statement:
labeled-statement
compound-statement
expression-statement
selection-statement
iteration-statement
jump-statement
关于您用粗体标记的其他术语:
undefined terminal symbols integer-constant,…
The C Programming Language中给出的 C 文法似乎是部分文法,留下 integer-constant 未定义符号,因此充当终端符号。在ANSI C 1990官方标准中,是ANSI C 1990官方标准中定义的non-terminal
… the typewriter style words and symbols are terminals given literally.
这在原文中更清楚,其中使用的字体表明“打字机”样式是 fixed-width 字体:
… the
typewriter
style words and symbols are terminals given literally.
这及其前面的文本意味着,在语法中,斜体字,如 declaration,是语法的 non-terminal 符号,“成为某种东西” else” 由语法产生,而“打字机”字体中的单词,如 typedef
,是终端符号,它们是名称中文字字符的符号;语法中的typedef
表示源代码中的字符t、y、p、e、d、e、f。
…to duplicate each production with an opt symbol, once with the symbol and once without…
标准使用下标“opt”,像这样:
P: Q Ropt
表示R是可选的。形式上,这实际上是两条规则:
P → Q R
P → Q
意味着有一条规则将 P 替换为 Q R 和一条规则将 P 替换为 Q,两者都可以使用。因此,R 是可选的。使用“opt”下标只是编写规则的一种不同方式。
… this grammar is acceptable to the YACC parser-generator. It has only one conflict, generated by the if-else ambiguity.
在计算机科学理论中,解析器是检查字符串是否属于某种语言的软件。 (在实践中,它经常同时做其他有用的事情,比如通过将字符串的一部分解释为数字、将一部分解释为变量等来为字符串分配“含义”。)YACC 是一种读取语法规范的软件并为语法描述的语言的解析器生成源代码。
YACC 生成的解析器类型需要决定在读取每个标记时将应用哪个产生式。当语法不足以确定应用哪个产生式时,就会发生冲突。在 C 形式语法中,if (x) if (y) S1 else S2
可以通过两种方式产生,一种是将 else S2
与第一个 if
相关联,一种是将 else S2
与第二个 if
相关联].这必须通过向语法中添加信息来解决; YACC 被告知将 else S2
与当前没有 else
.
if
相关联