我在 yacc 中撰寫了一個非常簡單的左遞回語法,基于一個簡單的類 C 語言的資料型別。生成的 yacc 決議器在左遞回后綴之前減少了,我不知道為什么。
這是源代碼:
%%
start: type {
printf("Reduced to start.\n");
};
type: pointer {
printf("Reduced pointer to type.\n");
}
| char {
printf("Reduced char to type.\n");
};
char: KW_CHAR {
printf("Reduced to char.\n");
};
pointer: type ASTERISK {
printf("Reduced to pointer.\n");
};
%%
給定輸入char *(KW_CHAR ASTERISK):
Reduced to char.
Reduced char to type.
syntax error
uj5u.com熱心網友回復:
您似乎不是在詢問您收到的決議錯誤(如評論中所述,這可能是 回傳的令牌型別的問題yylex()),而是為什么決議器減少按顯示的順序執行通過你的蹤跡。這就是我將在這里嘗試解決的問題,盡管它很可能是XY 問題,因為理解歸約順序很重要。
在這種情況下,歸約順序非常簡單。如果你有一個生產:
pointer: type ASTERISK
那么type在ASTERISK移位之前必須減少。在 LR 決議器中,當要減少的右側恰好在最后消耗的輸入標記處結束時,必須進行減少。(先行標記已被詞法掃描器識別,但尚未被決議器使用。因此它不是歸約的一部分,也可用于識別在同一點結束的其他歸約。)
我希望在生產中更明顯地說明原因
type: char
char之前需要減少type。直到char減少,它不能用于減少type.
實際上,這兩個示例顯示了相同的行為。減少是從左到右執行的,從下到上(即子項優先)。因此,這種決議的名稱。
因此,您的決議器顯示的歸約順序(首先是char,然后是type,并且只有在*移位之后,pointer)正是預期的結果。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/314430.html
上一篇:使用Python決議.xlsx并收集行和列的內容統計資訊
下一篇:從字串決議浮點數(v-lang)
