【问题标题】:Tokenizing Strings in a File标记文件中的字符串
【发布时间】:2011-10-03 20:40:55
【问题描述】:

我有一个文件,我正在标记其中的所有字符串。

所以每个令牌都存储在char *token = (char *) malloc(len + 1); 令牌在分配新令牌之前被释放,所以我需要一种方法来存储令牌以供进一步使用。

存储令牌的好策略是什么?我有一个函数可以一次打印出一个标记字符串。

我的问题不是关于如何标记或解析,所以请忽略它的实现。我的问题是,我有一堆字符串在一个循环中被分配和释放多次。那么如何将每个分配存储在其他地方以供进一步使用?

【问题讨论】:

  • 我们可以看看这个文件的例子吗?
  • 你能提供更多的上下文吗?你想做什么?
  • 目前您的问题回答范围从完整的词法分析解决方案(如 lex)或简单的字符串标记器(如 strtok)。正如其他人所说,提供更多细节。
  • 存储令牌的好策略完全取决于您打算如何处理令牌。
  • 我仍然认为需要更多地说明在存储令牌后您将要使用这些令牌的用途。例如,如果快速访问令牌是最重要的事情,那么哈希表可能是最好的。如果维护顺序很重要,那么哈希表可能不起作用。这是可以帮助我回答的信息类型。

标签: c string file tokenize


【解决方案1】:

通常令牌不存储到文件中。当解析器准备好读取更多输入时,解析器会请求它们。

因此,令牌存储在程序堆上的内存中,并在它们被处理后(可能在文件被完全解析之前很久)被释放。

--- 更新以跟随编辑 ---

如果您担心过度分配和释放,那么您有多种解决方案,具体取决于您尝试解决的问题的细节。

对于字符串,您可以通过“字符串生成器”界面创建它们,该界面会检查该文本是否已存在字符串,如果存在,则返回对已存在字符串的引用。请注意,要使其正常工作,所有返回的字符串都必须是不可变的(因为更改一个引用中的字符串将更改所有引用中的字符串)。数字、布尔值等也有类似的解决方案。

对于标记重用,您可以将标记制成一个结构,该结构主要通过指针引用可能被解析器“使用”的数据。这样,解析器就可以获取令牌的“字段”,并且可以将“骨架”令牌添加回“重用队列”。重用队列应该在将令牌返回给令牌生成器之前重置令牌的“数据”引用,令牌生成器将被重写以向队列询问它的数据结构。如果“队列中”没有令牌,队列应该静默分配它们。

也存在其他解决方案,具体取决于您想要获得的狡猾程度。

【讨论】:

  • 我已更新问题以解决一些编辑问题。
猜你喜欢
  • 1970-01-01
  • 2013-07-28
  • 1970-01-01
  • 1970-01-01
  • 2018-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多