2013-10-13 1 views
0

У меня грамматический:bison: почему результат неверен при печати константы в действии?

%token T_SHARE 
%token T_COMMENT T_PUBLIC T_WRITEABLE T_PATH T_GUESTOK T_VALID_USERS 
     T_WRITE_LIST T_CREATE_MODE T_DIRECTORY_MODE 
%union 
{ 
    int number; 
    char *string; 
} 

%token <string> T_STRING 
%token <number> T_NUMBER T_STATE 

%% 

parameters: 
    |parameters parameter 
     ; 
parameter: 
    section_share 
     |comment 
.... 
section_share: 
     '[' T_SHARE ']' {section_print(T_SHARE);} 
    ; 
comment: 
    T_COMMENT '=' T_STRING {print(2);parameter_print(T_COMMENT);} 
     ; 

функция печати: недействительным печати (интермедиат Arg) { Е ("% d \ п", Arg); }

но он печатает аргумент `2 'печати другим значениям, например« 8508438 », без правила. Зачем?

+1

Ваша проблема не достаточно ясна для того, чтобы кто-нибудь предоставил вам соответствующий ответ. Вам нужно предоставить более подробную информацию. Кроме того, взгляните на режим отладки Bison. – akim

ответ

0

Очень сложно понять, что вы пытаетесь спросить, но я думаю, что вы вводите в заблуждение числовые коды токенов с их семантическими значениями. В частности, нет ничего особенного в вызове print(2) в действии, связанном с вашим правилом комментариев. Он копируется буквально в сгенерированный синтаксический анализатор, поэтому, учитывая определение функции print(), буквально «2» следует печатать каждый раз, когда это правило срабатывает. Я думаю, это то, что вы говорите, наблюдаете.

Если вместо этого вы хотите напечатать семантическое значение, связанное с символом в правиле, то синтаксис будет иметь вид $ n, где число после знака доллара - это число желаемого символа в правиле, считая от 1. Таким образом, в правиле «комментариев» семантическое значение, связанное с символом T_STRING, может ссылаться на $3. Например:

comment: 
    T_COMMENT '=' T_STRING { printf("The string is %s\n", $3); } 
; 

Семантические значения примитивных токенов должны быть установлены с помощью вашего лексического анализатора; Семантические значения нетерминалов должны быть заданы действиями в вашей грамматике. Обратите внимание также, что действия среднего правила включаются в счет.

Хотя маркеры, такие как ваш T_COMMENT, могут использоваться непосредственно в действиях, обычно это не так полезно. Эти символы будут разрешаться препроцессором С номерами, характерными для конкретного символа. Полученные коды токенов не имеют ничего общего с анализируемыми конкретными значениями.

Смежные вопросы