2

我會發布有問題的語法規則以開始。解決語法歧義

interface_sections : main_interface bind_buttons bind_functions bind_panel_items 
        ; /* Components of a gui program */ 

bind_buttons  : T_BEGIN T_BIND T_BUTTONS T_SEMIC component_list 
         T_END T_BIND T_BUTTONS T_SEMIC 
        | epsilon 
        ; /* Bind the buttons for GUI */ 

bind_functions  : T_BEGIN T_BIND T_FUNCTIONS T_SEMIC component_list 
         T_END T_BIND T_FUNCTIONS T_SEMIC 
        | epsilon 
        ; /* Bind the graphical drawing functions for GUI */ 

bind_panel_items : T_BEGIN T_BIND T_PANEL T_ITEMS T_SEMIC component_list 
         T_END T_BIND T_PANEL T_ITEMS T_SEMIC 
        | epsilon 
        ; /* Bind the panel items or menus for GUI */ 

要注意,如果編譯器看到令牌T_BEGIN它不會知道去哪個的綁定規則main_interface後。這可能意味着開始bind_buttons,或者它可能意味着你想跳過bind_buttons並且T_BEGIN是啓動bind_functions。

如何將此語法更改爲不存在此問題?

要求:我不允許添加/刪除終端。我不能告訴用戶他們必須改變他們編寫代碼的方式,我必須改變規則來處理它。

我很難過,有什麼想法嗎?

更新: interface_sections:main_interface bind_buttons bind_functions bind_panel_items ;/* gui程序的組件*/

prefix_stuff  : T_BEGIN T_BIND 

bind_buttons  : prefix_stuff T_BUTTONS T_SEMIC component_list 
         T_END T_BIND T_BUTTONS T_SEMIC 
        | epsilon 
        ; /* Bind the buttons for GUI */ 

bind_functions  : prefix_stuff T_FUNCTIONS T_SEMIC component_list 
         T_END T_BIND T_FUNCTIONS T_SEMIC 
        | epsilon 
        ; /* Bind the graphical drawing functions for GUI */ 

bind_panel_items : prefix_stuff T_PANEL T_ITEMS T_SEMIC component_list 
         T_END T_BIND T_PANEL T_ITEMS T_SEMIC 
        | epsilon 
        ; /* Bind the panel items or menus for GUI */ 

這給了我通過野牛運行時的相同的轉換/減少錯誤。

不過,我認爲這是在正確的軌道上,我認爲我需要得到T_BUTTONS和T_FUNCTIONS和T_PANEL到規則

附加信息的前面:

component_list  : component_list valid_components 
        | valid_components 
        ; /* For the four bind blocks - a list of components */ 

valid_components : dialog_box_spec 
        | browser_box_spec 
        | pull_down_or_right 
        ; /* Possible components for the list */ 
+0

我開始編輯我的答案,但現在我很好奇 - 爲什麼你認爲這裏存在轉換 - 減少衝突?解析器是一個shift-reduce解析器,意味着它將令牌轉移到堆棧上,然後儘可能減少到非終結符。當解析器看到T_BEGIN時,它將被迫移位,因爲它不能減少。看起來你在以自上而下的方式思考。 – Kizaru 2010-11-03 03:53:18

+0

我使用flex/bison來進行解析。它告訴我有2個換檔減少錯誤。我還被告知作爲這項任務的一部分,有2個減少的錯誤。我還被告知涉及的問題能夠包括0-3這些綁定部分。 – kralco626 2010-11-03 03:57:07

+0

我將嘗試移動T-BEGIN T_BIND到prefix_stuff規則中,看看野牛給我什麼 – kralco626 2010-11-03 03:58:10

回答

1
interface_sections : main_interface bind_sections_one 
        ; /* Components of a gui program */ 

bind_sections_one : epsilon | T_BEGIN T_BIND bind_first ; 

bind_first   : T_BUTTONS T_SEMIC component_list 
         T_END T_BIND T_BUTTONS T_SEMIC bind_sections_two 
        | T_FUNCTIONS T_SEMIC component_list T_END T_BIND T_FUNCTIONS T_SEMIC bind_sections_three | T_PANEL T_ITEMS T_SEMIC component_list T_END T_BIND T_PANEL T_ITEMS T_SEMIC 
        ; 

bind_sections_two : epsilon | T_BEGIN T_BIND bind_second ; 

bind_second  : T_FUNCTIONS T_SEMIC component_list T_END T_BIND T_FUNCTIONS T_SEMIC bind_sections_three | T_PANEL T_ITEMS T_SEMIC component_list T_END T_BIND T_PANEL T_ITEMS T_SEMIC ; 

bind_sections_three : epsilon | T_BEGIN T_BIND bind_third; 

bind_third  : T_PANEL T_ITEMS T_SEMIC component_list T_END T_BIND T_PANEL T_ITEMS T_SEMIC ; 

這並沒有產生轉換減少錯誤,似乎它應該對我有用。

任何人都會看到問題?