我的公司正在设计一种新的特定于域的脚本语言;我必须实现一个解析器,将我们全新的编程语言翻译成一种通用的脚本语言,以便能够实现它。
我这样做的常用方法是使用生成翻译器Bison
代码的Flex
和C/C++
工具。
我找到了大多数主流编程语言的其他工具,但Lisp
没有。
是否曾使用Lisp
?使用Lisp
编写解析器的常用方法是什么?
注意:对我来说,任何可能有帮助的Lisp
实现/方言都没问题,我没有任何偏好。
答案 0 :(得分:14)
涵盖Racket部分:
人们经常编写解析器,有很多方法可以这样做:
答案 1 :(得分:10)
嗯,“在Common Lisp中执行此操作的常用方法是......在Lisp中执行此操作。
许多特定于域的语言(和Lisp非常出名,专门用于此目的!)只是使用宏工具编写为Lisp本身的扩展。好处是,写一个DSL是微不足道的。缺点是,它们往往“看起来像”lisp。
Common Lisp标准中的DSL的一些示例包括LOOP
宏自己的子语言和FORMAT
说明符的子语言。
由于Lisp的s表达式表示法名义上是抽象语法树的书面形式,因此它是避免使用自己的词法分析器或解析器的一种方法;你可以使用READ
。
尽管如此,您可以使用GRAYLEX
或CL-LEXER
中可能找到的一些常见软件包;使用与您的语法类似的其他语言查看解析器可能会有所帮助。在Quicklisp中,我看到了:
CL-USER> (ql:system-apropos "parse")
#<SYSTEM cl-arff-parser / cl-arff-parser-20130421-git / quicklisp 2013-08-13>
#<SYSTEM cl-date-time-parser / cl-date-time-parser-20130813-git / quicklisp 2013-08-13>
#<SYSTEM cl-html-parse / cl-html-parse-20130813-git / quicklisp 2013-08-13>
#<SYSTEM cl-html5-parser / cl-html5-parser-20130615-git / quicklisp 2013-08-13>
#<SYSTEM cl-html5-parser-tests / cl-html5-parser-20130615-git / quicklisp 2013-08-13>
#<SYSTEM cl-pdf-parser / cl-pdf-20130420-git / quicklisp 2013-08-13>
#<SYSTEM cli-parser / cl-cli-parser-20120305-cvs / quicklisp 2013-08-13>
#<SYSTEM clpython.parser / clpython-20130615-git / quicklisp 2013-08-13>
#<SYSTEM com.gigamonkeys.parser / monkeylib-parser-20120208-git / quicklisp 2013-08-13>
#<SYSTEM com.informatimago.common-lisp.html-parser / com.informatimago-20130813-git / quicklisp 2013-08-13>
#<SYSTEM com.informatimago.common-lisp.parser / com.informatimago-20130813-git / quicklisp 2013-08-13>
#<SYSTEM csv-parser / csv-parser-20111001-git / quicklisp 2013-08-13>
#<SYSTEM fucc-parser / fucc_0.2.1 / quicklisp 2013-08-13>
#<SYSTEM http-parse / http-parse-20130615-git / quicklisp 2013-08-13>
#<SYSTEM http-parse-test / http-parse-20130615-git / quicklisp 2013-08-13>
#<SYSTEM js-parser / js-parser-20120909-git / quicklisp 2013-08-13>
#<SYSTEM parse-declarations-1.0 / parse-declarations-20101006-darcs / quicklisp 2013-08-13>
#<SYSTEM parse-float / parse-float-20121125-git / quicklisp 2013-08-13>
#<SYSTEM parse-float-tests / parse-float-20121125-git / quicklisp 2013-08-13>
#<SYSTEM parse-js / parse-js-20120305-git / quicklisp 2013-08-13>
#<SYSTEM parse-number / parse-number-1.3 / quicklisp 2013-08-13>
#<SYSTEM parse-number-range / parse-number-range-1.0 / quicklisp 2013-08-13>
#<SYSTEM parse-number-tests / parse-number-1.3 / quicklisp 2013-08-13>
#<SYSTEM parse-rgb / cl-tcod-20130615-hg / quicklisp 2013-08-13>
#<SYSTEM parseltongue / parseltongue-20130312-git / quicklisp 2013-08-13>
#<SYSTEM parser-combinators / cl-parser-combinators-20121125-git / quicklisp 2013-08-13>
#<SYSTEM parser-combinators-cl-ppcre / cl-parser-combinators-20121125-git / quicklisp 2013-08-13>
#<SYSTEM parser-combinators-tests / cl-parser-combinators-20121125-git / quicklisp 2013-08-13>
#<SYSTEM py-configparser / py-configparser-20101006-svn / quicklisp 2013-08-13>
答案 2 :(得分:3)
有两种方法可以解析common-lisp中的非lispy语言。
1)使用读表。这是经典的方法:lisp阅读器算法已经是一个简单的递归式解析器,它支持基于字符的调度。 Vacietis这样做here
2)使用解析库。我可以推荐esrap作为一个很好的实用程序来进行packrat解析,并且自鸣得意是一个体面的进行monadic解析。两者都可以在quicklisp中找到