- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
使用 Flex 进行模式识别处理基于套接字的扫描仪(连续流)。 Flex 找不到与“数组边界”重叠的匹配项。所以我实现了 yywrap() 以在 yylex() 检测到 <> 时设置新的数组内容(它将调用 yywrap)。至今没有成功。
基本上(为了指出我的问题)这是我的代码:
%{
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define BUFFERSIZE 26
/* 0123456789012345678901234 */
char cbuf1[BUFFERSIZE] = "Hello everybody, lex is su"; // Warning, no '\0'
char cbuf2[BUFFERSIZE] = "per cool. Thanks! ";
char recvBuffer[BUFFERSIZE];
int packetCnt = 0;
YY_BUFFER_STATE bufferState1, bufferState2;
%}
%option nounput
%option noinput
%%
"super" { ECHO; }
. { printf( "%c", yytext[0] );}
%%
int yywrap()
{
int retval = 1;
printf(">> yywrap()\n");
if( packetCnt <= 0 ) // Stop after 2
{
// Copy cbuf2 into recvBuffer
memcpy(recvBuffer, cbuf2, BUFFERSIZE);
//
yyrestart(NULL); // ?? has no effect
// Feed new data to flex
bufferState2 = yy_scan_bytes(recvBuffer, BUFFERSIZE);
//
packetCnt++;
// Tell flex to resume scanning
retval = 0;
}
return(retval);
}
int main(void)
{
printf("Lenght: %d\n", (int)sizeof(recvBuffer)) ;
// Copy cbuf1 into recvBuffer
memcpy(recvBuffer, cbuf1, BUFFERSIZE);
//
packetCnt = 0;
//
bufferState1 = yy_scan_bytes(recvBuffer, BUFFERSIZE);
//
yylex();
yy_delete_buffer(bufferState1);
yy_delete_buffer(bufferState2);
return 0;
}
dkmbpro:test dkroeske$ ./text
Lenght: 26
Hello everybody, lex is su>> yywrap()
per cool. Thanks! >> yywrap()
最佳答案
向 flex
提供输入流的机制是提供 YY_INPUT 的定义宏,每次调用flex
需要重新填充其缓冲区 [注 1]。使用三个参数调用宏,大致如下:
YY_INPUT(buffer, &bytes_read, max_bytes)
max_bytes
进入
buffer
, 并设置
bytes_read
到实际读取的字节数。如果此流中没有更多输入,
YY_INPUT
应该设置
bytes_read
至
YY_NULL
(即 0)。除了设置文件结束条件之外,没有其他方法可以标记输入错误。不要设置
YY_INPUT
为负值。
YY_INPUT
不提供从何处读取输入或任何类型的
userdata
的指示争论。唯一提供的机制是全局
yyin
,这是一个
FILE*
. (您可以使用
FILE*
从文件/套接字描述符创建
fdopen
并使用
fileno
取回描述符。其他解决方法超出了此答案的范围。)
YY_INPUT
所示返回 0,结束当前 token [注 2],然后调用
yywrap
决定是否有另一个流要处理。正如手册所示,它不会重置解析器状态(即,它恰好处于哪个启动条件;如果启用了行计数,则为当前行号等)。但是,
它不允许 token 跨越两个流。
yywrap
当解析器/扫描器应用于命令行上指定的许多不同文件时,最常使用该机制。在那个用例中,如果一个 token 可以从一个文件开始并继续到另一个文件,那就有点奇怪了。大多数语言实现更喜欢它们的文件在某种程度上是独立的。 (例如,考虑多行字符串文字。)通常,您实际上也希望重置更多的解析器状态(行号,当然,有时是开始条件),但这是
yywrap
的责任。 . [注3]
recv
来自您的
YY_INPUT
执行。但出于实验目的,这里有一个简单的
YY_INPUT
它只是从内存缓冲区返回数据:
/* Globals which describe the input buffer. */
const char* my_in_buffer = NULL;
const char* my_in_pointer = NULL;
const char* my_in_limit = NULL;
void my_set_buffer(const char* buffer, size_t buflen) {
my_in_buffer = my_in_pointer = buffer;
my_in_limit = my_in_buffer + buflen;
}
/* For debugging, limit the number of bytes YY_INPUT will
* return.
*/
#define MY_MAXREAD 26
/* This is technically incorrect because it returns 0
* on EOF, assuming that YY_NULL is 0.
*/
#define YY_INPUT(buf, ret, maxlen) do { \
size_t avail = my_in_limit - my_in_pointer; \
size_t toread = maxlen; \
if (toread > avail) toread = avail; \
if (toread > MY_MAXREAD) toread = MY_MAXREAD; \
*ret = toread; \
memcpy(buf, my_inpointer, toread); \
my_in_pointer += toread; \
} while (0)
yy_scan_bytes
,创建的缓冲区状态被标记为不可再填充。 YY_INPUT
。每次扫描程序到达缓冲区末尾时都不会被调用。尽管如此,最好确保您的 YY_INPUT
如果在流结束返回后再次调用它,实现将继续返回流结束。 #include
机制。 flex
提供yy_push_state/yy_pop_state
允许您实现包含堆栈的机制。你会调用 yy_push_state
曾经include
指令已被扫描,但 yy_pop_state
需要调用yywrap
.同样,很少有语言会允许 token 在包含的源文件中开始并继续遵循include
。指示。 关于c - Flex,连续扫描流(来自套接字)。我是否错过了使用 yywrap() 的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23979378/
我使用下拉菜单提供一些不同的链接,但我希望这些链接在同一选项卡中打开,而不是在新选项卡中打开。这是我找到的代码,但我对 Javascript 非常缺乏知识 var urlmenu = docume
我对 javascript 不太了解。但我需要一个垂直菜单上的下拉菜单,它是纯 JavaScript,所以我从 W3 复制/粘贴脚本:https://www.w3schools.com/howto/t
我已经坐了 4 个小时,试图让我的导航显示下 zipper 接垂直,但它继续水平显示它们。我无法弄清楚为什么会发生这种情况或如何解决它。 如果有人能告诉我我做错了什么,我将不胜感激。我有一个潜移默化的
我正在尝试创建选项卡式 Accordion 样式下拉菜单。我使用 jQuery 有一段时间了,但无法使事件状态达到 100%。 我很确定这是我搞砸的 JS。 $('.service-button').
对于那些从未访问过 Dropbox 的人,这里是链接 https://www.dropbox.com/ 查看“登录”的下拉菜单链接。我如何创建这样的下 zipper 接? 最佳答案 这是 fiddle
我正在制作一个 Liferay 主题,但我在尝试设计导航菜单的样式时遇到了很多麻烦。我已经为那些没有像这样下拉的人改变了导航链接上的经典主题悬停功能: .aui #navigation .nav li
如果您将鼠标悬停在 li 上,则会出现一个下拉菜单。如果您将指针向下移至悬停时出现的 ul,我希望链接仍然带有下划线,直到您将箭头从 ul 或链接移开。这样你就知道当菜单下拉时你悬停在哪个菜单上。 知
我有一个带有多个下拉菜单的导航栏。因此,当我单击第一个链接时,它会打开下拉菜单,但是当我单击第二个链接时,第一个下拉菜单不会关闭。 (所以如果用户点击第二个链接我想关闭下拉菜单) // main.js
我正在尝试制作一个导航下拉菜单(使用 Bootstrap 3),其中链接文本在同一行上有多个不同的对齐方式。 在下面的代码中,下拉列表 A 中的链接在 HTML 中有空格字符来对齐它们,但是空白被忽略
我希望有人能帮我解决这个 Bootstrap 问题,因为我很困惑。 有人要求我在底部垂直对齐图像和其中包含图像的链接。 我面临的问题是他们还希望链接在链接/图像组合上具有 pull-right,这会杀
我正在构建一个 Rails 应用程序,并希望指向我的类的每个实例的“显示”页面的链接显示在“索引”页面的下拉列表中。我目前正在使用带有 options_from_collection_for_sele
我有以下 Bootstrap3 导航菜单 ( fiddle here )。我想设置“突出显示”项及其子链接与下拉列表 1 和 2 链接不同的链接文本(和悬停)的样式。我还希望能够以不同于 Highli
我对导航栏中的下拉菜单有疑问。对于普通的导航链接(无下拉菜单),我将菜单文本放在 H3 中,但是当我尝试对下 zipper 接执行相同操作时,箭头不在标题旁边,而是在标题下方。我决定用 span 替换
我是一名优秀的程序员,十分优秀!