Antlr4實現簡單語言之條件語句

本系列以前的文章:java

Antlr4的分析錯誤處理bash

Antlr4實現數學四則運算markdown

Antlr4添加中文變量賦求值,括號,各類問題ide

Antlr4: 修改語法規則更接近普通BNF格式oop

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

這一步, 實現了最簡單的單條件, 只有"條件爲真"時執行單語句. 例如:code

變量=1
若是 變量<2 變量=變量×2
變量
複製代碼

返回2orm

實現

語法規則修改, 將本來的'聲明'拆分出多個規則:get

聲明
    :   賦值聲明
    |   若是聲明
    |   求值聲明
    |   T新行
    ;

若是聲明
    :   '若是' 表達式 聲明
    ;

賦值聲明
    : T變量名 '=' 表達式 T新行
    ;

求值聲明
    : 表達式 T新行
    ;
複製代碼

"定製訪問器"中, 賦值/求值聲明只需修改類型, 添加的"若是聲明"部分(需更名爲"條件聲明"之類):數學

@Override
  public 節點 visit若是聲明(若是聲明Context 上下文) {
    條件節點 節點 = new 條件節點();
    節點.條件 = visit(上下文.表達式());
    節點.條件.原始文本 = 上下文.表達式().getText();
    節點.條件爲真分支 = visit(上下文.聲明());
    return 節點;
  }
複製代碼

語法樹節點新增類型:

public class 條件節點 extends 節點 {

  public 節點 條件;
  public 節點 條件爲真分支;
}
複製代碼

"運行器"的"求值"方法中添加條件節點的處理:

else if (節點 instanceof 條件節點) {
      Object 條件 = 求值(((條件節點) 節點).條件);
      if (條件 instanceof Boolean) {
        return (boolean)條件 ? 求值(((條件節點) 節點).條件爲真分支) : null;
      } else {
        System.err.println("[運行時錯誤] 條件部分需爲布爾值: " + ((條件節點) 節點).條件.原始文本);
        return null;
      }
    }
複製代碼

下面, 須要添加條件語句中對換行以及條件執行多個語句的支持, 須要選擇是用{}仍是其餘特殊規則決定條件語句範圍.

2018-02-18

相關文章
相關標籤/搜索