Yacc / Bison: псевдопеременные ($$, $ 1, $ 2, ..) и как их печатать, используя printf - PullRequest
3 голосов
/ 06 июля 2011

У меня есть лексический анализатор, написанный на flex, который передает токены моему парсеру, написанному на бизоне.

Вот небольшая часть моего лексера:

ID [a-z][a-z0-9]*

%%

rule {
    printf("A rule: %s\n", yytext);
    return RULE;
}

{ID} { 
    printf( "An identifier: %s\n", yytext );
    return ID;
}

"(" return LEFT;
")" return RIGHT;

Есть и другие битыдля анализа пробелов и т. д.

Тогда часть синтаксического анализатора выглядит следующим образом:

%{
#include <stdio.h>
#include <stdlib.h>
#define YYSTYPE char*
%}

%token ID RULE 
%token LEFT RIGHT 

%%

rule_decl : 
    RULE LEFT ID RIGHT { printf("Parsing a rule, its identifier is: %s\n", $2); }
    ;

%%

Все работает нормально, но я просто хочу распечатать токен ID с помощью printf - вот и все:).Я не пишу компилятор ... просто flex / bison - хорошие инструменты для моего программного обеспечения.Как вы собираетесь печатать токены?Я просто получаю (null), когда печатаю.

Спасибо.

1 Ответ

7 голосов
/ 06 июля 2011

Я не эксперт в yacc, но я справился с переходом от лексера к анализатору следующим образом: для каждого токена лексера у вас должно быть отдельное правило для «перевода» yytext в удобную форму для вашего парсера.В вашем случае, вы, вероятно, просто интересуетесь yytext (хотя, если бы вы писали компилятор, вы бы обернули его в SyntaxNode объект или что-то в этом роде).Попробуйте

%token ID RULE 
%token LEFT RIGHT

%%

rule_decl:
    RULE LEFT id RIGHT { printf("%s\n", $3); }

id:
    ID { $$ = strdup(yytext); }

Дело в том, что последнее правило делает yytext доступной как переменную $, на которую могут ссылаться правила, включающие id.

...