C++ 将flex 2.5.4a迁移到2.6(词法分析器生成器)
我有一个使用flex生成cc代码的文件。当我使用版本2.5.4a-10时,代码按预期工作 如果我使用较新的版本2.5.37,甚至更新的版本(如2.6),生成的代码似乎不会分配任何内容。它使用了一些用nullptr定义的指针,并导致崩溃 我认为在这两个版本之间,语法发生了变化。我发现Debian/Ubuntu有一个名为flex的软件包也很奇怪 flex是一种生成扫描仪的工具:识别词法的程序 文本中的模式。这是旧的2.5.4a版本,不再是 正在开发中。你通常应该选择flex,除非你有 与现代flex不兼容的旧lexer文件C++ 将flex 2.5.4a迁移到2.6(词法分析器生成器),c++,c,flex-lexer,lexical,C++,C,Flex Lexer,Lexical,我有一个使用flex生成cc代码的文件。当我使用版本2.5.4a-10时,代码按预期工作 如果我使用较新的版本2.5.37,甚至更新的版本(如2.6),生成的代码似乎不会分配任何内容。它使用了一些用nullptr定义的指针,并导致崩溃 我认为在这两个版本之间,语法发生了变化。我发现Debian/Ubuntu有一个名为flex的软件包也很奇怪 flex是一种生成扫描仪的工具:识别词法的程序 文本中的模式。这是旧的2.5.4a版本,不再是 正在开发中。你通常应该选择flex,除非你有 与现代flex
本产品包括加利福尼亚大学开发的软件, 伯克利及其贡献者。上游源代码可在以下位置找到:
http://flex.sourceforge.net/
(编者按:Flex已移动到,但v2.5.4a不存在。)
这个版本对我怀疑的其他人来说似乎是个大问题。说到我的问题:
有什么手册或指南,我需要做的是,为了使代码能够生成一些在Flex?/P>的最新版本中工作的C++代码? 编辑:下面是我从更大的东西中选取的简单示例:
int num_lines = 0, num_chars = 0;
%%
\n ++num_lines; ++num_chars;
. ++num_chars;
%%
int main()
{
yy_init=1;
yylex();
printf( "# of lines = %d, # of chars = %d\n",
num_lines, num_chars );
return 0;
}
使用
flex file.l
对其进行调整,并使用gcc lex.yy.c-lfl
构建它。现在,如果您使用的是2.5.4版,它就可以工作了。对于更高版本,它的翻译和编译都很好,但是当你运行程序时,你会遇到分段错误。我自己发现了这个问题。可以在旧版本中显式设置变量yy_init
。在较新的版本中,这是不允许的。我不确定这是否是有意的,也许有人可以解释为什么会观察到这种行为。我觉得有点奇怪
如果有人有类似的问题,您可能需要查看
yy_init
变量。除此之外,我没有任何问题。我自己发现了问题。可以在旧版本中显式设置变量yy_init
。在较新的版本中,这是不允许的。我不确定这是否是有意的,也许有人可以解释为什么会观察到这种行为。我觉得有点奇怪
如果有人有类似的问题,您可能需要查看
yy_init
变量。除此之外,我没有任何问题。如果您能提供一些您遇到的问题的实际细节,那将非常有用。显然,a将是理想的。是的,我知道,让我们试着上传一个。这个例子并不是那么小。如果你能提供一些关于你正在经历的问题的实际细节,那会很有帮助。显然,a将是理想的。是的,我知道,让我们试着上传一个。这个例子并不是那么小,这个变量是没有文档的,所以改变它是个坏主意。看起来将其设置为1将阻止flex初始化自身,那么为什么要这样做呢?嗨,jay,我从来都不想做这样的事情。我得到的密码大约有20年了。它将该变量定义为1。我需要问那个通过我的人,他为什么决定设置它。不管怎样,我已经决定把它改成可重入扫描仪。我们需要它,因为我们希望能够扫描多个流。我认为在这种情况下,改进对扫描仪状态的控制是一种更好的方法。该变量没有文档记录,因此更改它是一个坏主意。看起来将其设置为1将阻止flex初始化自身,那么为什么要这样做呢?嗨,jay,我从来都不想做这样的事情。我得到的密码大约有20年了。它将该变量定义为1。我需要问那个通过我的人,他为什么决定设置它。不管怎样,我已经决定把它改成可重入扫描仪。我们需要它,因为我们希望能够扫描多个流。我认为对于这种情况和改进对扫描仪状态的控制,这是一种更好的方法。