📜  递归下降解析器

📅  最后修改于: 2021-09-27 22:50:05             🧑  作者: Mango

先决条件——LL(1)解析表的构建,自顶向下解析器的分类
解析是确定起始符号是否可以导出程序的过程。如果解析成功,则该程序是有效程序,否则该程序无效。
通常有两种类型的解析器:

  1. 自上而下的解析器:
    • 在这种解析技术中,我们将开始符号扩展到整个程序。
    • 递归下降和 LL 解析器是自上而下的解析器。
  2. 自下而上的解析器:
    • 在这种解析技术中,我们将整个程序简化为起始符号。
    • Operator Precedence Parser、LR(0) Parser、SLR Parser、LALR Parser 和 CLR Parser 是自下而上的解析器。

递归下降解析器:
它是一种自顶向下的解析器。自顶向下的解析器从非终结符的 start 开始,从上到下构建解析树。预测解析器是递归下降解析器的一种特殊情况,不需要回溯。
仔细编写文法意味着消除左递归和左分解,得到的文法将是一个可以被递归下降解析器解析的文法。
例子:

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

**这里 e 是厄普西隆
对于递归下降解析器,我们将为每个变量编写一个程序。

Example:
Grammar: E --> i E'
E' --> + i E' | e

C
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'();
    }//The second condition of E'
    else if ( l == 'e' )
    {
      match('e');
    }
        return ();
}
 
// Match function
match(char t)
{
    if (l == t) {
        l = getchar();
    }
    else
        printf("Error");
}