2011-02-23 5 views
0

Я пытаюсь написать (относительно) простой синтаксический анализатор файла конфигурации в flex/bison. Основная идея заключается в том, что моя грамматика bison использует некоторые функции C для организации анализируемых данных в серии C-структур. Я был бы рад опубликовать свой код, если кто-то подумает, что нужно ответить на вопрос, просто прокомментировать.Какова область действия yacc/bison?

Проблема, с которой я сталкиваюсь, включает в себя объем процедур в пределах bison действий. Например, если у меня есть что-то вроде:

set 
      : NTOK name { 
          section *sec 
          init_s(sec, $2); 
          add_s(cf, sec); 
         } 

не sec должны быть доступны в более позднем правило грамматики для использования? Я получаю error: 'sec' undeclared, когда пытаюсь снова вызвать его в качестве аргумента. Может ли кто-нибудь просветить меня?

+1

Посмотрите на сгенерированный код. –

+0

Что я должен искать? Не уверен, что понимаю. – Pygmalion

+1

Пожалуйста, не редактируйте ответы на вопрос. Комбинация голосования по ответам и вашей способности принять их лучше справляется с их сортировкой для людей, которые приходят позже. – dmckee

ответ

4

Весь код, созданный для действий в bison, находится в своем собственном объеме (IIRC, сгенерированный код обертывает его в фигурные скобки, чтобы обеспечить его выполнение). Если вы хотите сделать данные глобально доступными для других действий, вам нужно явно объявить глобальную переменную где-нибудь (возможно, в верхней части сценария или bison?), Затем напишите на эту переменную. Обоснованием этого является то, что если каждая переменная в действии была неявно глобальной или, по крайней мере, удобочитаемой другими действиями, тогда было бы очень легко случайно переработать данные мусора, когда вы хотели создавать новые данные.

+0

Спасибо! Это прекрасно отвечает на мой вопрос. Оцените вас, включая работу. – Pygmalion

0

Эта проблема обычно решается путем назначения types для токенов и правил. Вы также можете добавить функцию parameters к функции парсера.

%union { 
    char* name; 
    section* sec; 
} 

%parse-param {whatever_type cf} 

%token <name> name 
%type <sec> set 

%% 

set  : NTOK name { 
          init_s(&$$, $2); 
          add_s(cf, $$); 
         } 
     ; 

other_rule: set name {do_something_other($1 $2);} 
      ; 
Смежные вопросы