問題の文法の規則を投稿して開始します。
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 */
main_interface の後に、コンパイラがトークン T_BEGIN を検出すると、どのバインド ルールに移動するかがわからないことに注意してください。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 */