c++ - 将词法分析器移植到较新版本的 Quex 时出现问题

标签 c++ quex

我曾经用 std::basic_stringstream<char> 为我的 Quex 驱动的词法分析器提供数据存在 像这样发送给构造函数:

typedef std::basic_stringstream<char> UStringStream;
UStringStream tokenStream(sCode);
quex::ecmascript_lexer ecmascript_lexer(&tokenStream);

这可以使用 Quex 0.64.8 , 但似乎 API 已更改 从那以后它似乎不适用于版本 0.67.4 .

关于我应该如何将我的代码移植到新版本的任何指示 将不胜感激。

最好的问候,

帕特里克·J

编辑:删除了关于字符串累加器的问题,它 将作为单独的问题重新发布。

最佳答案

这其实是两个问题。假设您编辑文本以便 这个问题是关于新的构造函数 API 的。对于蓄能器, 请发布一个单独的问题。

构造函数、include_push 和 reset 的新 API 已经完全完成 重做以便它可以处理任何类型的输入。关键是 “ByteLoader”的抽象。 ByteLoader 是为 C 标准文件和流,POSIX 文件描述符(->用于套接字), 并直接从内存加载(在单元测试中很好地检查大量场景)。现在,如何使用它?

为您的输入场景创建一个 ByteLoader,即 'std::stream':

QUEX_NAME(ByteLoader)* byte_loader = QUEX_NAME(ByteLoader_stream_new)(&my_stream);

然后将其传递给构造函数(或 placement new):

MyLexer lexer(byte_loader, /* converter */0);

如果您想处理转换后的内容,您可能必须 创建一个转换器并将其作为第二个参数传递。就这样 完整的代码变成这样:

QUEX_NAME(ByteLoader)* byte_loader = QUEX_NAME(ByteLoader_stream_new)(&my_stream);
QUEX_NAME(Converter)*  converter   = QUEX_NAME(Converter_IConv_new)("UTF-8", NULL);
MyLexer                lexer(byte_loader, converter);

这种类型的词法分析器结构允许最大 的灵 active 。对 C-Standard 文件接口(interface)没有限制, 输入可以来自任何来源,例如套接字或串行线。和 传入数据的转换是在幕后完成的,而 与缓冲区内容的同步完全由 词法分析器的引擎。

请注意,构造函数将 ByteLoader 和 Converter 的所有权 转移给了词法分析器。 无需手动删除它们

ByteLoader-s 和 Converter-s 的 header 和实现是 位于

$QUEX_PATH/quex/code_base/buffer/bytes/...

$QUEX_PATH/quex/code_base/buffer/lexatoms/converter/...

如果您有新类型的 ByteLoader-s 或 Converter-s ,请将它们提交为 一个补丁。一旦他们被测试,他们很可能会进入 代码库。

关于c++ - 将词法分析器移植到较新版本的 Quex 时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43846255/

相关文章:

c++ - 私有(private)继承和构造函数

c++ - 在 C++ 中,我希望我的接口(interface) .h 说 int GetSomeInt() const;.... 但实际上方法 *DOES* 更新 "this"。

c++ - C++ 中的 2D 形状匹配

c++ - 二维数组Qt,初始化和使用

c++ - std::thread 如何存储通过其构造函数传递的可变参数?

c++ - 使用分词器时出现 QUEX_PATH 问题

c++ - 将词法分析器字符串累加器移植到新版本的 Quex 时出现问题