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!
场景一:
场景二:
参考资料: