【问题标题】:extend racket syntax for backus-naur-forms扩展 backus-naur-forms 的球拍语法
【发布时间】:2012-11-21 16:48:15
【问题描述】:

我有一套在球拍中实施的推导规则。我们可以假设没有任何 optional ,这意味着没有包含管道的规则(在 BNF 中): ::= |

在球拍中,我有这样的东西:

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

请注意,终结符号以球拍字符串的形式实现,非终结符号以球拍符号的形式实现。现在,我想从另一个包含 backus naur 语法规则的球拍文件中导入此规则:

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

(大写字母 = 非终结符)

因此,我需要扩展球拍语法。我不知道如何处理。你能帮助我吗?它不应该有那么多代码......

【问题讨论】:

    标签: racket bnf


    【解决方案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))))
    

    哎呀!我看到那里有一个错误。没问题,你会想办法的。得跑了……

    【讨论】:

      猜你喜欢
      • 2016-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-26
      • 1970-01-01
      • 2022-01-16
      相关资源
      最近更新 更多