Bison 如何将flex缓冲区重定向到我的缓冲区

Bison 如何将flex缓冲区重定向到我的缓冲区,bison,flex-lexer,Bison,Flex Lexer,经过几天的努力,我仍然无法找到如何声明缓冲区。 将flex缓冲区重定向到我的缓冲区的正确方法是什么? 我想做的步骤是: 1-无条件,不返回原始缓冲区,只需通过调用函数从图形前端永久重定向缓冲区。 2-将文本从图形前端复制到我的缓冲区(或者更好地将fely缓冲区直接复制到前端缓冲区) 3-呼叫yyparse 4-重复步骤2和3 也许声明这样一个简单的公共函数就足够了: void setmybuffer(char *ptr) { yy_scan_string (char *ptr); .... /

经过几天的努力,我仍然无法找到如何声明缓冲区。

将flex缓冲区重定向到我的缓冲区的正确方法是什么? 我想做的步骤是: 1-无条件,不返回原始缓冲区,只需通过调用函数从图形前端永久重定向缓冲区。 2-将文本从图形前端复制到我的缓冲区(或者更好地将fely缓冲区直接复制到前端缓冲区) 3-呼叫yyparse 4-重复步骤2和3

也许声明这样一个简单的公共函数就足够了:

void setmybuffer(char *ptr)
{
yy_scan_string (char *ptr);
.... // my other stuff to set
}
// This defines the function setmybuffer, which has no return value ("void")
// and a single parameter which is a pointer to a character string ("char *")
void setmybuffer(char *ptr)
{
  // This **calls** the function yy_scan_string, passing it the same pointer 
  // to a character string.
  yy_scan_string (ptr);
  .... // my other stuff to set
}
之后,我想在任何flex操作之前调用它。但当我试图将此声明放入*.l文件的任何部分时,我得到了一个错误

lex.yy.c: In function ‘setmybuffer’:
lex.yy.c:2206:18: error: conflicting types for ‘yy_scan_string’
  YY_BUFFER_STATE yy_scan_string (char *ptr);
怎么了,怎么了

yyscan_string(char *ptr);
是一个声明,因此编译器会抱怨函数已声明且返回类型不同

您想调用函数:

yyscan_string(ptr);
所以你可以这样做:

void setmybuffer(char *ptr)
{
yy_scan_string (char *ptr);
.... // my other stuff to set
}
// This defines the function setmybuffer, which has no return value ("void")
// and a single parameter which is a pointer to a character string ("char *")
void setmybuffer(char *ptr)
{
  // This **calls** the function yy_scan_string, passing it the same pointer 
  // to a character string.
  yy_scan_string (ptr);
  .... // my other stuff to set
}
请注意,您需要在完成后释放
YY_BUFFER_STATE
。通常,您只需拨打:

yy_delete_buffer(YY_CURRENT_BUFFER);
完成输入时(例如在
规则中)。对于更复杂的用例,您可能需要保存
yyscan\u string
返回的值

是一个声明,因此编译器会抱怨函数已声明且返回类型不同

您想调用函数:

yyscan_string(ptr);
所以你可以这样做:

void setmybuffer(char *ptr)
{
yy_scan_string (char *ptr);
.... // my other stuff to set
}
// This defines the function setmybuffer, which has no return value ("void")
// and a single parameter which is a pointer to a character string ("char *")
void setmybuffer(char *ptr)
{
  // This **calls** the function yy_scan_string, passing it the same pointer 
  // to a character string.
  yy_scan_string (ptr);
  .... // my other stuff to set
}
请注意,您需要在完成后释放
YY_BUFFER_STATE
。通常,您只需拨打:

yy_delete_buffer(YY_CURRENT_BUFFER);

完成输入时(例如在
规则中)。对于更复杂的用例,您可能需要保存由
yyscan\u string

返回的值,这正是让我抓狂的地方。如果我写入
void setmybuffer(ptr)
{
yy_scan_string(*ptr);

,则消息是:
abs.l:142:18:错误:预期的声明说明符或“”标记之前的“…”
{
^
@user2469202:恐怕,如果你不知道至少一点如何编写C函数,你就无法完成这项工作。我对我的答案进行了编辑,使其更为明确,但你真的应该花几分钟阅读C的介绍,例如介绍函数调用和funct离子定义语法很早就开始了(忽略那些谈论C历史的部分,这是不相关的。)这就是让我发疯的原因。如果我写
void setmybuffer(ptr)
{
yy_scan_string(*ptr);

那么消息是:
abs.l:142:18:错误:需要声明说明符或“”标记之前的“…”
{
^
@user2469202:恐怕,如果你不知道至少一点如何编写C函数,你就无法完成这项工作。我对我的答案进行了编辑,使其更为明确,但你真的应该花几分钟阅读C的介绍,例如介绍函数调用和funct离子定义语法很早就出现了(忽略那些谈论C历史的部分,这是不相关的。)