Parsing 在ANTLR上编写子shell解析规则

Parsing 在ANTLR上编写子shell解析规则,parsing,antlr,Parsing,Antlr,我正在尝试在ANTLRv3上创建一个简单的BaSH语法,但无法解析(并检查)子shell命令中的输入 进一步解释: 我想分析以下输入: $(command parameters*) `command parameters` "some text $(command parameters*)" $(命令参数*) `命令参数` “某些文本$(命令参数*)” 并且能够像我一样通过简单的输入检查它的内容,比如:命令参数 i、 e: 解析它将生成一个树状结构(SUBSHELL(CMD命令(PARAM参

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

进一步解释:

我想分析以下输入:

$(command parameters*) `command parameters` "some text $(command parameters*)" $(命令参数*) `命令参数` “某些文本$(命令参数*)” 并且能够像我一样通过简单的输入检查它的内容,比如:命令参数

i、 e:

解析它将生成一个树状结构(SUBSHELL(CMD命令(PARAM参数*)))(标记为大写)

(SUBSHELL (CMD command (PARAM parameters*)))
我可以忽略'$('和'`',但这不包括在双引号字符串中使用子shell的情况,例如:

$ echo "String test $(ls -l) end" $echo“字符串测试$(ls-l)结束”
那么…有什么关于如何实现这一点的提示吗?

我对Antlr v3的细节不太熟悉,但我可以告诉您,在传统样式的lexer中,您不能在双引号字符串中处理bash样式的命令替换,因为嵌套不能使用常规语法来表示。大多数传统的编译器将lexer限制为使用常规语法,以便为它们构造高效的DFA(lexer,它不可避免地必须扫描源代码的每个字符,历来是编译器中最慢的部分之一)

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


我倾向于无扫描的方法。我将调查Antlr v3如何支持编写直接在字符流上工作的语法,而不是使用令牌流。

谢谢你的建议!我对正式解析非常陌生。我想当在字符串上发现此构造时,我会触发另一次解析器过程,因为似乎更容易实现。