什么是终结符和非终结符?

What are terminal and nonterminal symbols?

我正在阅读 Rebol Wikipedia page

"Parse expressions are written in the parse dialect, which, like the do dialect, is an expression-oriented sublanguage of the data exchange dialect. Unlike the do dialect, the parse dialect uses keywords representing operators and the most important nonterminals"

你能解释一下什么是终端非终端吗?我读了很多关于语法的书,但不明白它们的意思。这是另一个 link 经常使用这个词的地方。

终结符和非终结符的定义不是特定于 Parse 的,而是与一般语法有关。 this wiki page or intro in Grune's book explain them quite well. OTOH, if you're interested in how Red Parse works and yearn for simple examples and guidance, I suggest to drop by our dedicated chat room.

之类的东西

"parsing"的含义略有不同,但我更喜欢的是通过形式化的配方(语法)将线性结构(广义上的符号串)转换为层次结构(推导树) ,或者检查给定字符串是否具有语法指定的树状结构(即 "string" 是否属于 "language")。

字符串中的所有符号都是终结符,从某种意义上说,树派生 "terminates" 在它们上面(即它们是树中的叶子)。反过来,非终结符是语法规则中使用的一种抽象形式 - 它们将终结符和非终结符组合在一起(即它们是树中的节点)。

例如,在下面的 Parse 语法中:

greeting: ['hi | 'hello | 'howdy]
person:   [name surname]
name:     ['john | 'jane]
surname:  ['doe | 'smith]
sentence: [greeting person] 
  • greetingpersonnamesurnamesentence 是非终结符(因为它们从未实际出现在线性输入序列中,仅在语法规则中);
  • hihellohowdyjohnjanedoesmith 是终端(因为解析器不能像处理非终端那样将它们 "expand" 分成一组终端和非终端,因此它 "terminates" 到达底部)。
>> parse [hi jane doe] sentence
== true
>> parse [howdy john smith] sentence
== true
>> parse [wazzup bubba ?] sentence
== false

如你所见,终端和非终端是不相交的集合,即一个符号可以在其中一个中,但不能在两个中;此外,在语法规则中,非终结符只能写在左侧。

一个文法可以匹配不同的字符串,一个字符串可以被不同的文法匹配(在上面的例子中,可以是[greeting name surname],也可以是[exclamation 2 noun],甚至可以是[some noun] ,前提是定义了 exclamationnoun 非终结符)。

和往常一样,一张图片抵得上一千个字:

希望对您有所帮助。

这样想

一个数字可以是1-9

现在我告诉你在一页纸上写一个数字。

所以你知道你可以写下 1,2,3,4,5,6,7,8,9

基本上非终结符号是“数字”

终端符号是1,2,3,4,5,6,7,8,9

当我告诉你在一页上写下一个数字时,你写下了 1 或 2 或 3 或 4 或 5 或 6 或 7 或 8 或 9

你没有写下“数字”这个词你写下了 1 或 2 或 3....

你看到我要去哪里了吗?

让我们尝试制定自己的“规则”

让我们“创建”一个非终结符,我们将其称为“Olaf”

Olaf 可以是一只狗(注意:狗是 终端

Olaf 可以是一只猫(注意:猫是 终端

Olaf 可以是数字(注意:数字是 非终结符

现在我告诉你,你可以在一页纸上写下一个奥拉夫。

所以这意味着你可以写下“狗”

你也可以写下“猫”

你也可以写下一个数字,这意味着你可以写下 1 或 2 或 3...

因为数字是非终结符号你不写下“数字”你写下 数字所指的符号是 1 或 2 或 3 等...

最后只有终端符号写在“页面”上

我还要说的一件事是你有一天可能会遇到的事情,基本上当你说“非终端 可以是某事”时。

有一个专门的术语,基本上称为“生产规则”(也可以称为“生产” )

例如

Olaf 可以是“狗”

Olaf 可以是“猫”

奥拉夫可以是数字

我们在这里得到了 3 个作品,换句话说,我们在这里得到了 Olaf 的 3 个定义

编程语言规范在定义语言语法时大量使用了这些想法