这是我询问How to encode FIRST & FOLLOW sets inside a compiler的上一个问题的后续步骤,但这一个更多地是关于我的程序的设计。将FIRST和FOLLOW集合编码为递归下降解析器
我正在通过编写递归下降解析器来实现我的编译器的语法分析阶段。我需要能够利用FIRST和FOLLOW集合,以便更有效地处理源程序语法中的错误。我已经为我的所有非终端计算了FIRST和FOLLOW,但在决定将它们逻辑放置在我的程序中的位置以及最佳数据结构是什么时,无法做到这一点。
注:所有的代码是伪代码
选项1)使用的地图,并通过他们的名字所有非终端映射到包含它们的前两分集和FOLLOW集:
class ParseConstants
Map firstAndFollowMap = #create a map .....
firstAndFollowMap.put("<program>", FIRST_SET, FOLLOW_SET)
end
这似乎是一个可行的选择,但我的解析器里面我会那么需要几分丑陋这样的代码来获取第一和FOLLOW,并传递给误差函数:
#processes the <program> non-terminal
def program
List list = firstAndFollowMap.get("<program>")
Set FIRST = list.get(0)
Set FOLLOW = list.get(1)
error(current_symbol, FOLLOW)
end
选项2)c eate一类每一个非终端和具有第一和FOLLOW属性:
class Program
FIRST = .....
FOLLOW = ....
end
这会导致代码看起来更好一点:
#processes the <program> non-terminal
def program
error(current_symbol, Program.FOLLOW)
end
这是我想了两个选项,我我很想听听任何其他关于如何编码这两组的方法的建议,以及对我发布的两种方式的任何批评和补充都会有所帮助。 感谢
我还张贴了这个问题在这里:http://www.coderanch.com/t/570697/java/java/Encode-FIRST-FOLLOW-sets-recursive
感谢您提供的所有信息,这非常有帮助。 – 2012-03-18 19:38:46
没问题。实际上,我现在正在为我的编译器开发更多功能,因此它已经成为我的头等大事了 – Shahbaz 2012-03-18 21:19:59