所有
我对antlr相当新,所以解决方案可能是微不足道的,但解决方案让我失望了。 (我对解析器和扫描仪有很多经验,而不是ANTLR生成的。)
我正在为32位(National Series 32000)CPU重新编码汇编程序。它最初是使用C ++ /(f)lex / yacc / bison编码的,但是被移植到Java8。我的部分要求是我生成一个包含地址,生成代码,源代码等的列表文件。
我有一个对象可以包含我需要的所有信息(例如源代码行,生成的代码等),我想将所述对象与每个令牌相关联。我的问题是:
1)捕获源代码行的最佳方法是什么?我考虑使用词法分析器(+模式)来捕获源代码行,但是没有办法捕获源代码行并拒绝(或推回)输入以使其可用于后续处理。我知道CharStream一下子缓冲了它的整个输入流。将CharStream子类化为构造我的容器并捕获源代码行内容是一种合适的方法吗?
2)如何将我的容器对象与每个令牌相关联?我怀疑子类化Token并创建自定义TokenFactory是必需的,但我不确定如何将自定义CharStream连接到Token。 (这就是为什么我喜欢使用词法分析器捕获单个行的概念。)
感谢您的帮助!
答案 0 :(得分:1)
无需手动捕获位置信息。每个令牌(通常是CommonToken的一个实例都带有line和char offset值,还有一些像令牌索引(令牌流中令牌的索引)和开始/停止索引,它们为您提供原始文本输入中的字符索引。
生成的解析树还包含对构成规则上下文或终端节点的标记或符号的引用。因此,您可以随时查找位置,始终连接到特定的解析器规则。