[英]Shift-Reduce Conflict in YACC for a rule starting with Action
%token A B
%%
start: {printf("Starting…\n");} A A
| A B;
我的書說,當令牌是 A 時,會發生移位減少沖突,因為 yacc 會轉換為代碼。
%token A B
%%
start: empty A A
| A B;
empty: {printf("Starting…\n");} ;
我沒有得到這個。 這里開始的第二條規則轉移,空規則減少。 start 的第一個規則也發生了變化,所以第一個輸入需要 A,而第二個規則需要 B。這怎么沖突? 據我所知,一個規則必須減少,另一個應該改變,而不是兩個規則應該期望相同的標記作為這種沖突的輸入。 但是,這里有一條規則既移動又減少(第一條規則),而第二條規則只移動,它們也期望在這些操作之后有不同的令牌。
沖突在於它不知道在移動 A 之前是否減少空規則(運行操作)。兩個規則都期望 A 作為第一個標記,因此您會遇到移位/減少沖突。 應該做什么取決於第二個標記,因此語法沒有歧義,並且可以通過使用更多前瞻(使用 GLR 或回溯解析器)來解決沖突。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.