扩展backus-naur表单的racket语法
我在racket中实现了一组派生规则。我们可以假设没有任何可选的,这意味着没有包含管道的规则(在BNF中)::=| 在《球拍》中,我得到了这样的东西:扩展backus-naur表单的racket语法,racket,bnf,Racket,Bnf,我在racket中实现了一组派生规则。我们可以假设没有任何可选的,这意味着没有包含管道的规则(在BNF中)::=| 在《球拍》中,我得到了这样的东西: (define *rules* '((S . ("b" "a")) (B . ("a")) (C . (S B)))) #lang racket ;; COPYRIGHT 2012 John B. Clements (clements@brinckerhoff.org) ;; Licensed under the Apac
(define *rules*
'((S . ("b" "a"))
(B . ("a"))
(C . (S B))))
#lang racket
;; COPYRIGHT 2012 John B. Clements (clements@brinckerhoff.org)
;; Licensed under the Apache License, version 2.
;; (You're free to use it, but your source code has to include
;; my authorship.)
(require rackunit)
(define example
(list "S ::= ba"
"B ::= a"
"C ::= SB"))
;; parse a single line:
;; string -> (list/c symbol? (listof (or/c string? symbol?)))
(define (parse-line l)
(match (regexp-match #px"^([A-Z]) ::= ([A-Za-z]*)$")
[(list _ lhs rhses)
(list lhs (map parse-char (string->list rhses)))]))
;; parse a single char:
;; char -> (or/c symbol? string?)
(define (parse-char ch)
.. oops! out of time. You'll have to write this part yourself... )
(check-expect (map parse-line example)
'((S ("b" "a"))
(B ("a"))
(C (S B))))
请注意,终端符号以球拍字符串的形式实现,非终端符号以球拍符号的形式实现。现在,我想从另一个包含backus naur语法规则的racket文件中导入这些规则:
S ::= ba
B ::= a
C ::= SB
(大写字母=非终结符)
因此,我需要扩展racket语法。我不知道该怎么办。你能帮助我吗?它不应该有那么多的代码…我认为您希望解析使用BNF语法编写的文件,并生成一个s表达式版本;是这样吗 如果是这样,那就不难了。特别是,你的问题所暗示的格式是,每一行都是这样的形式
<NT> :: = [<NT>|<T>]*
哎呀!我看到里面有一只虫子。没问题,你会明白的。必须运行…我认为您希望解析使用BNF语法编写的文件,并生成s表达式版本;是这样吗 如果是这样,那就不难了。特别是,你的问题所暗示的格式是,每一行都是这样的形式
<NT> :: = [<NT>|<T>]*
哎呀!我看到里面有一只虫子。没问题,你会明白的。我得走了