日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

2018-01-17 Antlr4实现简单语言之整数比较表达式

發布時間:2025/3/15 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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实现简单语言之整数比较表达式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。