續上文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 (最後運算符) { case 圈5Parser.T加: return 運算符號.加; case 圈5Parser.T減: return 運算符號.減; case 圈5Parser.T乘: case 圈5Parser.T數乘: return 運算符號.乘; case 圈5Parser.T除: case 圈5Parser.T數除: return 運算符號.除; case 圈5Parser.T相等: case 圈5Parser.T爲: return 運算符號.相等; default: return null; } } 複製代碼
下面是須要細究的部分, 因爲變量名包括了"爲"字, 所以若是把這個詞-"爲"定義在"T變量名"以後, 詞法分析就會有問題.bash
T爲: '爲';
複製代碼
另外, 若是不添加空格忽略規則, 若是代碼裏帶空格, 也會詞法分析錯誤. 加了此規則以後就支持"爲先 爲2":markdown
T空格: [ ]+ ->skip;
複製代碼
在"運行器"的"求值"方法中, 添加"相等"支持:ide
case 相等: return 左結果 == 右結果; 複製代碼
大於(等於), 小於(等於), 不等支持也是相似實現. 源碼版本號: program-in-chinese/quan5oop
2018-01-17spa