1. 程式人生 > >Antlr4實現簡單語言之條件語句

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

本系列之前的文章:

Antlr4的分析錯誤處理

Antlr4實現數學四則運算

Antlr4新增中文變數賦求值,括號,各種問題

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

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

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

變數=1
如果 變數<2 變數=變數×2
變數

返回2

實現

語法規則修改, 將原本的’宣告’拆分出多個規則:

宣告
    :   賦值宣告
    |   如果宣告
    |   求值宣告
    |   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; } }

下面, 需要新增條件語句中對換行以及條件執行多個語句的支援, 需要選擇是用{}還是其他特殊規則決定條件語句範圍.