Antlr4實現簡單語言之整數比較表達式

續上文Antlr4: 修改語法規則更接近普通BNF格式.java

例程

爲先=1
爲先 爲2
=> 返回false
複製代碼

'爲'做爲關鍵詞, 與數字能夠連寫, 但必須與變量名用空格間隔:git

變量一=1
變量二=2
變量一×2爲 變量二
複製代碼

實現

相似"求積表達式"語法規則模式, 添加以下:github

表達式
    : 等同判斷表達式;

等同判斷表達式
    :   比較表達式
    |   等同判斷表達式 '==' 比較表達式
    |   等同判斷表達式 '爲' 比較表達式
    |   等同判斷表達式 '!=' 比較表達式
    |   等同判斷表達式 '≠' 比較表達式
    ;

比較表達式
    :   求和表達式
    |   比較表達式 '<' 求和表達式
    |   比較表達式 '>' 求和表達式
    |   比較表達式 '<=' 求和表達式
    |   比較表達式 '>=' 求和表達式
    |   比較表達式 '≤' 求和表達式
    |   比較表達式 '≥' 求和表達式
    ;

求和表達式
  : 求積表達式
  | 求和表達式 '+' 求積表達式
  | 求和表達式 '-' 求積表達式
  ;
複製代碼

"定製訪問器"中添加的部分以下, 因爲語法規則模式相同, 構建樹算法也相同:算法

@Override
  public 節點 visit表達式(表達式Context 上下文) {
    return visit(上下文.等同判斷表達式());
  }

  @Override
  public 節點 visit等同判斷表達式(等同判斷表達式Context 上下文) {
    return 以自己向右擴展爲運算節點(上下文, 上下文.等同判斷表達式(), 上下文.比較表達式());
  }

  @Override
  public 節點 visit比較表達式(比較表達式Context 上下文) {
    return 以自己向右擴展爲運算節點(上下文, 上下文.比較表達式(), 上下文.求和表達式());
  }

  @Override
  public 節點 visit求和表達式(求和表達式Context 上下文) {
    return 以自己向右擴展爲運算節點(上下文, 上下文.求和表達式(), 上下文.求積表達式());
  }

  @Override
  public 節點 visit求積表達式(求積表達式Context 上下文) {
    return 以自己向右擴展爲運算節點(上下文, 上下文.求積表達式(), 上下文.最小表達式());
  }
...
  private 節點 以自己向右擴展爲運算節點(ParserRuleContext 上下文, ParserRuleContext 自己子節點, ParserRuleContext 擴展子節點) {
    節點 比較節點 = visit(擴展子節點);
    if (自己子節點 == null) {
      return 比較節點;
    } else {
      return 構建運算節點(取運算符(上下文), 自己子節點, 比較節點);
    }
  }

  // 第二個子節點爲運算符
  private 運算符號 取運算符(ParserRuleContext 原始表達式) {
    int 最後運算符 = ((TerminalNodeImpl) 原始表達式.getChild(1)).symbol.getType();
    switch (最後運算符) {
      case5Parser.T加:
        return 運算符號.加;
      case5Parser.T減: 
        return 運算符號.減;
      case5Parser.T乘:
      case5Parser.T數乘:
        return 運算符號.乘;
      case5Parser.T除:
      case5Parser.T數除:
        return 運算符號.除;
      case5Parser.T相等:
      case5Parser.T爲:
        return 運算符號.相等;
      default:
        return null;
    }
  }
複製代碼

下面是須要細究的部分, 因爲變量名包括了"爲"字, 所以若是把這個詞-"爲"定義在"T變量名"以後, 詞法分析就會有問題.bash

T爲: '爲';
複製代碼

另外, 若是不添加空格忽略規則, 若是代碼裏帶空格, 也會詞法分析錯誤. 加了此規則以後就支持"爲先 爲2":markdown

T空格: [ ]+ ->skip;
複製代碼

在"運行器"的"求值"方法中, 添加"相等"支持:ide

case 相等: return 左結果 == 右結果;
複製代碼

大於(等於), 小於(等於), 不等支持也是相似實現. 源碼版本號: program-in-chinese/quan5oop

2018-01-17spa

相關文章
相關標籤/搜索