【问题】
已经使用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)
双击后,跳到对应的源码部分:
public HartEddlParser(TokenStream input) { this(input, DebugEventSocketProxy.DEFAULT_DEBUGGER_PORT, new RecognizerSharedState()); }
然后发现对应的DEFAULT_DEBUGGER_PORT是49100:
然后想到了,
我当前,在别处,正在使用antlrworks,调试antlr代码:
所以,应该是正常使用49100端口,所以才会导致此处出现端口无法访问的错误吧。
所以,去把antlrworks的调试先停止掉:
然后再去重新调试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的话:
生成的代码中,是没有debug相关的代码的,
而如果是经过了antlrworks的debug:
期间,会看到有个compiling:
然后才会跳出调试对话框:
然后去调试:
结果就是,其调试之前compiling出来的代码,比Generate Code生成的代码相比,会添加很多debug相关的代码,
对比如下:
而此处,结果就是,导致了上述无法正常执行对应的:
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();
会出错,无法正常执行代码。
转载请注明:在路上 » 【问题】android中调试antlr时执行xxx_return去获得parserResult时出错