将ASCII值赋给bison中的变量

assigning ASCII values to variables in bison

本文关键字:变量 bison ASCII      更新时间:2023-10-16

我想让我的解析器处理这样的情况:

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()没有被调用。这里哪里不正确?

哪里不对?

答案几乎肯定在于解析器的柔性部分:它永远不会返回CHAR标记。

您还没有向我们展示您的解析器的flex方面,但是您如何使flex区分SYMBOL_NAMECHAR ?通常,检测<single_quote> <char> <single_quote>序列的代码是flex实现的,而不是bison。<char>存储在联合中,返回值CHAR。在野牛面,将''' CHAR '''模式更改为CHAR

或者,只需将''' CHAR '''模式更改为''' SYMBOL_NAME '''