【问题标题】:What are terminal and nonterminal symbols?什么是终结符号和非终结符号?
【发布时间】:2019-09-12 14:13:42
【问题描述】:

我正在阅读 Rebol Wikipedia page

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

你能解释一下什么是终端非终端吗?我已经阅读了很多有关语法的内容,但不明白它们的含义。这是另一个link,这个词经常使用。

【问题讨论】:

    标签: grammar context-free-grammar rebol red


    【解决方案1】:

    终结符号和非终结符号的定义不是特定于 Parse 的,但通常与语法有关。诸如this wiki 页面或Grune's book 中的介绍之类的东西很好地解释了它们。 OTOH,如果您对 Red Parse 的工作原理感兴趣并渴望获得简单的示例和指导,我建议您访问我们的专用 chat room


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

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

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

    greeting: ['hi | 'hello | 'howdy]
    person:   [name surname]
    name:     ['john | 'jane]
    surname:  ['doe | 'smith]
    sentence: [greeting person] 
    
    • greetingpersonnamesurnamesentence 是非终结符(因为它们实际上从未出现在线性输入序列中,仅出现在语法规则中);
    • hihellohowdyjohnjanedoesmith 是终端(因为解析器无法将它们“扩展”为一组终端和非终端,因为它与非终端,因此它通过到达底部“终止”)。
    >> 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],前提是exclamation和@ 987654345@ 定义了非终结符)。

    而且,像往常一样,一张图片胜过一千字:

    希望对您有所帮助。

    【讨论】:

    • 算术表达式中的 +,-,*,/,(,) 符号是终结符还是非终结符?从 AST 的角度来看,它们不是叶子,但它们确实出现在表达式输入中。
    • @KonstantinZyubin 抽象语法树与解析器派生的具体语法树不同。在 AST 中,算术运算符通常是根据优先规则将操作数和其他运算符组合在一起的节点,而在 CST 中,它们将作为输入中的标记留下。查看示例here
    • 它们是语法中的叶子。你会有一个像expr :: expr '+' expr | expr '-' expr 这样的规则。解析3 + 3,您将需要另一个定义expr 的规则来决定如何处理3s,而此规则本身足以识别+;不需要额外的规则。
    【解决方案2】:

    这样想

    一个数字可以是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等......

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

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

    对此有一个特殊的术语,基本上称为“生产规则”(也可以称为“生产”)

    例如

    奥拉夫可以是“狗”

    奥拉夫可以是“猫”

    奥拉夫可以是数字

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

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

    【讨论】:

      猜你喜欢
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 2011-08-22
      • 2012-06-20
      • 1970-01-01
      • 1970-01-01
      • 2021-02-13
      • 1970-01-01
      相关资源
      最近更新 更多