bison如何获取令牌值(非语义值)

bison如何获取令牌值(非语义值),bison,flex-lexer,bisonc++,Bison,Flex Lexer,Bisonc++,是否可以恢复令牌的值 我有一个类似的规则: unaryOperation: NOT { $$ = new UnaryOP(NOT); } | PLUS { $$ = new UnaryOP(PLUS); } | MINUS { $$ = new UnaryOP(MINUS); } ; 不,加号和减号是标记,我也在程序中使用生成的定义。是否可以恢复此数据,而不在同一行重复我自己 我对语义值不感兴趣,所以写这篇文章是不正确的: un

是否可以恢复令牌的值

我有一个类似的规则:

unaryOperation:
      NOT       { $$ = new UnaryOP(NOT); }
    | PLUS      { $$ = new UnaryOP(PLUS); }
    | MINUS     { $$ = new UnaryOP(MINUS); }
    ;
不,加号和减号是标记,我也在程序中使用生成的定义。是否可以恢复此数据,而不在同一行重复我自己

我对语义值不感兴趣,所以写这篇文章是不正确的:

unaryOperation:
      NOT       { $$ = new UnaryOP($1); }
    | PLUS      { $$ = new UnaryOP($1); }
    | MINUS     { $$ = new UnaryOP($1); }
    ;
谢谢

bison不需要知道识别了哪个令牌,因为该信息实际上是堆栈状态的一部分。但是,如果启用了调试,bison表将包含每个缩减右侧的编码版本,这允许内置跟踪功能生成人类可读的跟踪

理论上,您也可以使用这些信息,但这并不是您想要的,因为bison将flex令牌号转换为一个连续的序列,以允许更紧凑的解析表,并且不提供任何方法将它们转换回。因此,这将是乏味的

一个更好的解决方案是使用语义值,假设它有一个整数变量,您当前会忽略它。分配语义值的代价很小,因为bison确实需要将每个令牌的语义值初始化为某种东西

因此,一个合理的flex/bison解决方案可能是:

弯曲 野牛
我曾尝试要求使用“正常”和“翻译”的“前瞻”符号,但没有成功:另外,是否可以在flex文件中使用%union?flex手册说它是由bison生成的…@RicardoLucca:lookahead符号是yychar,但它对您毫无帮助,因为它是下一个符号。@rici建议也使用语义值来恢复元素的数据。但是,我尝试不使用此值。我解决了扩展UnaryOP的问题:UnaryNot、UnaryPlus和UnaryPlus。我认为这不是一个好的解决方案。。。
%union {
   int intval;
   /* ... other semantic values */
}

%%

 /* All the other rules come first */

 /* Default rule which just passes any character through to bison
  * (see note)
  */
.  { return (yylval.intval = yytext[0]); }
 /* This declaration is only necessary because these tokens
  * have a semantic value
  */
%token <intval> '-' '+' '!'

%%

unaryOperation
    : '!'     { $$ = new UnaryOP($1); }
    | '+'     { $$ = new UnaryOP($1); }
    | '-'     { $$ = new UnaryOP($1); }
    ;
'!='   { return (yylval.intval = NOTEQUAL); }