POSIX shell 命令语言不容易解析,主要是因为词法分析和解析之间的紧密耦合。
但是,解析表达式语法 (PEG) 通常不需要扫描器。通过结合词法分析和解析,我似乎可以避免这些问题。我使用的语言 (Rust) 有一个维护良好的 PEG 库。但是,我知道三个困难可能会导致使用这个库不切实际:
- Shell 必须能够逐行解析,而不是读取行尾之后的字符。
- 别名纯粹是词法的,在某些情况下可以导致一个标记被任何其他标记序列替换
- Shell 保留字只在某些情况下被识别
鉴于这些要求,PEG 是否适合解析 shell 命令语言,还是手写的递归下降解析器更合适?
最佳答案
是的,可以使用 PEG,您注意到的问题应该都不是问题。 特别是:
1) 逐行解析:大多数 PEG 工具不会有任何内置的空格跳过。包括换行符在内的所有空白都必须由您明确处理,这意味着您可以按照自己喜欢的方式处理换行符。
2) 你不应该使用 PEG 的解析树作为你的 AST。相反,您应该下降解析树并构建 AST。那么对于别名,在解析完成并且您正在构建 AST 之后,您可以检测别名并为别名插入适当的扩展。
3) 保留字不保留,除非你保留它们。也就是说,如果您有一个可能出现保留字或另一个字母数字符号的上下文,您必须首先明确检查保留字,然后是任意字母数字符号,因为一旦 PEG 确定它有匹配项,它就不会返回-追踪。在任何不允许使用保留字的地方,只要不检查它,您的通用字母数字符号规则就会成功。
关于shell - 解析表达式语法是否适合解析 shell 命令语言?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28934609/