我的公司正在设计一种新的特定于领域的脚本语言;我必须实现一个解析器,将我们全新的编程语言转换成一种通用的脚本语言,以便能够实现它。
我通常的方法是通过Bison
和Flex
工具生成翻译器的C/C++
代码。
我为大多数主流编程语言找到了其他工具,但没有一个用于Lisp
。
难道Lisp
从来没有被用来做这个吗?用Lisp
编写解析器的通常方法是什么?
注意:对我来说,任何可能有帮助的Lisp
实现/方言都可以,我没有任何偏好。
发布于 2014-01-17 13:00:55
为了涵盖其中的球拍部分:
人们经常编写解析器,有很多方法可以这样做:
发布于 2014-01-18 00:44:27
好吧,在公共Lisp中“通常”这样做的方法是…在Lisp做。
许多特定于域的语言(而且Lisp在这方面几乎是非常专业的!)只是使用宏工具作为Lisp本身的扩展编写。好处是,编写DSL是微不足道的。缺点是,他们往往倾向于“看上去”口齿状。
通用Lisp标准中DSL的一些例子包括LOOP
宏自己的子语言和FORMAT
说明符的子语言。
由于Lisp的表达式表示法名义上是抽象语法树的书面形式,所以它是避免拥有大量自己的词汇或解析器的一种方法;您可以只使用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>
发布于 2015-03-18 20:30:43
在通用lisp中有两种解析非lisp语言的方法。
1)使用可读性。这是一种经典的方法: lisp阅读器算法已经是一个简单的递归-体面的解析器,它支持基于字符的分派。Vacietis做这个这里
2)使用解析库。我可以推荐esrap作为一个很好的实用程序来进行packrat解析,而自鸣得意地作为一个不错的工具进行一元分析。这两个版本都可以在quicklisp中找到。
https://stackoverflow.com/questions/21185879
复制相似问题