1

我正在编写一个带有 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方法,并且每次调用该方法都会返回一个我喜欢的标记,以获取开始位置、标记长度和当前输入文本(作为字符缓冲区)。我想我可以定义一些函数来在词法分析器文件中获取这些值(作为一种 od 回调函数等)。

有什么办法可以使这项工作?

4

1 回答 1

1

yytext指向令牌的开头。如果您使用yy_scan_buffer(请参阅flex 手册),那么您 flex 将使用您提供的缓冲区而不复制它,因此yytext将指向您的缓冲区。

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

于 2013-02-11T18:00:41.307 回答