面向Java开发人员的Scala指南 - 构建计算器,第2部分 - 编程入门网
解析器的 parseAll 方法不会返回我们的 case 类 Number(这是有道理的,因为我们没有在解析器中建立 case 类与解析器的产生规则之间的关系);它也没有返回一个文本标记或整数的集合。
相反,解析器返回一个 Parsers.ParseResult,这是一个 Parsers.Success 实例(其中有我们想要的结果);或者一个 Parsers.NoSuccess、Parsers.Failure 或 Parsers.Error(后三者的性质是一样的:解析由于某种原因未能正常完成)。 假设这是一次成功的解析,要得到实际结果,必须通过 ParseResult 上的 get 方法来提取结果。这意味着必须稍微调整 Calc.parse 方法,以便通过测试。如清单 8 所示: 清单 8. 从 BNF 到 parsec
成功了!真的吗? 对不起,还没有成功。运行测试表明,解析器的结果仍不是我前面创建的 AST 类型(expr 和它的亲属),而是由 List 和 String 等组成的一种形式。虽然可以将这些结果解析成 expr 实例并对其进行解释,但是肯定还有另外一种方法。 确实有另外一种方法。为了理解这种方法的工作原理,您将需要研究一下解析器组合子是如何产生非 “标准” 的元素的(即不是 String 和 List)。用适当的术语来说就是解析器如何才能产生一个定制的元素(在这里,就是 AST 对象)。这个主题下一次再讨论。 在下一期中,我将和您一起探讨解析器组合子实现的基础,并展示如何将文本片段解析成一个 AST,以便进行求值(然后进行编译)。 结束语 显然,我们还没有结束(解析工作还没有完成),但是现在有了基本的解析器语义,接下来只需通过扩展解析器产生元素来生成 AST 元素。 对于那些想领先一步的读者,可以查看 ScalaDocs 中描述的 ^^ 方法,或者阅读 Programming in Scala 中关于解析器组合子的小节;但是,在此提醒一下,这门语言比这些参考资料中给出的例子要复杂一些。 当然,您可以只与 String 和 List 打交道,而忽略 AST 部分,拆开返回的 String 和 List,并重新将它们解析成 AST 元素。但是,解析器组合子库已经包含很多这样的内容,没有必要再重复一遍。 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |