簡體   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