gpt4 book ai didi

c++ - 柔性 : use of yymore()

转载 作者:行者123 更新时间:2023-11-28 00:19:30 35 4
gpt4 key购买 nike

这是 .lex 文件的片段:

    /* Empty line just with the newline character signs end of
the title block
*/
<title>^[\n]{1} {
yymore(); ECHO;
// std::cout << "Text: " << yytext << std::endl;

// ... do something with yytext

BEGIN(INITIAL);

}

/* Reads everything up to the end of line. */
<title>.+ {
ECHO; yymore();
//std::cout << "yymore: " << yytext << std::endl;
}

/* Every title starts with # and text follows. */
#[\t\ ] {

// ... prepare for html output

BEGIN(title);
}

目标是阅读“#”后的全文。根据网上教程,yymore()应该将当前 yytext 的内容附加到最后一个。使用 ECHO; yymore();组合 <title>.+部分显示全文。但是删除 ECHO 并使用 cout使 yymore() splinter 的。不附加文本。

此外,我无法在 <title>^[\n]{1} 中获取标题文本部分。我得到的一切都只是“\n”。

我做错了什么?

最佳答案

这不是对 yymore 的准确描述。 yymore 将导致 next token 的 yytext 包含当前 yytext。 (之前的文本已经消失;无法恢复——当然,除非通过调用 yymore() 将其标记为保存)。

我不明白你希望这个开始条件做什么。

假定终止开始条件的模式是:

<title>^[\n]{1}

^ 锚定模式,因此它只会在换行符之后匹配。 (这是一个零长度谓词,因为它在标准的 Posix 正则表达式中。)但是开始条件 title 中的模式不可能满足 ^ 匹配,因为没有模式在该状态下匹配可以匹配以换行符结尾的字符串(. 不匹配换行符,并且 #[\t ] 规则显然以空格或制表符结尾.)

此外,{1} 是完全冗余的(它表示“恰好一次重复”,这是一种身份转换)并且 [\n]\n,所以你可以这样写:

<title>^\n

我的猜测是您没有指定 %option nodefault,所以您让默认匹配静默回显而不显示错误消息。问题在于标准默认匹配规则不调用 yymore(),原因很明显,因此在执行默认操作时累积的匹配会丢失。

还要注意 ECHO 回显 yytext;如果您使用的是 yymore(或 yyless),那么这与“此规则匹配的文本 block ”不同。考虑以下简单的 flex 程序:

%option noyywrap noinput nounput nodefault
%%
. { yymore(); ECHO; putchar('\n'); }
\n

样本运行:

$ flex -o tri.c tri.l
$ gcc -Wall -o tri tri.c -lfl
$ ./tri <<<0123456789
0
01
012
0123
01234
012345
0123456
01234567
012345678
0123456789

关于c++ - 柔性 : use of yymore(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28266985/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com