什么是终端符号和非终端符号?

Dmi*_*kov 2 grammar rebol context-free-grammar red

我正在阅读Rebol Wikipedia页面

“解析表达式是用解析方言编写的,与do方言一样,它是数据交换方言的面向表达式的子语言。与do方言不同,解析方言使用表示运算符和最重要的非终结符的关键字”

你能解释一下什么是terminalsnonterminals?我已经阅读了很多有关语法的内容,但不了解它们的含义。这是另一个经常使用此词的链接

921*_*214 8

终端符号和非终端符号的定义不是特定于语法分析的,而是通常与语法有关。喜欢的东西这个 wiki页面或介绍在Grune的书解释起来相当不错。OTOH,如果您对Red Parse的工作方式感兴趣,并渴望获得简单的示例和指导,我建议您去我们专用的聊天室


“解析”的含义略有不同,但是我更喜欢的是通过正式的配方(语法)将线性结构(广义上的符号字符串)转换为层次结构(派生树),或者检查给定的字符串具有由语法指定的树状结构(即,如果“字符串”属于“语言”)。

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

例如,在下面的语法分析中:

greeting: ['hi | 'hello | 'howdy]
person:   [name surname]
name:     ['john | 'jane]
surname:  ['doe | 'smith]
sentence: [greeting person] 
Run Code Online (Sandbox Code Playgroud)
  • greetingpersonnamesurnamesentence是非端子(因为它们实际上从未出现在线性输入序列,仅在语法规则);
  • hihellohowdyjohnjanedoesmith是端子(因为分析器不能“扩展”到他们一组终端,当它与非端子确实非端子,因此它“终止”通过到达底部)。
>> parse [hi jane doe] sentence
== true
>> parse [howdy john smith] sentence
== true
>> parse [wazzup bubba ?] sentence
== false
Run Code Online (Sandbox Code Playgroud)

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

一个语法可以匹配不同的字符串,而一个字符串可以被不同的语法匹配(在上面的示例中,只要定义了和非终结符,它可以是[greeting name surname],或[exclamation 2 noun],甚至是)。[some noun]exclamationnoun

而且,像往常一样,一张图片值得一千个字:

解析树示例

希望能有所帮助。


Ang*_*ohn 7

这样想

数字可以是 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 可以是数字(注意:数字是非终结符

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

这意味着你可以写下“dog”

你也可以写“猫”

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

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

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

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

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

例如

奥拉夫可以是“狗”

奥拉夫可以是“猫”

奥拉夫可以是数字

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

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