解析表达式语法是否适合解析 shell 命令语言?

Are parsing expression grammars suited to parsing the shell command language?

POSIX shell 命令语言不容易解析,主要是因为词法分析和解析之间的紧密耦合。

但是,解析表达式语法 (PEG) 通常不需要扫描器。通过结合词法分析和解析,我似乎可以避免这些问题。我使用的语言 (Rust) 有一个维护良好的 PEG 库。但是,我知道三个困难可能会导致使用这个库不切实际:

鉴于这些要求,PEG 是否适合解析 shell 命令语言,还是手写的递归下降解析器更合适?

是的,可以使用PEG,您注意到的none个问题应该是一个问题。 特别是:

1) 逐行解析:大多数 PEG 工具不会有任何内置的 white-space 跳过。所有白色 space 包括换行符都必须由您明确处理,这意味着您可以按照自己喜欢的方式处理换行符。

2) 你不应该使用 PEG 的解析树作为你的 AST。相反,您应该下降解析树并构建 AST。那么对于别名,在解析完成并且您正在构建 AST 之后,您可以检测别名并为别名插入适当的扩展。

3)保留字不保留,除非你保留。也就是说,如果您有一个可能出现保留字或另一个字母数字符号的上下文,您必须首先明确检查保留字,然后是任意字母数字符号,因为一旦 PEG 确定它有匹配项,它就不会返回-追踪。在任何不允许使用保留字的地方,只要不检查它,您的通用字母数字符号规则就会成功。