lisp - 如何使用 Lisp 表达 BNF?

标签 lisp racket grammar bnf

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

A -> a A b

我尝试使用 lisp 的 define 函数来定义该语法。然而,当我使用定义函数时,Lisp 要求我指定我定义的函数的主体。

   #lang racket
   (define (A a A b B)())

但是如果我用类似的东西填充 body :

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

关于lisp - 如何使用 Lisp 表达 BNF?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30075314/

相关文章:

lisp - 一个复杂的 Lisp 问题

haskell - 将(可能是一元的)函数递归地应用于自身

Java LR 或 LL 解析

c - 为解析器编写规则

lisp - 和运算符 Lisp

lisp - 为什么 parenscript 函数更改为全部小写?

lisp - 如何高效读写Lisp代码?

使用记忆化计算组合 nCk 的方案

for-loop - 方案/ Racket 中的双括号是什么?

计划 - 二十一点计划 (SICP)/学习编程