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的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”)
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#