从加减法开始的编译原理

584 阅读1分钟

前言

加减法我们都学过,但这和编译原理又有什么关系呢?本文就从加减法开始,为你阐述编译原理的最基本操作:语法分析

和编程语言一样,四则运算也是有自己的语法和规则,因此,计算过程=语法分析+运算

现在就以最简单的加减法为例,分析其中的语法规则

分析

对于一个简单的公式 (expr),我们可以将其两个部分

  • number
  • operator

1+2

\begin{align*}
expr &= 1+2 \\
number &= 1,2 \\
operator &= +
\end{align*}

进而我们可以得出

expr=number+number

考虑减法的情况

expr=number + number | number-number

现在,让我们稍稍拓展开来,对于多位数相加:1+2+3,根据上面的条件expr=number+number,可以推导出

\begin{align*}
expr =& number + number + number\\
expr = &expr + number | number + expr
\end{align*}

对于 expr = expr + number(1)

认真观察就会发现,(1)可以往左边无限制推导形成左递归

expr=expr+number+....+number

但是,我们在处理字符串的时候,是从左往右进行处理的,因此,左递归对于处理来说非常不利,所以我们可以将其改写为右递归,也就是

expr = number + expr

这样一来,我们就可以得到加减法的语法

\begin{align*}
expr &= number + expr | number - expr | number \\
number &= digit* | digit \\
digit &= 0|1|2|3|4|5|6|7|8|9
\end{align*}

通过这些文法,我们就能推导任意的加减法式子,如

\begin{align*}
expr &= 1+3-2+6 \\
&= number +expr\\
&= number + number - expr\\
&= number + number - number + expr\\
&= number + number - number +number
\end{align*}

实现

说完理论,就要说下具体的实现了,其实也很简单,比如一个expr=1+2,我们将1+2作为一个字符串

然后不断从字符串中提取字符,伪代码如下

从expr中匹配一个数字x
while(expr还有剩余字符)
{
    匹配一个符号op
    匹配一个数字y
    执行操作 x = x op y
}