是否有类似Awk或Lisp的编程语言可以处理s表达式流?
我最近在KiCad中创建了一些PCB封装,它们存储在s-expression文件中,其数据如下所示:
(fp_text user %R (at 0 5.08) (layer F.Fab) (effects (font (size 1 1) (thickness 0.15))) ) (fp_line (start -27.04996 -3.986) (end -27.24996 -3.786) (layer F.Fab) (width 0.1)) (pad "" np_thru_hole circle (at 35.56 0) (size 3.175 3.175) (drill 3.175) (layers *.Cu *.Mask) (clearance 1.5875)) (pad 96 smd rect (at 1.25 3.08473) (size 0.29972 1.45034) (layers F.Cu F.Paste F.Mask) (clearance 0.09906)) 我希望能够编写shell one-liners来有效地编辑多个参数.我通常会使用Awk这样的东西,但是s表达式的递归性质使它不适合这项任务.我想知道是否存在一种带有解释器的编程语言,用于处理管道数据并且可以本地处理s表达式.也许Lisp的数据驱动方言会这样做,但我不知道在哪里看. 总之,我希望能够以类似于Awk允许我逐行处理数据列的方式快速编辑s表达式文件;仅在s表达式的情况下,处理将逐级执行. 示例:查找smd类型的所有pad表达式(大小为0.29972 1.45034),并根据其位置对每个表达式重新编号. 解决方法
只需编写一个简单的Lisp或Scheme脚本,它在读取时循环,并根据需要递归处理您的s-expr.在Linux上,我建议使用
Guile(一个好的Scheme解释器)或者
Clisp(一个简单的Common Lisp实现)甚至
SBCL(一个非常强大的Common Lisp).
(你可能会考虑DSSSL,但在你的情况下它是矫枉过正的) 请注意,您的样本输入不是S-expression,因为(图层F.Fab)不是一个(因为在点之后您应该有另一个s表达式,而不是像Fab这样的原子).我想这是一个错字,应该是(层“F.Fab”);或者你的KiCad软件不会处理S表达式,而是一些受S表达式启发的其他输入语言(应该在EBNF表示法中指定). 另请注意,KiCad是一个免费软件,拥有一个forums社区和一个邮件列表.也许你应该问你那里的实际问题? PS.我们不知道你有什么转变,但Scheme和Common Lisp非常适合这样的任务.在大多数情况下,它们的编码非常简单(可能只有几行). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |