如何遵循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
首先我们解析2,它是一个浮点文本,它是一个主要的数字,它是一个术语,它是一个表达式 然后我们去解析2+3: 2是一个浮点文字,它是一个数字,它是一个主要的数字,它是一个术语,它是一个表达式如何遵循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解析为与需求表达式“+”匹配的术语时,我才能得出与给定图表匹配的结论 此外,如果我尝试进一步外推解析
- 直接跳到表达式(这是我开始迷路的地方)
此外,如果我尝试进一步外推解析9+3*2,而不考虑a*,我无法完成语法的工作,因为9+3(显然)是一个有效的表达式,没有语法可以相乘…你是对的,3将是一个表达式,但是“表达式+表达式”没有意义。看到“+”标记,我们只有一个选项来解释它左边和右边的内容: 表达式“+”项 所以我们一直推广2和3,直到最左边变成表达式,最右边变成术语 右边的图表可以说有些混乱。你最好从头到尾阅读,而不是相反。然后,您可以对其进行以下理解:
我想你现在面临的主要问题与你从头到尾阅读的事实有关。书中的箭头表示信息流,但不是解析顺序 以下是我们感兴趣的语法(供参考): 下面的段落试图在这种语法的情况下以及在更一般的设置中概述解析过程 解析表达式:一个简单的例子 上面的语法给出了解析
表达式所需的规则<代码>表达式
被认为是语法的公理。这意味着为了解析任何给定的表达式,我们必须从表达式
规则开始
让我们考虑表达式<代码> 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
是一个术语
,其形式为浮点文本“*”浮点文本