代码之家  ›  专栏  ›  技术社区  ›  Adi Shavit

C++中的增量流解析

  •  1
  • Adi Shavit  · 技术社区  · 16 年前

    我使用非阻塞read()函数(在C/C++中)从(串行)端口读取数据。 这意味着每次我“轮询”端口时,数据都以未确定(但已报告)大小(包括0)的块形式出现。然后,我需要为某些模式(而不是XML)解析这个“流”。

    每次read()返回非零缓冲区时,我的naive实现都会将新字符串连接到前一个流字符串,并重新解析整个字符串。 当模式匹配时,相关部分将被丢弃,只留下字符串的尾部供下次使用。

    显然,有更有效的方法来实现这一点,例如,增量解析a-la SAX、类似deque的缓冲区或类似的字符串切片等。 而且,很明显,我不是第一个必须做这种类型的流解析的人。

    有人知道有哪个图书馆已经做过这种事吗? 在丢失模式匹配的情况下防止内存溢出也是一大优势。

    谢谢 阿迪

    1 回复  |  直到 16 年前
        1
  •  0
  •   Zan Lynx    16 年前

    你可以根据你的模式做一些小动作。

    • 寻找一个类似换行符的字符,只需扫描字符串的新部分。
    • 如果正在查找\r\n,则只需扫描新部分,从上一部分的最后一个字符开始。
    • 如果你有一个已知结尾部分的模式,那么你只需要扫描这个结尾就知道你是否需要扫描整个缓冲区。
    • 如果您有某种类型的同步字符,比如C/C++中的分号,那么只要找到一个,就可以解析或声明一个解析错误。