首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >扩展backus-naur-forms的球拍语法

扩展backus-naur-forms的球拍语法
EN

Stack Overflow用户
提问于 2012-11-22 00:48:15
回答 1查看 550关注 0票数 1

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

在球拍中,我得到了这样的东西:

代码语言:javascript
运行
复制
(define *rules*
  '((S . ("b" "a"))
    (B . ("a"))
    (C . (S B))))

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

代码语言:javascript
运行
复制
S ::= ba
B ::= a
C ::= SB

(大写字母=非末尾)

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-22 07:35:12

我认为您希望解析一个使用BNF语法编写的文件,并生成一个s表达式版本;对吗?

如果是这样的话,这应该不难。特别是,您的问题所暗示的格式是,每一行都是

代码语言:javascript
运行
复制
<NT> :: = [<NT>|<T>]*

..。你可以像这样把它拆开:

代码语言:javascript
运行
复制
#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))))

糟了!我看到里面有个窃听器。没问题,你会弄明白的。我得走了..。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13498044

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档