【问题】android中调试antlr时执行xxx_return去获得parserResult时出错

【问题】

已经使用antlrworks,调试完毕antlr的代码。

现将对应的lexer和parser的java文件导入到了android项目中,

去写了测试代码去调试对应的输入文件。

但是结果调试时,执行到关键的代码处:

HartEddlParser.startParse_return parserResult = parser.startParse();

结果无法正常执行,直接出错。

【解决过程】

1.去看出错信息,发现到这行:

04-11 14:54:55.118: W/System.err(3233):     at com.mm.antlrv3demo.HartEddlParser.<init>(HartEddlParser.java:164)

at com.mm.antlrv3demo.HartEddlParser

双击后,跳到对应的源码部分:

go into related code DebugEventSocketProxy

	public HartEddlParser(TokenStream input) {
		this(input, DebugEventSocketProxy.DEFAULT_DEBUGGER_PORT, new RecognizerSharedState());
	}

然后发现对应的DEFAULT_DEBUGGER_PORT是49100:

DEFAULT_DEBUGGER_PORT is 49100

然后想到了,

我当前,在别处,正在使用antlrworks,调试antlr代码:

using debugertab debug antlr

所以,应该是正常使用49100端口,所以才会导致此处出现端口无法访问的错误吧。

所以,去把antlrworks的调试先停止掉:

stop antlrworks debug

然后再去重新调试android中的antlr,看看是否还会出错。

结果错误依旧。

2.再去关闭掉当前的antlrworks,再去试试,结果问题依旧。

3.实在搞不懂。

怀疑,会不会是由于,当前win7已经执行了update,但是没有及时重启而导致的?

所以现在去重启win7,回来再试试。

结果错误依旧。

4.参考:

socket failed :EACCES (Permission denied)

去添加了对应的

<uses-permission android:name="android.permission.INTERNET"/>

然后再试试,结果错的更狠了,都无法运行到我打了断点的那行了。

5.最后,找到根本原因了:

antlrworks中,通过Generate Code的话:

generate generate code

生成的代码中,是没有debug相关的代码的,

而如果是经过了antlrworks的debug:

antlrworks to run debug

期间,会看到有个compiling:

can see compiling while debug

然后才会跳出调试对话框:

antlrworks debug window

然后去调试:

use antlrworks to do debug

结果就是,其调试之前compiling出来的代码,比Generate Code生成的代码相比,会添加很多debug相关的代码,

对比如下:

added many debug related code

而此处,结果就是,导致了上述无法正常执行对应的:

HartEddlParser.startParse_return parserResult = parser.startParse();

导致出错。

 

【总结】

如果想要把antlrworks中生成的代码,加入到android项目中使用。

则要使用antlrworks->Generate->Generate Code所生成的代码;

而不能用antlrworks->Run->Debug

所生成的代码,其会在上述Generate Code所生成的代码的基础上,加上很多用于debug调试方面的代码。

其会导致,后续在android项目中调用:

yourParser.yourMainEntryRule_return parserResult = parser.yourMainEntryRule();

会出错,无法正常执行代码。



发表评论

电子邮件地址不会被公开。 必填项已用*标注

无觅相关文章插件,快速提升流量