1

我曾经向我的 Quex 驱动的词法分析器提供一个std::basic_stringstream<char>发送到构造函数的信息,如下所示:

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

这工作 using Quex 0.64.8,但似乎 API 从那时起发生了变化,因为它似乎不适用于 version 0.67.4

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

此致,

帕特里克·J

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

4

1 回答 1

0

这实际上是两个问题。假设您编辑了文本,因此这个问题与新的构造函数 API 有关。对于累加器,请发布一个单独的问题。

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

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

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

然后将其传递给构造函数(或放置新):

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);

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

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

ByteLoader-s 和 Converter-s 的标头和实现位于

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

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

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

于 2017-05-08T12:27:35.040 回答