[英]Recursive Descent Parser In C - Error while backtracking
使用樣本輸入“(a)”為給定的語法實現遞歸下降解析器。
該程序的輸出是檢查用戶讀取的輸入是否已成功解析。 至於該特定輸入的程序流應如何...
main()
調用開始符號E() -> T() -> T1()
[其結果為false],從而追溯到其父函數T()
,該父函數現在調用T2()
(其結果也為false),因此T() -> T3() -> E() -> E1() -> T() -> T1()
(評估為true)。
最終E()
也應該為true,並且語句中的最后一個條件termial(')')
return termial('(') && E() && termial(')');
來自函數T3()
應使用')'
作為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;
}
在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());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.