【问题标题】:Parse Bash to Python [closed]将 Bash 解析为 Python [关闭]
【发布时间】:2017-05-26 08:35:46
【问题描述】:

我想解析一个 Bash 脚本并将其转换为 Python 脚本(将表示有效 bash 脚本的文本转换为表示等效 Python 脚本的文本)。 我该如何开始?任何以前的工作,推荐的博客/文章/书籍?

【问题讨论】:

  • 您想转换一个特定的 Bash 脚本,还是想设计一个通用的 Bash 到 Python 转换器?
  • 设计一个通用的 bash 到 python 的转换器
  • 一般情况下是不可能的,看我的回答

标签: python bash parsing parse-tree


【解决方案1】:

如果你想一想,一般来说,一个 unix shell 脚本不能被解析成一些abstract syntax tree,因为 shell 不能以这种方式工作(它们本质上是将字符串扩展为其他字符串)。 Bash 是 working 通过标记然后 expanding 事物。

例如,想想什么

mycd=cd
myexit=exit
$mycd /tmp
ls
$myexit 23

正在做

所以在实践中,您需要了解特定的 shell 脚本在做什么,并用 Python 重写它。

你可以阅读一些关于编译的通用教科书,例如Dragon Book

所以一个通用的 Bash 到 Python 转换器实际上是不可能的(最多,你会用 Python 编写一个类似于 bash 的 shell 解释器)

理论上,Post rewriting systemTuring complete,而Halting problem 是无法解决的(因此直觉认为,generic Bash to Python 编译器不存在,否则作为 Python 中一些无趣的 shell 解释器)。

但是,您可以采取一些启发式方法并花费大量时间使用各种启发式方法构建转换器。但一般情况下还是等价于 Python 中的 shell 解释器。我不确定这是否值得。

另请参阅 Yann Regis-Gianas FOSDEM2018 talk Parsing POSIX [S]hell

【讨论】:

  • 说不能解析shell脚本是不正确的。您的示例中没有任何内容超出了爱好编译器的功能。只是一种动态语言,实现了eval 函数
  • 刚刚添加了一个有趣的参考来回答您的评论
  • 是的,解析完整的 sh 语法并不容易。它甚至不是相当困难。无论如何,这是可能的(这是我对你的回答唯一的抱怨)。虽然您可能无法使用 Yacc 来做到这一点,但您绝对可以使用解析器组合器来做到这一点。 Yann 自己为sh创建了一个解析器
猜你喜欢
  • 2017-11-06
  • 2021-03-05
  • 1970-01-01
  • 2013-01-25
  • 2016-03-23
  • 2018-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多