【发布时间】:2015-03-09 02:58:56
【问题描述】:
POSIX shell 命令语言不容易解析,主要是因为词法分析和解析之间的紧密耦合。
但是,解析表达式语法 (PEG) 通常无需扫描仪。通过结合词法和解析,我似乎可以避免这些问题。我使用的语言 (Rust) 有一个维护良好的 PEG 库。但是,我知道使用这个库可能会遇到三个困难:
- Shell 必须能够逐行解析,而不是读取超出行尾的字符。
- 别名是纯粹的词法,在某些情况下可能会导致一个标记被其他标记的任何序列替换
- Shell 保留字仅在某些情况下被识别
鉴于这些要求,PEG 是否适合解析 shell 命令语言,还是手写递归下降解析器更适合?
【问题讨论】:
-
FWIW,bash 使用了一个相当简单的野牛生成的解析器,并结合了一个极其复杂的手写词法分析器。我不知道 PEG 的效果如何,但如果你试一试,请告诉我们。
-
三个原因:它是 GPL,而我的 shell 在 MIT/Apache 2 下,它在 C 中,而我的 shell 在 Rust 中,我不会从中学到任何东西。
-
是的。 PEG 解析器进行扫描。语法语言比正则表达式更强大,更简洁方便。我已经将几个 ANTLR 语法翻译成 Grako (PEG),词汇部分也很容易翻译。不过,PEG 的效率将低于基于状态机的词法分析器。
-
@Apalala 我不仅仅指词法分析;我的意思也是解析。
-
这个问题可能比 Stack Overflow 更适合程序员 Stack Exchange。作为一个 SO 问题,它似乎太宽泛,而且民意调查太多。 YMMV。
标签: shell parsing rust parser-generator peg