在C ++中使用Flex和Bison时如何设置yylval

问题描述

我在C ++中使用Flex和Bison。在两者的C版本中,yylval是一个全局联合变量,用于存储有关令牌的信息。

在Bison C ++中,yylval被称为语义类型,它是一个类成员变量。如何从Flex C ++设置令牌的语义信息?在Flex C ++中,词法分析器也是一个类,并且不具有语义类型作为成员变量。

我想做这样的事情:

   ")"                          { return create_token(TOK_RPAREN,yytext,start_line,start_column);     }
"{"                          { return create_token(TOK_LBRACE,start_column);     }
"}"                          { return create_token(TOK_RBRACE,start_column);     }
[A-Za-z][A-Za-z0-9]*         { return create_token(TOK_IDENTIFIER,start_column); }
[0-9]+                       { return create_token(TOK_NUM,start_column);        }
[ \t\n]+
","                          { return create_token(TOK_COMMA,start_column);       }
";"                          { return create_token(TOK_SEMICOLON,start_column);   }
.                            { yyerror("UnkNown character: %c\n",yytext[0]); }

%%

void lexer_set_source_file(const char *filename) {
  g_srcfile = xstrdup(filename);
}

int CppLexer::create_token(yy::parseint tag,const char *lexeme,int line,int col) {
    struct SourceInfo info;
    info.filename = g_srcfile;
    info.line = line;
    info.col = col;
  
    if (tag == TOK_NUM) {
        nodeval.num_node = createNumberNode(lexeme,info);
    } else if (IsOperation(tag)) {
        nodeval.op_node = createOperationNode(tag,lexeme,info);
    } else if (tag == TOK_IDENTIFIER) {
        yylval.id_node = createIdentifierNode(lexeme,info);
    } else {
        nodeval.node = createCppNode(tag,info);
    }
    
    return tag;
}")"                          { return create_token(TOK_RPAREN,info);
    }
    
    return tag;
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)