问题描述
我在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 (将#修改为@)