访问flex扫描仪的内部缓冲区,长度和令牌匹配位置

时间:2013-02-11 17:42:41

标签: 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 方法,并且每次调用该方法都会返回一个令牌,我喜欢获取起始位置,令牌长度和当前输入文本(作为char缓冲区)。我以为我可以定义一些函数来在lexer文件中获取这些值(作为一种od回调函数等)。

有没有办法让这项工作?

1 个答案:

答案 0 :(得分:1)

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

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