如何使用 Lisp 表达 BNF?
How to express BNF using Lisp?
我想用 Lisp 表达一个用 BNF 写的语法规则。
这是规则。需要注意的是,non-terminals用大写字母表示,终端用小写字母表示:
A -> a A b
我尝试使用 lisp 的 define 函数来定义该语法。但是,当我使用定义函数时,Lisp 要求我指定我定义的函数的 body。
#lang racket
(define (A a A b B)())
但是,如果我用以下内容填充 body:
#lang racket
(define (A a A b B)("Hello World"))
我没有收到任何错误。
我的问题是我是否应该在 body 中指定一些有助于我定义其他语法规则的内容,例如我是否应该在 A
的 body 中指定非终结符 B
的规则?
如果 define ()
函数不适合使用,还有哪些其他函数可以帮助我使用 Lisp 表示 BNF 语法?
也许我在这里误解了什么,但在我看来,您想将 EBNF 表示为一段数据。如果是这种情况,您可以简单地使用 s 表达式。
也许是这样的?
#lang racket
(define my-ebnf
`((A (a A b))
(Q (z z Q z))
(T (A p Q))))
我建议看一下这个经典的递归下降解析器:
http://www.cs.indiana.edu/eip/compile/scan-numlist.ss
该示例包含一个用于小型 Scheme 子集的词法分析器。
它在 1996 年被用于他的 Scheme 编译器研讨会。
我想用 Lisp 表达一个用 BNF 写的语法规则。 这是规则。需要注意的是,non-terminals用大写字母表示,终端用小写字母表示:
A -> a A b
我尝试使用 lisp 的 define 函数来定义该语法。但是,当我使用定义函数时,Lisp 要求我指定我定义的函数的 body。
#lang racket
(define (A a A b B)())
但是,如果我用以下内容填充 body:
#lang racket
(define (A a A b B)("Hello World"))
我没有收到任何错误。
我的问题是我是否应该在 body 中指定一些有助于我定义其他语法规则的内容,例如我是否应该在 A
的 body 中指定非终结符 B
的规则?
如果 define ()
函数不适合使用,还有哪些其他函数可以帮助我使用 Lisp 表示 BNF 语法?
也许我在这里误解了什么,但在我看来,您想将 EBNF 表示为一段数据。如果是这种情况,您可以简单地使用 s 表达式。
也许是这样的?
#lang racket
(define my-ebnf
`((A (a A b))
(Q (z z Q z))
(T (A p Q))))
我建议看一下这个经典的递归下降解析器:
http://www.cs.indiana.edu/eip/compile/scan-numlist.ss
该示例包含一个用于小型 Scheme 子集的词法分析器。 它在 1996 年被用于他的 Scheme 编译器研讨会。