首页 > 解决方案 > C中的递归下降解析器

问题描述

我有以下生产规则

E -> (EX)|Y

X -> vE|^E|>E

Y -> -E|p|q|r

我有以下代码

int i;
int j;
int count;
char l;

void match(char t);
void E();
void X();
void Y();

void match(char t) 
{ 
    if (l == t) { 
        count += 1;
    } 
    else{
        printf("Error"); 
    }
} 

void E()
{
    if(l == '('){
        match('(');
        E();
        X();
        if(l == ')'){
            match(')');
            return;
        }
    }
    else{
        Y();
    }
    return;
}

void Y()
{
    if(l == '-'){
        match('-');
        E();
    }
    else if(l == 'p'){
        match('p');
        return;
    }
    else if(l == 'q'){
        match('q');
        return;
    }
    else if(l == 'r'){
        match('r');
        return;
    }
}

void X()
{
    if(l == 'v'){
        match('v');
        E();
    }
    else if(l == '^'){
        match('^');
        E();
    }
    else if(l == '>'){
        match('>');
        E();
    }
    return;
}

int parse(char* g){
  count = 0;
  //int k = strlen(g);
  l = g[count];
  //sprintf("%c",l);
  E();
  if(l == '$'){
    printf("Parsing successful");
    return 1;
  }
  else{
    printf("Parsing unsuccessful");
    return 0;
  }
} 

这似乎不起作用。该程序在没有打印任何内容的情况下崩溃。代码中的问题是什么?代码最初运行但没有任何反应,然后程序就退出了。我不认为有分段错误,但有人可以建议和帮助

标签: c

解决方案


您的代码永远不会更新ll如果我正确理解您的代码,您match至少需要更新:

void match(char t) 
{ 
    if (l == t) { 
        count += 1;
        l = g[count];
    } 
    else {
        printf("Error"); 
    }
} 

为此,您需要使gglobal` (或者,理想情况下,您将删除所有全局变量并将解析器的状态封装到您传递给解析函数的结构中)。


推荐阅读