📜  递归下降解析器

📅  最后修改于: 2021-06-28 07:07:52             🧑  作者: Mango

先决条件– LL(1)解析表的构建,自上而下的解析器的分类
解析是确定开始符号是否可以派生程序的过程。如果解析成功,则该程序为有效程序,否则该程序无效。
通常有两种类型的解析器:

  1. 自上而下的解析器:
    • 在这种解析技术中,我们将开始符号扩展到整个程序。
    • 递归下降和LL解析器是自上而下的解析器。
  2. 自下而上的解析器:
    • 在这种解析技术中,我们减少了整个程序的开始符号。
    • 自下而上的解析器是运算符优先级解析器,LR(0)解析器,SLR解析器,LALR解析器和CLR解析器。

递归下降解析器:
它是一种自上而下的解析器。自上而下的解析器从开始非终端开始,从上到下构建解析树。预测分析器是递归下降分析器的特例,其中不需要反向跟踪。
通过仔细地编写语法意味着从中消除左递归和左分解,所得到的语法将是可以由递归下降解析器解析的语法。

例子:

Before removing left recursion After removing left recursion
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

**这里是Epsilon

对于递归下降解析器,我们将为每个变量编写一个程序。

Example:
Grammar: E --> i E'
E' --> + i E' | e
int main()
{
    // E is a start symbol.
    E();
  
    // if lookahead = $, it represents the end of the string
    // Here l is lookahead.
    if (l == '$')
        printf("Parsing Successful");
}
  
// Definition of E, as per the given production
E()
{
    if (l == 'i') {
        match('i');
        E'();
    }
}
  
// Definition of E' as per the given production
E'()   
{
    if (l == '+') {
        match('+');
        match('i');
        E'();
    }
    else
        return ();
}
  
// Match function
match(char t)
{
    if (l == t) {
        l = getchar();
    }
    else
        printf("Error");
}