如何用Lisp表达BNF?

如何用Lisp表达BNF?,lisp,racket,grammar,bnf,Lisp,Racket,Grammar,Bnf,我想用Lisp表达一个用BNF编写的语法规则。 规则是这样的。需要注意的是,非端子用大写字母表示,端子用小写字母表示: A -> a A b 我尝试使用lisp的define函数来定义语法。但是,当我使用define函数时,Lisp要求我指定我定义的函数体 #lang racket (define (A a A b B)()) 但是如果我用类似的东西填充身体: #lang racket (define (A a A b B)("Hello World")) 我

我想用Lisp表达一个用BNF编写的语法规则。 规则是这样的。需要注意的是,非端子用大写字母表示,端子用小写字母表示:

A -> a A b
我尝试使用lisp的define函数来定义语法。但是,当我使用define函数时,Lisp要求我指定我定义的函数体

   #lang racket
   (define (A a A b B)())
但是如果我用类似的东西填充身体:

   #lang racket
   (define (A a A b B)("Hello World"))
我没有得到任何错误

我这里的问题是,我是否应该在正文中指定一些东西来帮助我定义语法的其他规则,例如,我是否应该在
A
的正文中指定非终结符
B
的规则?
如果该
define()
函数不适合使用,那么还有什么函数可以帮助我使用Lisp表示BNF语法呢?

也许我在这里有些误解,但在我看来,您希望将EBNF表示为一段数据。如果是这种情况,您可以简单地使用s表达式

也许是这样的

#lang racket

(define my-ebnf
  `((A (a A b))
    (Q (z z Q z))
    (T (A p Q))))

我建议看一下这个经典的递归下降解析器:

该示例包括用于小方案子集的lexer。 1996年,他将其用于Scheme编译器研讨会


是否相关?您指的是ragg的哪一部分?我想您可以(a)直接使用它,或者(b)如果您想自己构建它,请查看它的实现以获取想法。谢谢您的回答。这正是我想要达到的。但是,我尝试给提示ebnf,例如a b,因此我可以期望a作为答案,但我得到以下错误:>a b。a:未定义;无法在定义前引用标识符如何检查模式是否属于ebnf usung Lisp?我想对该语言进行处理,例如检查特定公式是否是该语言的一部分?yikes。。。这是一个完全不同的问题。你想写一个回溯解析器吗?你是想自己写还是用现有的?谢谢你对我的理解!没错,我基本上是自己写的。如果我找到一个并修改它,那将非常有帮助。如果没有,我想知道基本的数据结构或要使用的函数以及如何使用它们?