C++ 为bison中的变量分配ASCII值
我希望我的解析器能够像这样处理大小写:C++ 为bison中的变量分配ASCII值,c++,c,compiler-construction,bison,yacc,C++,C,Compiler Construction,Bison,Yacc,我希望我的解析器能够像这样处理大小写: 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 %toke
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
我的表达式声明如下所示:
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()。这里有什么不正确的地方
这里有什么不正确的地方
答案几乎肯定在解析器的flex端:它永远不会返回CHAR
标记
您还没有向我们展示解析器的flex方面,但是您如何让flex区分符号\u名称
和字符
?通常,检测序列的代码是在flex中实现的,而不是bison。
存储在union中,返回值CHAR
。在野牛方面,将您的'\''\''\'
模式更改为CHAR
或者,只需将'\''字符'\''
模式更改为'\''符号\u名称'\''
a='A';