用Clojure愉快的写个小parser(未完待续...)

时间:2022-09-05 16:28:55

1.引言

在微信公众号程序人生上看到一篇文章如何愉快地写个小parser

作者介绍了几种文本处理工具(lex/yacc,clojure下的神器instaparse…)
其中Clojure下的神器instaparse引起我极大的兴趣,原因如下

  • 作者对其评价如下「首先是clojure下的神器instaparse。instaparse是那种如果让你做个parser,不限定语言,那你一定要尝试使用的工具。别的工具一天能做出来的效果,instaparse一小时就能搞定。」很有吸引力吧,简单就是美嘛。

  • 之前接触FP较少,希望借此机会接触一下,练练手。

  • Clojure依托于JVM™,作为一名Java程序员,上手应该比较快。

2.关于函数式编程

函数式程序设计为甚么至关重要
在此不做更多的赘述.

3.Clojure开发环境的配置

安装Leiningen

Leiningen简单来就是Clojure世界中的maven.

lein new helloworld  新建项目helloworld 其中 project.clj类似maven中的pom

Intellij IDEA上安装Cursive Plugin

上Cursive官网上下载Plugin之后本地安装一下,重启一下idea即可.

Clojure HelloWorld

本文并不讨论Clojure的语法细节问题,如果读者对Clojure不是很了解,可以上community-docs查阅相关细节。

4.接下来就让我们愉快的写个小Parser吧(∩_∩)

4.1instaparse简介

instaparse的产品说明

What if context-free grammars were as easy to use as regular expressions?
  • 仅限于解决上下文无关文法
  • 产品的目标是使用上和正则表达式一样简单.
Category Notations Example
Rule : := ::= = S = A
End of rule ; . (optional) newline S = A;
Concatenation whitespace or , A B
Alternation ` `
Grouping () (A `
Optional ? [] A? [A]
One or more + A +
Zero or more
    {}
A* {A}
String terminal “” ” ‘a’ “a”
Regex terminal “” #” ‘a’ #”a”
Epsilon Epsilon epsilon EPSILON eps ε “” ” S = ‘a’ S
Comment (* *) (* This is a comment *)

4.2上下文无关文法简介

忘记的同学自行回顾一下
巴科式范式(BNF)

4.3

4.4 do it!

场景一:

场景二:

参考资料:

工程中的编译原理 – Mapfile解析器