将词法分析器移植到较新版本的 Quex 时出现问题
Problems porting lexer to newer version of 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。对于蓄能器,
请post一个单独的问题。
新的API for constructor, include_push和reset已经完全
重做以便它可以处理任何类型的输入。关键是
'ByteLoader' 的抽象。 ByteLoader 是为
C-Standard 文件和流,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);
这种类型的词法分析器构造允许最大
的灵活性。 C-Standard 文件接口没有限制,
输入可以来自任何来源,例如套接字或串行线。和
传入数据的转换是在幕后完成的,而
与缓冲区内容的同步完全由
词法分析器的引擎。
注意,构造函数将 ByteLoader 和 Converter 的所有权 转移给了词法分析器。 无需手动删除。
Headers 和 ByteLoader-s 和 Converter-s 的实现是
位于
$QUEX_PATH/quex/code_base/buffer/bytes/...
和
$QUEX_PATH/quex/code_base/buffer/lexatoms/converter/...
如果您有新类型的 ByteLoader-s 或 Converter-s ,请将它们提交为
一个补丁。一旦他们被测试,他们很可能会进入
代码库。
我曾经用 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。对于蓄能器, 请post一个单独的问题。
新的API for constructor, include_push和reset已经完全 重做以便它可以处理任何类型的输入。关键是 'ByteLoader' 的抽象。 ByteLoader 是为 C-Standard 文件和流,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);
这种类型的词法分析器构造允许最大 的灵活性。 C-Standard 文件接口没有限制, 输入可以来自任何来源,例如套接字或串行线。和 传入数据的转换是在幕后完成的,而 与缓冲区内容的同步完全由 词法分析器的引擎。
注意,构造函数将 ByteLoader 和 Converter 的所有权 转移给了词法分析器。 无需手动删除。
Headers 和 ByteLoader-s 和 Converter-s 的实现是 位于
$QUEX_PATH/quex/code_base/buffer/bytes/...
和
$QUEX_PATH/quex/code_base/buffer/lexatoms/converter/...
如果您有新类型的 ByteLoader-s 或 Converter-s ,请将它们提交为 一个补丁。一旦他们被测试,他们很可能会进入 代码库。