1

ラケットに実装された派生ルールのセットがあります。オプションの がないと仮定できます。つまり、(BNF で) パイプを含むルールはありません。 ::= |

ラケットでは、次のようなものがあります。

(define *rules*
  '((S . ("b" "a"))
    (B . ("a"))
    (C . (S B))))

終端記号はラケット ストリングの形式で実装され、非終端記号はラケット シンボルの形式で実装されることに注意してください。ここで、backus naur 構文のルールを含む別のラケット ファイルからこのルールをインポートしたいと思います。

S ::= ba
B ::= a
C ::= SB

(大文字 = 非終端記号)

したがって、ラケットの構文を拡張する必要があります。私はそれを処理する方法がわかりません。手伝って頂けますか?それほど多くのコードではないはずです...

4

1 に答える 1

1

BNF 構文を使用して記述されたファイルを解析し、s 式バージョンを生成しようとしていると思います。そうですか?

もしそうなら、それは難しいことではありません。特に、あなたの質問が暗示する形式は、すべての行が次の形式であるということです

<NT> :: = [<NT>|<T>]*

...次のように分解できます。

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

おっとっと!そこにバグがあります。問題ありません、あなたはそれを理解するでしょう。走らなきゃ....

于 2012-11-21T23:35:11.843 に答える