2011-08-15 56 views
2

我一直在用写入的lex解析器遇到段错误问题。因此,在构建我的程序时,我已经在调试中添加了-d到Makefile。 这是我从它得到的输出。Lex解析器:(缓冲区或NUL结束)段错误

--accepting rule at line 180 ("bxz") 
--accepting rule at line 61 (" ") 
--accepting rule at line 180 ("e") 
--accepting rule at line 68 (" 
") 
--accepting rule at line 180 ("0L") 
--accepting rule at line 193 ("!") 
--accepting rule at line 68 (" 
") 
--accepting rule at line 180 ("0x") 
--accepting rule at line 193 (""") 
--accepting rule at line 68 (" 
") 
--(end of buffer or a NUL) 
Segmentation fault 

当我通过调试工具运行此,我发现,在错误发生的lex.yy.c在yy_get_next_buffer():1324,其是从我的手工编写的文件法自动生成的C文件。我该如何解决这个问题? 在此先感谢。

+2

这个错误不太可能出现在lex码。因此,这听起来像是你正在注销缓冲区的结尾或以其他方式错误地滥用内存。 Valgrind可能有助于发现记忆错误。 –

+0

尝试在最后一个符号字符串之后放置一个换行符。这可能是因为你的解析器试图在最后一个符号后面找到一些终止字符。 –

+1

您可能以某种方式损坏了flex的内部缓冲区指针,通过注销数组的末尾或某些类似的东西。如果您查看崩溃的lex代码,则可能可以将数据断点放在数据结构中,该数据结构包含错误的数据并确定谁在修改它 –

回答

0

(我将此问题标记为 “不可再生”,however it timed-out/aged awayIt has been answered in the comments。)

@LokiAstari写道:

这是不太可能的错误是在lex代码。因此,这听起来像是你正在注销缓冲区的结尾或以其他方式错误地滥用内存。 Valgrind的可能找到内存错误

@AK帮助写道:

尝试把一个换行符你最后tokenstring后。这可能是因为你的解析器试图在最后一个符号后面找到一些终止字符。

@ChrisDodd写道:

你可能已经损坏,弯曲的内部缓冲区指针不知何故,被注销的数组或一些这样的结尾。如果您查看崩溃的lex代码,则可能可以将数据断点放在数据结构上,并找出错误数据并确定谁在修改它