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

标签 shell parsing rust parser-generator peg

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/

相关文章:

linux - grep -Po '...\K...' 有什么作用?否则如何达到这种效果?

Linux命令以间隔运行脚本

rust - 您如何创建部分初始化的结构?

java - 我如何解析 Ping 请求(字符串)的 Ping 时间(整数)?

json - 获取 JSON 文件中的最后一个元素

rust - 关联类型中 + 运算符的用途是什么?

rust - 不能将 `-Z macro-backtrace`不稳定选项与 `cargo`一起使用

c - 产生了一个 bash shell。 shell 死了但 pipe 没坏?

linux - move 名称中包含空格的多个文件 (Linux)

java - 如何在 Java 中将带有参数的 uri 解析为 Map