我正在尝试在ANTLRv3上创建一个简单的类似BaSH的语法,但是无法在subshell命令中解析(并检查)输入。
进一步解释:
我想解析以下输入:
$(command parameters*) `command parameters` "some text $(command parameters*)"
能够通过简单的输入检查它的内容,例如:命令参数。
即:
解析它会产生类似
(SUBSHELL (CMD command (PARAM parameters*)))的树(代币是大写的)
我可以忽略'$('s和's',但这不会涵盖在双引号字符串中使用子shell的情况,例如:
$ echo "String test $(ls -l) end"
那么......关于如何实现这一目标的任何提示?
答案 0 :(得分:1)
我对Antlr v3的细节不太熟悉,但我可以告诉你,你不能在传统风格的词法分析器中处理双引号字符串中的bash样式命令替换,因为嵌套不能表达使用常规语法。大多数传统的编译器编译器限制词法分析器使用常规语法,以便为它们构建高效的DFA。 (Lexers,不可思议地必须扫描源的每个字符,历史上一直是编译器中最慢的部分之一。)
你必须解析“作为一个标记,并且(理想情况下)对字符串的内部使用不同的词法分析器或词法分析器模式,这样大多数shell元字符,例如'{',不会被解析为标记,而是作为文本;或者或者,废除lexer-parser除法并使用无扫描方法,这样双引号字符串的“lexer”规则可以调用命令替换的“解析器”规则。
我赞成无扫描方法。我将研究Antlr v3如何支持编写直接在字符流上工作的语法,而不是使用令牌流。