c++ - 访问 flex scanner 的内部缓冲区、长度和 token 匹配位置

标签 c++ flex-lexer

我正在编写一个带有 flex 的扫描仪来标记文本。为此,我定义了可以匹配术语、数字、电子邮件等的表达式,实际上是文本中可能出现的所有类型。

我试图找到一种方法来访问包含要解析的字符串、位置(匹配标记的第一个字符)和长度(即 yyleng )的内部扫描器缓冲区。 首先我想我可以用几个变量来处理它并使用 yyleng,将这个值添加到一个变量中,以保持匹配的解析文本中的起始位置。但是,如果两个匹配项之间有一个大的空白,那将不起作用,因为除了 html 标签或 html 实体等其他一些事件之外,这些空白将被忽略。

有什么办法可以解决这个问题吗?

例如,以下字符串:

I am a text,  tokenize   me.
^ ^  ^ ^   ^  ^          ^ ^
0 2  5 7   11 14         25 27   <-- pos in parsed string
0  2 1 4   1  8          2  1    <-- length of token  

每个单词,包括标点符号都会被匹配,所有空格都将被忽略。现在我希望能够获得字符串中每个匹配项的起始位置和长度。在我的 tokenizer 类中,我将实现一个 getNextToken 方法,每次调用该方法都会返回一个 token ,我想获取起始位置、 token 长度和当前输入文本(作为字符缓冲区)。我想我可以定义一些函数来获取词法分析器文件中的这些值(作为一种 od 回调函数等)。

有什么办法可以实现吗?

最佳答案

yytext 指向 token 的开头。如果您使用 yy_scan_buffer(请参阅 flex manual),则 flex 将使用您提供的缓冲区而不复制它,因此 yytext 将指向您的缓冲区。

请注意,如果您使用 yy_scan_buffer 接口(interface),您必须将 两个 NUL 字节放在您给 flex 的缓冲区的末尾。此外,您还必须自己处理 token 跨越两个输入缓冲区的情况。在您直接提供缓冲区的情况下,我不确定 flex 如何处理跨越输入缓冲区的标记,但没有明显的方法可以在保留您提供的输入缓冲区的同时处理它。

关于c++ - 访问 flex scanner 的内部缓冲区、长度和 token 匹配位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14817727/

相关文章:

regex - 用于多行注释的 Unix Flex 正则表达式

c - 具有相同类型的不兼容指针类型

C++ 计算字符串中的数字

c++ - 鼠标悬停时 GLSL 高亮网格

c++ - g++ 寄存器分配

c++ - 如何读取包含汉字的UTF-8编码文件并在控制台正确输出?

cmake - 如何为 flex & bison 编写一个有效的 cmake 文件?

python - 是否可以从 C++ header 中自动包含 CMake + SWIG + Python?

c - 如果文件不存在,Flex Bison 从文件读取会出现段错误

c++ - Flex++ 的常见问题