Dmi*_*kov 2 grammar rebol context-free-grammar red
我正在阅读Rebol Wikipedia页面。
“解析表达式是用解析方言编写的,与do方言一样,它是数据交换方言的面向表达式的子语言。与do方言不同,解析方言使用表示运算符和最重要的非终结符的关键字”
你能解释一下什么是terminals
和nonterminals
?我已经阅读了很多有关语法的内容,但不了解它们的含义。这是另一个经常使用此词的链接。
终端符号和非终端符号的定义不是特定于语法分析的,而是通常与语法有关。喜欢的东西这个 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)
greeting
,person
,name
,surname
和sentence
是非端子(因为它们实际上从未出现在线性输入序列,仅在语法规则);hi
,hello
,howdy
与john
,jane
,doe
和smith
是端子(因为分析器不能“扩展”到他们一组终端,当它与非端子确实非端子,因此它“终止”通过到达底部)。>> 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]
exclamation
noun
而且,像往常一样,一张图片值得一千个字:
希望能有所帮助。
这样想
数字可以是 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 个定义
编程语言规范在定义语言语法时大量使用这些想法