- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
Flex manual on Multiple Input Buffers
你可以在那里看到:
The following routines are available for setting up input buffers for scanning in-memory strings instead of files. All of them create a new input buffer for scanning the string, and return a corresponding YY_BUFFER_STATE handle (which you should delete with yy_delete_buffer() when done with it). They also switch to the new buffer using yy_switch_to_buffer(), so the next call to yylex() will start scanning the string.
然后你有 yy_scan_string
等等
通常 Flex 的默认设置很好,我有一个文件要扫描或只需要一台扫描仪,但这个任务是不同的。
我正在尝试创建一个能够扫描多个文件和一些字符串的扫描仪。它是可重入的,我以前从未使用过 YY_INPUT()。
所以我的问题如下:
当一个缓冲区完成并且没有任何东西要扫描时,Flex 是否将该状态从堆栈中弹出,如果有另一个状态开始扫描它是如何停止的?
我的意思是它是如何停止的,就好像它是在一条规则的中间。假设我尝试匹配 ab
,如果一个状态以 a
结尾,而另一个状态以 b
开头,如何处理?
问题
/** Pushes the new state onto the stack. The new state becomes
* the current state. This function will allocate the stack
* if necessary.
* @param new_buffer The new state.
* @param yyscanner The scanner object.
*/
void yypush_buffer_state (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner)
{
struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
if (new_buffer == NULL)
return;
yyensure_buffer_stack(yyscanner);
/* This block is copied from yy_switch_to_buffer. */
if ( YY_CURRENT_BUFFER )
{
/* Flush out information for old buffer. */
*yyg->yy_c_buf_p = yyg->yy_hold_char;
YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = yyg->yy_c_buf_p;
YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars;
}
/* Only push if top exists. Otherwise, replace top. */
if (YY_CURRENT_BUFFER)
yyg->yy_buffer_stack_top++;
YY_CURRENT_BUFFER_LVALUE = new_buffer;
/* copied from yy_switch_to_buffer. */
yy_load_buffer_state(yyscanner );
yyg->yy_did_buffer_switch_on_eof = 1;
}
推空行不通
我的期望
我希望 yylex
返回 0 意味着缓冲区结束(并给我一个操作它们的机会)
我也希望,除非我重新启动扫描器,否则它会在它停止的地方继续进行(所以 ab
如果一个缓冲区以 a 结尾而另一个以 b 开头,则 ab
将被匹配,除非我明确重启扫描仪)
其次,如何在不将 flex 设置为事件缓冲区的情况下准备字符串缓冲区。
我想我可以创建一个新的“空”缓冲区(请参阅链接中的创建缓冲区函数)推送它,然后将其推送到堆栈上。
当我从字符串创建缓冲区时,我希望该函数设置输入缓冲区,它是输入堆栈的顶部,这将无害地删除我的“空”缓冲区。
对于原本如此可爱的东西来说,这似乎相当困惑。
提问的原因
测试这个会非常困难。我还必须假设我知道 flex 如何正确工作,然后根据我认为它如何工作来设计通过或失败的测试,看看它是否确实如此。这会花费很长时间,而且即使是错误的,我也可能无法获得支持我的模型的结果。
最佳答案
token 不能跨越缓冲区边界——单个 token 的所有字符必须来自同一个缓冲区。最简单的方法就是将缓冲区想象成包含一个字符序列,后面跟着一个 EOF —— flex 将通过从当前缓冲区读取字符来匹配一个标记,如果没有标记匹配,将匹配默认的“匹配任何单个字符作为标记并回应它”的规则。您对 token 的操作代码可能会切换缓冲区,在这种情况下,下一个 token 将来自新缓冲区。缓冲区永远不会在 token 中间切换,也永远不会“自动”切换——您需要在代码中的某处进行显式切换。
当 flex 到达缓冲区的末尾(除 EOF 标记外没有剩余字符)时,它将匹配 <<EOF>>
规则(可能切换到新缓冲区),或调用 yywrap
(您可以将 yywrap
视为“默认”<<EOF>>
规则)。默认 yywrap
不更改缓冲区并导致 yylex
返回 0 token 。由于缓冲区未更改,如果您调用 yylex
再次不改变缓冲区,它会再次做同样的事情。
yy_scan_string/bytes 切换到新缓冲区的事实是您通过保存当前缓冲区并恢复来解决的烦恼:
YY_BUFFER_STATE cur = YY_CURRENT_BUFFER;
YY_BUFFER_STATE n = yy_scan_string(str);
yy_switch_to_buffer(cur);
通常紧随其后的是yypush_buffer_state(n)
。 .
关于c - Flex - 从字符串创建缓冲区状态而不将其设置为事件缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20290427/
这个问题已经有答案了: Is there any way to accept only numeric values in a JTextField? (20 个回答) It's possible i
我使用戴尔 XPS M1710。笔记本电脑的盖子、侧面扬声器和前置扬声器都有灯(3 组灯可以单独调节)和鼠标垫下方的灯。在 BIOS 中,我可以更改这些灯的颜色,至少是每个组。另外,我可以在鼠标垫下打
我知道我可以使用 在 iOS 5 中打开设置应用 [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"prefs://"
我有一个 Django 应用程序,我正在尝试为其设置文档。目录结构如下: - doc - project | - manage.py 我已经设置了路径以便 Sphinx 可以看到东西,但是当我尝试使用
我正在使用 768mb ram 运行 centos 5.5。我一直在日志中获取 server reached MaxClients setting, consider raising the MaxC
我在具有以下配置的服务器内运行了 Drupal 安装: StartServers 5 MinSpareServers 5 MaxSpareServers 15 MaxClien
是否可以使用 Microsoft.Web.Administration 包为给定的 location 配置 asp 设置? 我想以编程方式将以下部分添加到本地 IIS applicationHost.
我一直在阅读为 kube-proxy 提供参数的文档,但没有解释应该如何使用这些参数。我使用 az aks create 创建我的集群使用 azure-cli 程序,然后我获得凭据并使用 kubect
我想知道与在 PHP 中使用 setcookie() 函数相比,在客户端通过 JavaScript 设置一些 cookie 是否有任何明显的优势?我能想到的唯一原因是减少一些网络流量(第一次)。但不是
我有一个按钮可以将 body class 设置为 .blackout 我正在使用 js-cookie设置cookie,下面的代码与我的按钮相关联。 $('#boToggle').on('click'
我有一堆自定义的 HTML div。我将其中的 3 存储在具有 slide 类的 div 中。然后,我使用该幻灯片类调用 slick 函数并应用如下设置: $('.slide').slick({
我正在创建一个应该在 Windows 8(桌面)上运行的应用 我需要: 允许用户使用我的应用启动“文件历史记录”。我需要找到打开“文件历史记录”的命令行。 我需要能够显示“文件历史记录”的当前设置。
我刚买了一台新的 MacBook Pro,并尝试在系统中设置 RVM。我安装了 RVM 并将默认设置为 ➜ rvm list default Default Ruby (for new shells)
由于有关 Firestore 中时间戳行为即将发生变化的警告,我正在尝试更改我的应用的初始化代码。 The behavior for Date objects stored in Firestore
在 ICS 中,网络 -> 数据使用设置屏幕中现在有“限制后台数据”设置。 有没有办法以编程方式为我的应用程序设置“限制后台数据”? 或 有没有办法为我的应用程序调出具有选项的“数据使用”设置? 最佳
我正在尝试使用 NextJS 应用程序设置 Jest,目前在 jest.config.js : module.exports = { testPathIgnorePatterns: ["/.n
我最近升级到 FlashDevelop 4,这当然已经将我之前的所有设置恢复到原来的状态。 我遇到的问题是我无法在新设置窗口的哪个位置找到关闭它在方括号、大括号等之前插入的自动空格的选项。 即它会自动
有没有办法以编程方式访问 iPhone/iPod touch 设置? 谢谢。比兰奇 最佳答案 大多数用户设置可以通过读取存储在 /User/Library/Preferences/ 中的属性列表来访问
删除某些值时,我需要选择哪些设置来维护有序队列。我创建了带有自动增量和主键的 id 的表。当我第一次插入值时,没问题。就像 1,2,3,4,5... 当删除某些值时,顺序会发生变化,例如 1,5,3.
我正在尝试设置示例 Symfony2 项目,如此处所示 http://symfony.com/doc/current/quick_tour/the_big_picture.html 在访问 confi
我是一名优秀的程序员,十分优秀!