在ANTLR上编写子shell解析规则

时间:2009-01-20 13:55:16

标签: parsing antlr

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

进一步解释:

我想解析以下输入:

$(command parameters*)

`command parameters`

"some text $(command parameters*)"

能够通过简单的输入检查它的内容,例如:命令参数。

即:

解析它会产生类似

(SUBSHELL (CMD command (PARAM parameters*)))
的树(代币是大写的)


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

$ echo "String test $(ls -l) end"

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

1 个答案:

答案 0 :(得分:1)

我对Antlr v3的细节不太熟悉,但我可以告诉你,你不能在传统风格的词法分析器中处理双引号字符串中的bash样式命令替换,因为嵌套不能表达使用常规语法。大多数传统的编译器编译器限制词法分析器使用常规语法,以便为它们构建高效的DFA。 (Lexers,不可思议地必须扫描源的每个字符,历史上一直是编译器中最慢的部分之一。)

你必须解析“作为一个标记,并且(理想情况下)对字符串的内部使用不同的词法分析器或词法分析器模式,这样大多数shell元字符,例如'{',不会被解析为标记,而是作为文本;或者或者,废除lexer-parser除法并使用无扫描方法,这样双引号字符串的“lexer”规则可以调用命令替换的“解析器”规则。

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