用Lisp编写正式的语言解析器

时间:2014-01-17 12:19:15

标签: scheme lisp racket formal-languages

我的公司正在设计一种新的特定于域的脚本语言;我必须实现一个解析器,将我们全新的编程语言翻译成一种通用的脚本语言,以便能够实现它。

我这样做的常用方法是使用生成翻译器Bison代码的FlexC/C++工具。

我找到了大多数主流编程语言的其他工具,但Lisp没有。

是否曾使用Lisp?使用Lisp编写解析器的常用方法是什么?

注意:对我来说,任何可能有帮助的Lisp实现/方言都没问题,我没有任何偏好。

3 个答案:

答案 0 :(得分:14)

涵盖Racket部分:

人们经常编写解析器,有很多方法可以这样做:

  • 手动编写递归下降解析器。
  • 使用Racket中的parser-tools库,即lex / yacc样式。
  • 使用Ragg,一个允许您编写BNF的AST生成器生成器。
  • 使用Parsack,一个类似于Haskell的Parsec的monadic解析器组合库。
  • 我可能忽略了至少六个其他选项(例如我知道至少有一个针对Racket的PEG样式库)。

答案 1 :(得分:10)

嗯,“在Common Lisp中执行此操作的常用方法是......在Lisp中执行此操作。

许多特定于域的语言(和Lisp非常出名,专门用于此目的!)只是使用宏工具编写为Lisp本身的扩展。好处是,写一个DSL是微不足道的。缺点是,它们往往“看起来像”lisp。

Common Lisp标准中的DSL的一些示例包括LOOP宏自己的子语言和FORMAT说明符的子语言。

由于Lisp的s表达式表示法名义上是抽象语法树的书面形式,因此它是避免使用自己的词法分析器或解析器的一种方法;你可以使用READ

尽管如此,您可以使用GRAYLEXCL-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中找到