如何遵循C++;手工计算器的语法? 我用Bjarne Stroustrup来跟踪C++,PPP的介绍语法有困难(PG189—192)如下: // a simple expression grammar Expression: Term Expression "+" Term // addition Expression "-" Term // subtraction Term: Primary Term "*" Primary // multiplication Term "/" Primary // division Term "%" Primary // remainder (modulo) Primary: Number "(" Expression ")" Number: floating-point-literal

如何遵循C++;手工计算器的语法? 我用Bjarne Stroustrup来跟踪C++,PPP的介绍语法有困难(PG189—192)如下: // a simple expression grammar Expression: Term Expression "+" Term // addition Expression "-" Term // subtraction Term: Primary Term "*" Primary // multiplication Term "/" Primary // division Term "%" Primary // remainder (modulo) Primary: Number "(" Expression ")" Number: floating-point-literal,c++,C++,首先我们解析2,它是一个浮点文本,它是一个主要的数字,它是一个术语,它是一个表达式 然后我们去解析2+3: 2是一个浮点文字,它是一个数字,它是一个主要的数字,它是一个术语,它是一个表达式 直接跳到表达式(这是我开始迷路的地方) 3是一个浮点字面值,它是一个数字,它是一个主要的术语。为什么这本书在这里停止解析,“3”目前符合作为表达式的所有条件 当我尝试手动执行此操作时,只有在忽略“+”并将3解析为与需求表达式“+”匹配的术语时,我才能得出与给定图表匹配的结论 此外,如果我尝试进一步外推解析

首先我们解析2,它是一个浮点文本,它是一个主要的数字,它是一个术语,它是一个表达式

然后我们去解析2+3:

2是一个浮点文字,它是一个数字,它是一个主要的数字,它是一个术语,它是一个表达式

  • 直接跳到表达式(这是我开始迷路的地方)
3是一个浮点字面值,它是一个数字,它是一个主要的术语。为什么这本书在这里停止解析,“3”目前符合作为表达式的所有条件

当我尝试手动执行此操作时,只有在忽略“+”并将3解析为与需求表达式“+”匹配的术语时,我才能得出与给定图表匹配的结论


此外,如果我尝试进一步外推解析9+3*2,而不考虑a*,我无法完成语法的工作,因为9+3(显然)是一个有效的表达式,没有语法可以相乘…

你是对的,3将是一个表达式,但是“表达式+表达式”没有意义。看到“+”标记,我们只有一个选项来解释它左边和右边的内容:

表达式“+”项

所以我们一直推广2和3,直到最左边变成表达式,最右边变成术语

右边的图表可以说有些混乱。你最好从头到尾阅读,而不是相反。然后,您可以对其进行以下理解:

  • 我们试图解析一个表达式,这是起点
  • 我们发现一个候选者的形式是“表达式”+“术语”
  • 左边的表达式(三个选项中)是什么?这是一个术语。那是什么术语?这是初选。(同样,不是“术语”*“主要”或任何其他选项。)主要是什么?这是一个数字。什么号码?浮点文本2
  • 在中间的+符号不需要进一步的研究,它符合它的模式。
  • “表达式”+“术语”右边的术语是什么?按照第2条继续

  • 我想你现在面临的主要问题与你从头到尾阅读的事实有关。书中的箭头表示信息流,但不是解析顺序

    以下是我们感兴趣的语法(供参考):

    下面的段落试图在这种语法的情况下以及在更一般的设置中概述解析过程

    解析表达式:一个简单的例子 上面的语法给出了解析
    表达式所需的规则<代码>表达式
    被认为是语法的公理。这意味着为了解析任何给定的表达式,我们必须从
    表达式
    规则开始

    让我们考虑表达式<代码> 2 + 3 < /代码>。解析过程如下所示:

    // a simple expression grammar
    Expression:
        Term
        Expression "+" Term // addition
        Expression "-" Term // subtraction
    
    Term:
        Primary
        Term "*" Primary // multiplication
        Term "/" Primary // division
        Term "%" Primary // remainder (modulo)
    
    Primary:
        Number
        "(" Expression ")"
    
    Number:
        floating-point-literal
    
  • 我们将
    2+3
    表达式的规则相匹配。它必须是
    术语
    ,形式为
    表达式“+”术语
    的表达式或形式为
    表达式“-”术语
    的表达式。原来它是一个
    表达式“+”术语
  • 我们将
    2+3
    的左侧与
    表达式匹配。
    
    • 2
      的唯一可能规则是
      Term
    • 然后,我们将
      2
      术语的规则进行匹配<代码>2不包含
      “*”
      ,也不包含
      “/”
      ,也不包含
      “%”
      。因此,它必须是一个
    • 我们继续执行
      Primary
      的规则。由于它不包含任何括号,
      2
      必须是一个
      数字
    • 最后,我们知道
      2
      是一个
      浮点文本
  • 我们将
    2+3
    的右侧与
    术语匹配。
    
    • 对于
      2
      3
      必须是
      主要的
    • 同样,按照与上面相同的路径,
      3
      被推断为一个
      数字
      ,然后是一个
      浮点文本
  • 最后,
    2+3
    是一个形式为
    浮点文本“+”浮点文本的表达式

    解析表达式:复杂表达式 现在我们知道了如何解析一个简单的表达式。但是一个更复杂的,比如
    (2-1)+9*3
    ?上述技术也适用于这种情况。以下是解析过程的展开版本:

  • (2-1)+9*3
    的形式为
    表达式“+”术语
  • 我们将左侧与
    表达式的规则相匹配。
    
    • (2-1)
      是一个
      术语
      (因为它不包含
      “+”
      “-”
    • 类似地,
      (2-1)
      是一个
      主要的
    • (2-1)
      的形式为
      “(“表达式”)”
      。通过使用与
      2+3
      完全相同的过程,我们最终得到了
      “(“浮点文字”-“浮点文字”)”
  • 我们将右侧与
    术语的规则相匹配。
    
    • 9*3
      的形式为
      术语“*”Primary
    • 我们将
      9
      Term
      的规则进行匹配,直到得到一个
      浮点文本
    • 我们将
      3
      Primary
      的规则进行匹配,并在经过一些细化后得到一个
      浮点文本
    • 最后,
      9*3
      是一个
      术语
      ,其形式为
      浮点文本“*”浮点文本