何时在解析时解析别名?

时间:2013-10-31 09:10:14

标签: java parsing antlr tokenize

解析(Java中的ANTLR4)何时应该解析别名?

我有一个简单的“bash”看DSL(与管道连接的命令),类似于command1 | command2 | ...和一组预定义的命令。我想给用户一个选项来定义自定义别名,如alias com='command2 | command3'(bash样式)。然后,用户应该能够在查询command1 | com中使用它,该查询等同于command1 | command2 | command3

我应该这样做(别名解析):

  1. 在用户提供的原始输入文本上。即在lexing / parsing之前将字符串command1 | com更改为command1 | command2 | command3

  2. 从lexing获得令牌后,

  3. 在构建解析树时,

  4. 或当我遍历它(执行命令)?

  5. 1)似乎不是一个好方法,因为我对传入的字符串一无所知,替换别名将是一场噩梦。 2)可能不容易。我想我记得3)完全不是一个好的方法,但我的记忆可能只是在欺骗我。这将引导我进行初步猜测 - 选项编号4)。我对此是正确的还是我错过了什么?我唯一关心的是别名本身可以是一个小查询,所以我必须在别名解析期间解析它,但这应该是可行的吗?

1 个答案:

答案 0 :(得分:2)

如果我理解正确,您的文件将同时具有别名的定义和用法:

alias com='command2 | command3' 
command1 | com                     # expands to command1 | command2 | command3

这让我觉得选项1)和2)都很难/不可能,因为你需要解析文件来确定:

  • 别名'定义
  • 使用别名的地方

我认为选项3)可行,但会导致代码相对难以维护,因为它不会使用关注点分离。这就是为什么,在我自己的项目中,我通常应用类似于选项4的东西 - 首先构建某种解析树,然后在稍后的传递(或传递)中解析别名。

当然,如果不了解您的语言和/或语法的完整细节,就无法确定。