Scheme 用Lisp编写形式语言解析器

Scheme 用Lisp编写形式语言解析器,scheme,lisp,racket,formal-languages,Scheme,Lisp,Racket,Formal Languages,我的公司正在设计一种新的领域特定的脚本语言;我必须实现一个解析器,将我们全新的编程语言转换为通用脚本语言,以便能够执行它 我通常是通过Bison和Flex工具来生成翻译程序的C/C++代码 我找到了其他工具,适用于大多数主流编程语言,但没有一种适用于Lisp 难道Lisp不曾被用于这一点吗?使用Lisp编写解析器的常用方法是什么 注意:对我来说,任何可以帮助我的Lisp实现/方言都可以,我没有任何偏好。要涵盖其中的部分: 人们经常编写解析器,有很多方法可以做到这一点: 手动编写递归下降解析器

我的公司正在设计一种新的领域特定的脚本语言;我必须实现一个解析器,将我们全新的编程语言转换为通用脚本语言,以便能够执行它

我通常是通过
Bison
Flex
工具来生成翻译程序的
C/C++
代码

我找到了其他工具,适用于大多数主流编程语言,但没有一种适用于
Lisp

难道Lisp不曾被用于这一点吗?使用
Lisp
编写解析器的常用方法是什么

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

要涵盖其中的部分:

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

  • 手动编写递归下降解析器
  • 使用Racket中的库,这是lex/yacc样式
  • 使用AST生成器,可以编写BNF
  • Use,一个类似于Haskell的Parsec的一元解析器组合器库
  • 我可能忽略了至少六个其他选项(例如,我知道球拍至少有一个PEG风格的lib)
在公共Lisp中,通常的做法是……在Lisp中执行

许多特定于领域的语言(众所周知,Lisp专门用于此目的!)都是使用宏工具作为Lisp本身的扩展编写的。好处是,编写DSL很简单。缺点是,它们往往“看起来像”口齿不清

通用Lisp标准中DSL的一些示例包括
循环
宏自己的子语言和
格式
说明符的子语言

由于Lisp的s-expression表示法名义上是抽象语法树的一种书面形式,因此这是避免使用自己的词法分析器或解析器的一种方法;您只需使用
读取

总而言之,您可以使用一些常见的包,这些包可以在
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>                                   
CL-USER>(ql:system-apropos“parse”)
#                                                                                                                                                                                                   
#                                                                                                                                                                                         
#                                                                                                                                                                                                     
#                                                                                                                                                                                                 
#                                                                                                                                                                                           
#                                                                                                                                                                                                            
#                                                                                                                                                                                                        
#                                                                                                                                                                                                        
#                                                                                                                                                                                         
#                                                                                                                                                                     
#                                                                                                                                                                          
#                                                                                                                                                                                                           
#                                                                                                                                                                                                                       
#                                                                                                                                                                                                           
#                                                                                                                                                                                                      
#                                                                                                                                                                                                             
#                                                                                                                                                                                     
#                                                                                                                                                                                                         
#