присвоение значений ASCII переменным в зубрах - PullRequest
3 голосов
/ 12 августа 2011

Я хочу, чтобы мой парсер обрабатывал регистр как:

a='A'; // a should be set with ASCII(A) i.e 65

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

%union {
  double dval;
  char *symbol;
}

%token <symbol> SYMBOL_NAME
%token <dval> NUMBER
%token BINARY
%token OCTAL
%token DECIMAL
%token HEXADECIMAL
%token UNSIGNED
%token <symbol>CHAR
%token SHORT
%token INT
%token LONG

объявление моего заявления выглядит так:

statement:      ';'
|       expression             { setp($1); print_universal_base($1, 0); }
|       expression BINARY      { setp($1); print_universal_base($1, 2); }
|       expression OCTAL       { setp($1); print_universal_base($1, 8); }
|       expression DECIMAL     { setp($1); print_universal_base($1, 10); }
|       expression HEXADECIMAL { setp($1); print_universal_base($1, 16); }

объявление моего выражения выглядит так:

expression:     expression ',' expression { $$ = $3; }
|       SYMBOL_NAME '=' expression { if(assign_value($1, $3, &$$)) YYABORT; }
|       NUMBER { $$ = $1; }
|       '\'' CHAR '\'' { if(set_ASCII($2, &$$)) YYABORT; }

не должен

'\'' CHAR '\'' { if(set_ASCII($2, &$$)) YYABORT; } 

справиться с моим делом? как я вижу, что, когда я ввожу как

a='A'; 

set_ASCII () не вызывается. что здесь не так?

1 Ответ

3 голосов
/ 12 августа 2011

что здесь не так?

Ответ почти наверняка лежит в гибкой стороне вашего парсера: он никогда не возвращает CHAR токен.

Вы не показали нам гибкую сторону вашего парсера, но как вы делаете так, чтобы flex различал SYMBOL_NAME и CHAR? Как правило, код, который обнаруживает последовательность <single_quote> <char> <single_quote>, реализован на гибком, а не зубровом. <char> сохраняется в объединении, а возвращаемое значение CHAR. На стороне бизонов измените свой шаблон '\'' CHAR '\'' на CHAR.

Либо просто измените ваш шаблон '\'' CHAR '\'' на '\'' SYMBOL_NAME '\''.

...