首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用Lisp编写正式语言解析器

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

Stack Overflow用户
提问于 2014-01-17 12:19:15
回答 3查看 7.2K关注 0票数 9

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

我通常的方法是通过BisonFlex工具生成翻译器的C/C++代码。

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

难道Lisp从来没有被用来做这个吗?用Lisp编写解析器的通常方法是什么?

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-01-17 13:00:55

为了涵盖其中的球拍部分:

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

  • 手动编写递归下降解析器。
  • 使用Racket中的解析器-工具库,这是lex/yacc风格。
  • 使用拉格,一个AST生成器,允许您编写BNF。
  • 使用帕萨克,一种类似于Haskell的Parsec的一元解析器组合器库。
  • 我可能忽略了至少六个其他选项(例如,我知道至少有一个PEG风格的lib用于球拍)。
票数 16
EN

Stack Overflow用户

发布于 2014-01-18 00:44:27

好吧,在公共Lisp中“通常”这样做的方法是…在Lisp做。

许多特定于域的语言(而且Lisp在这方面几乎是非常专业的!)只是使用宏工具作为Lisp本身的扩展编写。好处是,编写DSL是微不足道的。缺点是,他们往往倾向于“看上去”口齿状。

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

由于Lisp的表达式表示法名义上是抽象语法树的书面形式,所以它是避免拥有大量自己的词汇或解析器的一种方法;您可以只使用READ

总之,您可以使用一些常见的包,这些包可以在GRAYLEXCL-LEXER或诸如此类的语言中找到;查看与您的语法相似的其他语言的解析器可能会有所帮助。在Quicklisp中,我看到:

代码语言:javascript
运行
复制
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>                                   
票数 12
EN

Stack Overflow用户

发布于 2015-03-18 20:30:43

在通用lisp中有两种解析非lisp语言的方法。

1)使用可读性。这是一种经典的方法: lisp阅读器算法已经是一个简单的递归-体面的解析器,它支持基于字符的分派。Vacietis做这个这里

2)使用解析库。我可以推荐esrap作为一个很好的实用程序来进行packrat解析,而自鸣得意地作为一个不错的工具进行一元分析。这两个版本都可以在quicklisp中找到。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21185879

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档