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

Dem*_*emi 6 shell parsing peg parser-generator rust

POSIX shell命令语言不易解析,主要是因为lexing和解析之间的紧密耦合.

但是,解析表达式语法(PEG)通常是无扫描的.通过结合lexing和解析,我似乎可以避免这些问题.我正在使用的语言(Rust)有一个维护良好的PEG库.但是,我知道有三个困难可能使得使用这个库变得不切实际:

  • shell必须能够逐行解析,而不是读取超过行尾的字符.
  • 别名纯粹是词法,并且在某些情况下可以使令牌被任何其他令牌序列替换
  • Shell保留字仅在某些情况下被识别

PEG是否适合在给定这些要求的情况下解析shell命令语言,或者是一个手写的递归下降解析器更适合?

cli*_*ath 4

是的,可以使用 PEG,并且您注意到的所有问题都不应该成为问题。尤其:

1)逐行解析:大多数PEG工具不会有任何内置的空白跳过。包括换行符在内的所有空白都必须由您显式处理,这意味着您可以以任何您喜欢的方式处理换行符。

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

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