我正在研究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 ^”整个符号?)答案 0 :(得分:3)
RE-编辑:
根据您在下面发表的评论,我认为您实际上将在Racket中编写此算法。
在这种情况下,我有一个很多更简单的处方:不要做任何事情。特别是,您的输入当前不包含任何空格。您看到的空格是作为Racket显示机制的一部分插入的,就像数据库打印机可能打印用逗号或制表符分隔的字段一样。
不要担心逗号,而是专注于解析算法。它需要什么,它产生了什么?