2018-01-17 Antlr4实现简单语言之整数比较表达式
生活随笔
收集整理的這篇文章主要介紹了
2018-01-17 Antlr4实现简单语言之整数比较表达式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
續上文Antlr4: 修改語法規則更接近普通BNF格式.
例程
為先=1 為先 為2 => 返回false'為'作為關鍵詞, 與數字可以連寫, 但必須與變量名用空格間隔:
變量一=1 變量二=2 變量一×2為 變量二實現
類似"求積表達式"語法規則模式, 添加如下:
表達式: 等同判斷表達式;等同判斷表達式: 比較表達式| 等同判斷表達式 '==' 比較表達式| 等同判斷表達式 '為' 比較表達式| 等同判斷表達式 '!=' 比較表達式| 等同判斷表達式 '≠' 比較表達式;比較表達式: 求和表達式| 比較表達式 '<' 求和表達式| 比較表達式 '>' 求和表達式| 比較表達式 '<=' 求和表達式| 比較表達式 '>=' 求和表達式| 比較表達式 '≤' 求和表達式| 比較表達式 '≥' 求和表達式;求和表達式: 求積表達式| 求和表達式 '+' 求積表達式| 求和表達式 '-' 求積表達式;"定制訪問器"中添加的部分如下, 由于語法規則模式相同, 構建樹算法也相同:
@Overridepublic 節點 visit表達式(表達式Context 上下文) {return visit(上下文.等同判斷表達式());}@Overridepublic 節點 visit等同判斷表達式(等同判斷表達式Context 上下文) {return 以本身向右擴展為運算節點(上下文, 上下文.等同判斷表達式(), 上下文.比較表達式());}@Overridepublic 節點 visit比較表達式(比較表達式Context 上下文) {return 以本身向右擴展為運算節點(上下文, 上下文.比較表達式(), 上下文.求和表達式());}@Overridepublic 節點 visit求和表達式(求和表達式Context 上下文) {return 以本身向右擴展為運算節點(上下文, 上下文.求和表達式(), 上下文.求積表達式());}@Overridepublic 節點 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變量名"之后, 詞法分析就會有問題.
T為: '為';另外, 如果不添加空格忽略規則, 如果代碼里帶空格, 也會詞法分析錯誤. 加了此規則之后就支持"為先 為2":
T空格: [ ]+ ->skip;在"運行器"的"求值"方法中, 添加"相等"支持:
case 相等: return 左結果 == 右結果;大于(等于), 小于(等于), 不等支持也是類似實現. 源碼版本號: program-in-chinese/quan5
轉載于:https://www.cnblogs.com/program-in-chinese/p/10487790.html
總結
以上是生活随笔為你收集整理的2018-01-17 Antlr4实现简单语言之整数比较表达式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【转】HashMap集合中key只能为引
- 下一篇: Hadoop+Hbase分布式集群架构“