我正在用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
每个单词,包括标点符号都将匹配,所有空格都将被忽略。现在我希望能够得到字符串中每个匹配的起始位置和长度。在我的标记器类中,我将实现一个getNextToken方法,每个对该方法的调用都会返回一个我喜欢的标记,以获取开始位置、标记长度和当前输入文本(作为字符缓冲区)。我想我可以定义一些函数来在lexer文件中获取这些值(作为一种od回调函数或类似函数)。
有什么办法让它发挥作用吗?
yytext
指向令牌的开头。如果您使用yy_scan_buffer
(请参阅flex手册),那么flex将使用您提供的缓冲区而不复制它,因此yytext
将指向您的缓冲区。
请注意,如果使用yy_scan_buffer
接口,则必须将两个NUL字节放在提供flex的缓冲区的末尾。此外,您还必须自己处理令牌跨越两个输入缓冲区的情况。我不确定flex在直接提供缓冲区的情况下是如何处理跨越输入缓冲区的令牌的,但没有明显的方法可以在保留您提供的输入缓冲区时处理它。