РАЗВОЖЕНИЕ ГРАМАМАМАРНОЙ Одномесячность
Вопрос
Я опубликую правила рассматриваемой грамматики, чтобы начать.
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 */
Решение
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 ;
Это не произвело сдвиг-уменьшение ошибок и кажется, что она должна работать со мной.
Кто-нибудь видит проблему?