繁体   English   中英

C中的递归下降解析器

[英]Recursive descent parser in 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;
  }
} 

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

您的代码永远不会更新l 如果我正确理解您的代码,您至少希望在match中更新l

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM