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

时间:2015-03-09 02:58:57

标签: shell parsing rust parser-generator peg

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

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

  • shell必须能够逐行解析,而不是读取行末尾的字符。
  • 别名纯粹是词汇,在某些情况下会导致令牌被其他任何令牌序列替换
  • 只有在某些情况下才能识别外壳保留字

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

1 个答案:

答案 0 :(得分:4)

是的,可以使用PEG,并且您注意到的任何问题都不应该成为问题。 特别是:

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

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

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