使lex / yacc脚本多线程

问题描述 投票:1回答:1

我有一个lex / yacc代码,它在解析文件后捕获一些数据。该文件采用特定格式。考虑这种格式:

文件格式:

ABC
  Something something
ABC
  Something something
....
....

Lex / Yacc代码现在是顺序的。是否可以通过将单个文件划分为由ABC分隔的块来对单个文件进行代码多线程处理。

从哪儿开始?

如果需要,我将很乐意分享更多细节。

yacc lex
1个回答
0
投票

问题是,在词法分析文件之前,您不知道分隔符的位置。除非分隔符在上下文中是明确的(如果您的语法包含注释或引用的字符串之类的情况不会出现这种情况),那么您无法在不知道该点的上下文的情况下在文件中的随机点开始分析。因此,在常见情况下,找到分隔符需要线性扫描。

每次识别块的端点时,您都​​可以将文件的一部分交给单独的块解析器线程。这将需要扫描块两次(一次用于初始分隔符扫描,第二次用于精确解析)但如果解析相对较慢,它可能仍然是一个胜利。您可以通过将令牌流保留在内存中并将解析器线程传递给令牌列表来避免第二次扫描,但很可能证明令牌列表的内存管理和其他簿记比词法扫描更昂贵。这将取决于很多因素,因此在您的特定用例中进行实验和基准测试是必要的。

如果分隔符是完全明确的并且块相对较短,则可以将文件划分为一些方便大小的页面,并为每个线程分配自己的页面进行分析。当为线程分配页面时,它必须跳过初始数据,直到找到第一个分隔符;当它到达页面的末尾时,它将不得不继续扫描下一页中当前块的其余部分。因此会有一些重复的扫描,但如果块相对于页面大小较短,则不会太糟糕。同样,对您的特定用例进行基准测试将非常有用。而且,如果您能够在不知道任何有关词汇上下文的情况下明确识别分隔符,则只能执行此操作。

© www.soinside.com 2019 - 2024. All rights reserved.