【问题标题】:Recursive Descent Parser In C - Error while backtrackingC中的递归下降解析器 - 回溯时出错
【发布时间】:2015-04-16 20:41:08
【问题描述】:

使用样本输入“(a)”为给定语法实现递归下降解析器。
这个程序的输出是检查用户读取的输入是否解析成功。至于程序的流程应该如何处理这个特定的输入......

main() 调用起始符号 E() -> T() -> T1() [ 计算结果为 false ],因此追溯到其父函数 T() 现在调用 T2()(也计算结果为 false),因此 T() -> T3() -> E() -> E1() -> T() -> T1()(计算结果为真的)。

最终E() 也应该为真,并且函数T3() 的语句return termial('(') && E() && termial(')'); 中的最后一个条件termial(')') 应该使用')' 作为token 的值来执行。然而,事实证明token == '(' 仍然存在,因此程序的输出结果为

解析失败

不太清楚为什么token 不等于')'

 //Grammar :
 //E -> T | T + E
 //T -> a | a * T | (E)
 //
 //Input :
 //(a)

#include <stdio.h>

char *next;

int E();
int E1();
int E2();
int T();
int T1();
int T2();
int T3();

int termial(char token){
    return (*next++ == token);
}

int E1(){
    return T();
}

int E2(){
    return T() && termial('+') && E();
}

int E(){
    char *temp = next;
    return (next = temp, E1()) || (next = temp, E2());
}

int T1(){
    return termial('a');
}

int T2(){
    return termial('a') && termial('*') && T();
}

int T3(){
    return termial('(') && E() && termial(')');
}

int T(){
    char *temp = next;
    return (next = temp, T1()) || (next = temp, T2()), (next = temp, T3());
}


int main(int argc, const char * argv[]) {
    char str[10];
    int result;
    printf("INPUT a string to be parsed : ");
    scanf("%s", str);
    next = &str[0];
    result = E();
    result == 1 ? printf("Parsed Successfully") : printf("Parsed Unsuccessfully");
    printf("\n");
    return 0;
}

【问题讨论】:

  • 我建议通过调试器运行它,显示 next 并查看您的期望到底在哪里错过了。如果这不能告诉您您需要知道什么,请在此处发布结果。
  • terminal( ) 中打印 next 后的输出: (a) (a) (a) a) a) a) a) ( a) (a) (a) a) a) a) 解析失败

标签: c parsing backtrace recursive-descent


【解决方案1】:

T():

int T(){
  char *temp = next;
  return (next = temp, T1()) || (next = temp, T2()), (next = temp, T3());
}

(next = temp, T3())总是被调用(它前面的逗号没有短路),并且在大多数情况下会返回false,当T1() 时会导致各种故障或T2() 成功,应该成功结束函数。

将该行更改为:

return (next = temp, T1()) || (next = temp, T2()) || (next = temp, T3());

【讨论】:

    猜你喜欢
    • 2015-06-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-25
    • 2015-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多