-1

我正在开发一个 PL 逻辑解析器,我需要确保输入没有空格或均匀间隔。我认为删除空格会更容易。所以我正在编写一个从输入中删除空格的函数。

到目前为止,我有:

;sample input
(define KB&!alpha
  '((Girl)
    (~ Boy)
    (~~Boy)
    ( ~(FirstGrade ^ ~ ~ Girl))
    (Boy / Child)))

(define formatted null)

;formatting function
(define (Format_Spaces KB&!alpha)
  (for/list ((item KB&!alpha))
    (cond 
      ((list? item)(Format_Spaces item))
      ((not (eq? item " "))(set! formatted (append formatted (list item))))
      ((eq? item " ")(Format_Spaces (cdr KB&!alpha)))
    )
  )
)

但这显然给了我错误的输出。

不仅空间仍然存在,而且输出是输入的奇怪组合。有人可以帮我解决这个问题吗?

我想得到这样的东西:

'((FirstGrade)
    (FirstGrade=>Child)
    (Child^Male=>Boy)
    (Kindergarten=>Child)
    (Child^Female=>Girl)
    (Female)))

谢谢阅读。

编辑:我正在尝试使输入格式统一。在新的示例输入中,(~ Boy) 被解析为 2 个符号,(~~Boy) 被解析为 1 个符号,(~ ~ Girl) 被解析为 3 个。我认为这将很难解析。尤其是符号/运算符/空格的不同变体。(即“Child^”是被解析为“Child”、“^”还是“Child^”是一个完整的符号?)

4

1 回答 1

3

重新编辑:

根据您在下面所做的评论,在我看来您实际上将在 Racket 中编写此算法。

在那种情况下,我有一个简单的处方给你:不要做任何事。特别是,您的输入当前根本不包含任何空格。您看到的空格是作为 Racket 显示机制的一部分插入的,这与数据库打印机可能打印用逗号或制表符分隔的字段的方式非常相似。

与其担心逗号,不如关注解析算法。它需要什么,产生什么?

于 2014-03-07T05:35:01.343 回答