繁体   English   中英

JavaCC:如何维护原始文本(带空格)

[英]JavaCC: How can I maintain the original text (with spaces)

假设我有一个简单的JavaCC语法来解析加法和减法:


....
void CompilationUnit() :
{}
{
  (Expression())+
  EOF
}
void Expression() :
{}
{
  Number()
  (
    Addition()
  | Subtraction()
  )*
}
void Number() :
{}
{
  
}
void Addition() :
{}
{
   Number()
}
void Subtraction() :
{}
{
   Number()
}

我有一些类使用此语法产生的AST来计算结果:


public class Calculator extends DepthFirstVisitor {
  int result = -1;
  public void visit(Expression n) {
    if (result >= 0) System.out.println(toText(n) + " = " + result);
    result = 0;
    super.visit(n);
  }
  public void visit(Number n) {
    ...
  }
  public void visit(Addition n) {
    ...
  }
  ....
}

我能够计算表达式的值,但我也需要原始表达式(如它所显示的)。 因此,对于以下输入:

5 + 2 - 1
  2 + 1

我想要以下输出:

5 + 2 - 1 = 6
2 + 1 = 3

不幸的是,由于我跳过空格或换行符之类的字符,因此得到的是:

5+2-1 = 6
2+1 = 3

有什么办法可以输出原始文本(包括跳过的字符)?

请注意 ,实际问题要大得多,语法要复杂得多。 因此,我并不是真正在寻找针对上述问题的解决方案(例如,预处理行并将它们拆分为换行符,或者修改方法以在每个令牌后“手动”添加空格),而更像是使用某些JavaCC功能的解决方案。

ANTLr和Xtext都支持空格和注释的“隐藏令牌”。 请参阅此处以获取一些提示,或在该术语中使用Google。 也许JavaCC有一些类似的概念。

编辑 :JavaCC似乎使用术语“特殊令牌”。 有关详细信息,请参见此处

基本上,您不能在编译器中执行此操作。 您将必须在语法中捕获空白作为令牌,并在允许的任何地方(无论在何处)都将其允许,结果语法太复杂,以致于无法实现甚至生成。 您将不得不捕获对实体源自的源代码(行和列)中的坐标的引用:例如,当前行和列号的文本。

编译器以其行为方式行事是有原因的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM