2

我正在尝试在 ANTLRv3 上创建一个简单的类似 BaSH 的语法,但无法解析(和检查)子 shell 命令中的输入。

进一步说明:

我想解析以下输入:

$(命令参数*)

`命令参数`

“一些文本$(命令参数*)”

并且能够像使用简单输入(例如:命令参数)一样检查它的内容。

IE:

解析它会生成一棵树

(SUBSHELL (CMD 命令(PARAM 参数*)))
(标记为大写)


我可以忽略 '$('s 和 '`'s,但这不会涵盖在双引号字符串中使用子 shell 的情况,例如:

$ echo "字符串测试 $(ls -l) end"

所以......关于如何实现这一目标的任何提示?

4

1 回答 1

1

我对 Antlr v3 的细节不是很熟悉,但我可以告诉你,你不能在传统风格的词法分析器中处理双引号字符串中的 bash 风格的命令替换,因为嵌套不能使用常规来表达语法。大多数传统的编译器 - 编译器限制词法分析器使用常规语法,以便可以为它们构造有效的 DFA。(词法分析器不得不扫描源代码的每个字符,历来是编译器中最慢的部分之一。)

您必须将 " 解析为标记并(理想情况下)对字符串的内部使用不同的词法分析器或词法分析器模式,以便大多数 shell 元字符,例如 '{',不会被解析为标记而是文本;或者,做摆脱词法分析器划分并使用无扫描仪方法,以便双引号字符串的“词法分析器”规则可以调用“分析器”规则进行命令替换。

我赞成无扫描仪的方法。我将研究 Antlr v3 支持编写直接在字符流上工作的语法,而不是使用令牌流。

于 2009-01-20T14:46:28.580 回答