解析(Java中的ANTLR4)何时应该解析别名?
我有一个简单的“bash”看DSL(与管道连接的命令),类似于command1 | command2 | ...
和一组预定义的命令。我想给用户一个选项来定义自定义别名,如alias com='command2 | command3'
(bash样式)。然后,用户应该能够在查询command1 | com
中使用它,该查询等同于command1 | command2 | command3
。
我应该这样做(别名解析):
在用户提供的原始输入文本上。即在lexing / parsing之前将字符串command1 | com
更改为command1 | command2 | command3
,
从lexing获得令牌后,
在构建解析树时,
或当我遍历它(执行命令)?
1)似乎不是一个好方法,因为我对传入的字符串一无所知,替换别名将是一场噩梦。 2)可能不容易。我想我记得3)完全不是一个好的方法,但我的记忆可能只是在欺骗我。这将引导我进行初步猜测 - 选项编号4)。我对此是正确的还是我错过了什么?我唯一关心的是别名本身可以是一个小查询,所以我必须在别名解析期间解析它,但这应该是可行的吗?
答案 0 :(得分:2)
如果我理解正确,您的文件将同时具有别名的定义和用法:
alias com='command2 | command3'
command1 | com # expands to command1 | command2 | command3
这让我觉得选项1)和2)都很难/不可能,因为你需要解析文件来确定:
我认为选项3)可行,但会导致代码相对难以维护,因为它不会使用关注点分离。这就是为什么,在我自己的项目中,我通常应用类似于选项4的东西 - 首先构建某种解析树,然后在稍后的传递(或传递)中解析别名。
当然,如果不了解您的语言和/或语法的完整细节,就无法确定。