簡體   English   中英

YACC 中以 Action 開頭的規則的 Shift-Reduce Conflict

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM