2017-04-12 69 views
0

我目前正在尝试实现以文本电子表格作为输入(每个“单元”由选项卡分隔)的Antlr v4语法。语法支持引用其他单元格,包括在算术表达式中使用的引用。输出与输入相同,但所有表达式都已完成,每个引用都被引用的单元格的整数值替换。Antlr:引用尚未解析的数据

例输入:

1 9 5 
    4 3 A3 
    =A2+C3 6 

输出:

1 9 5 
    4 3 5 
    15 

我不确定如何实现我的Java应用程序分析器。由于单元格可能包含尚未分析过的单元格的引用,因此语法必须在计算表达式之前完成分析单元格。根据我的理解,语法访问者可以在解析期间返回值,但无法评估包含对尚未解析的单元格的引用的表达式。

解决此问题的最佳方法是什么?我能够确定的唯一解决方案是将语法分成两个更小的语法,一个解析单元格,另一个解析单元格内的表达式。但是,我宁愿保持简单,只需一个解析过程。

在一句话中,在Antlr4中,处理尚未解析数据的引用的最佳方法是什么?

回答

3

在分析运行期间不需要评估表达式。分两步完成整个过程:首先解析输入以获取分析树,然后使用访问者对其进行评估。在第一步之后,所有的单元都被分析到分析树中,因此可以在评估步骤中解析。

+0

+1恕我直言,使用自己的模型进行评估总是一个好主意。而不是由antlr生成的* Context对象。 – Yevgeniy

+0

我第一次看这个答案时误解了这个答案。在Antlr中究竟如何执行评估步骤?根据我的理解,访问者进行深度优先遍历。我需要的是细胞第一个宽度,然后深入细胞内的表达式 – bgregor

+0

如果您需要不同的步行策略,然后创建您自己的访客类。 AbstractParseTreeVisitor中的所有内容都可以被覆盖。实现'visitChildren()'方法的自己的变体。 –