C 语言递归下降解析器程序

2024年8月28日 | 阅读 4 分钟

引言

解析过程涉及确定给定程序是否合法。它检查输入字符串以查看其是否符合既定语法。

解析器分为两种

1. 自顶向下解析器

这些解析器从树的根部开始,向下遍历到其叶子递归下降解析器LL 解析器是自顶向下解析器的两个示例。

2. 自底向上解析器

使用这种解析技术,整个程序被简化为起始符号自底向上解析器包括运算符优先级解析器LR(0) 解析器SLR 解析器LALR 解析器CLR 解析器

什么是递归下降解析器?

解析器这样的持续下降自顶向下解析器,从根到叶构建解析树。它使用递归函数识别输入,并且可能使用也可能不使用回溯预测解析是递归下降解析器的一种变体,不需要回溯。

回溯

您可以遵循几个步骤来使用回溯

  1. 它会重复扫描输入,直到我们找到正确的路径。
  2. 为了创建递归下降解析器,语法必须具备以下品质
  3. 不应允许重复。
  4. 它需要进行左因子分解。备选项不应共享前缀。
  5. 语言应该支持递归。
  6. 如果语法未进行左因子分解,递归下降解析器将需要回溯。

示例

在消除左递归之前在消除左递归之后
E -> E + T | T
T -> T * F | F
F ->( E ) | id
E -> T E'
E' -> + T E' | e
T -> F T'
T' -> * F T' | e
F ->( E ) | id

现在,我们将为递归下降解析器中的每个变量创建一个单独的程序。

程序

输出

Enter the string

Input		 Action
--------------------------------
i+(i+i)*i        E -> T E'
i+(i+i)*i        T -> F T'
+(i+i)*i         F ->i
+(i+i)*i         T' -> $
+(i+i)*i         E' -> + T E'
(i+i)*i          T -> F T'
(i+i)*i          F -> ( E )
i+i)*i           E -> T E'
i+i)*i           T -> F T'
+i)*i            F ->i
+i)*i            T' -> $
+i)*i            E' -> + T E'
i)*i             T -> F T'
)*i              F ->i
)*i              T' -> $
)*i              E' -> $
*i               T' -> * F T'
                 F ->i
                 T' -> $
                 E' -> $
--------------------------------
String is successfully parsed

递归下降解析器:优点和缺点

递归下降解析器有几个优点和缺点。递归下降解析器的一些主要优点和缺点如下:

优点

  1. 实现递归下降解析器相当简单。它们非常适合“快速而粗糙”的场景。

缺点

  1. 这些解析器比其他一些解析器慢。对于需要任意长超前的解析,它们效率低下
  2. 只有支持递归过程调用的语言才能实现。它存在左递归问题。