我正在编写一个解析器,并且在我的代码中使用各种方法,我的代码与此类似:
if @sym.type == TokenType::IDENT_TOKEN
next_token()
if @sym.type == TokenType::EQUALS_TOKEN
next_token()
if @sym.type == TokenType::NUMERAL_TOKEN
next_token()
const_a(keys | ConstList.follow)
else
error(keys | ConstA.first)
end
else
error(keys | ConstA.first)
end
else
error(keys | ConstA.first)
end
这在我看来很难阅读,看起来非常混乱,根本不是惯用的Ruby代码。是否有某种方法可以将其压缩并减少混乱?
任何帮助都将不胜感激。
答案 0 :(得分:2)
如果应用状态机模式,您可能会极大地清理它。它不仅更容易阅读,而且您可以使用正确的工具生成通过解析器的流程图。
这就像Ragel这样的工具构建解析器的方式。
答案 1 :(得分:2)
好吧,您可以通过在成功解析后执行error
或next
然后陷入单个错误,将所有return
方法调用合并为一个调用。
我认为在编写递归下降解析器时你应该接受一定数量的代码爆炸。这只是他们的样子。
您可以include
一些常量定义模块来摆脱范围限定符。