Antlr4實現簡單語言之條件語句
阿新 • • 發佈:2019-01-08
本系列之前的文章:
這一步, 實現了最簡單的單條件, 只有"條件為真"時執行單語句. 例如:
變數=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;
}
}
下面, 需要新增條件語句中對換行以及條件執行多個語句的支援, 需要選擇是用{}還是其他特殊規則決定條件語句範圍.