2

解析时(Java 中的 ANTLR4)我应该什么时候解析别名?

我有一个简单的“bash”外观 DSL(与管道连接的命令),类似于command1 | command2 | ...一组预定义的命令。我想给用户一个选项来定义自定义别名,比如alias com='command2 | command3'(bash 风格)。然后用户应该能够在command1 | com相当于command1 | command2 | command3.

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

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

  2. 在我从词法分析中得到令牌之后,

  3. 在构建解析树时,

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

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

4

1 回答 1

2

如果我理解正确,您的文件将同时包含别名的定义和用途:

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

这让我认为选项 1) 和 2) 都很困难/不可能,因为您需要解析文件以确定:

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

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

当然,如果不了解您的语言和/或语法的全部细节,就不可能肯定地说。

于 2013-10-31T11:21:18.473 回答