2018-01-17 Antlr4实现简单语言之整数比较表达式
生活随笔
收集整理的這篇文章主要介紹了
2018-01-17 Antlr4实现简单语言之整数比较表达式
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
續(xù)上文Antlr4: 修改語(yǔ)法規(guī)則更接近普通BNF格式.
例程
為先=1 為先 為2 => 返回false'為'作為關(guān)鍵詞, 與數(shù)字可以連寫, 但必須與變量名用空格間隔:
變量一=1 變量二=2 變量一×2為 變量二實(shí)現(xiàn)
類似"求積表達(dá)式"語(yǔ)法規(guī)則模式, 添加如下:
表達(dá)式: 等同判斷表達(dá)式;等同判斷表達(dá)式: 比較表達(dá)式| 等同判斷表達(dá)式 '==' 比較表達(dá)式| 等同判斷表達(dá)式 '為' 比較表達(dá)式| 等同判斷表達(dá)式 '!=' 比較表達(dá)式| 等同判斷表達(dá)式 '≠' 比較表達(dá)式;比較表達(dá)式: 求和表達(dá)式| 比較表達(dá)式 '<' 求和表達(dá)式| 比較表達(dá)式 '>' 求和表達(dá)式| 比較表達(dá)式 '<=' 求和表達(dá)式| 比較表達(dá)式 '>=' 求和表達(dá)式| 比較表達(dá)式 '≤' 求和表達(dá)式| 比較表達(dá)式 '≥' 求和表達(dá)式;求和表達(dá)式: 求積表達(dá)式| 求和表達(dá)式 '+' 求積表達(dá)式| 求和表達(dá)式 '-' 求積表達(dá)式;"定制訪問(wèn)器"中添加的部分如下, 由于語(yǔ)法規(guī)則模式相同, 構(gòu)建樹(shù)算法也相同:
@Overridepublic 節(jié)點(diǎn) visit表達(dá)式(表達(dá)式Context 上下文) {return visit(上下文.等同判斷表達(dá)式());}@Overridepublic 節(jié)點(diǎn) visit等同判斷表達(dá)式(等同判斷表達(dá)式Context 上下文) {return 以本身向右擴(kuò)展為運(yùn)算節(jié)點(diǎn)(上下文, 上下文.等同判斷表達(dá)式(), 上下文.比較表達(dá)式());}@Overridepublic 節(jié)點(diǎn) visit比較表達(dá)式(比較表達(dá)式Context 上下文) {return 以本身向右擴(kuò)展為運(yùn)算節(jié)點(diǎn)(上下文, 上下文.比較表達(dá)式(), 上下文.求和表達(dá)式());}@Overridepublic 節(jié)點(diǎn) visit求和表達(dá)式(求和表達(dá)式Context 上下文) {return 以本身向右擴(kuò)展為運(yùn)算節(jié)點(diǎn)(上下文, 上下文.求和表達(dá)式(), 上下文.求積表達(dá)式());}@Overridepublic 節(jié)點(diǎn) visit求積表達(dá)式(求積表達(dá)式Context 上下文) {return 以本身向右擴(kuò)展為運(yùn)算節(jié)點(diǎn)(上下文, 上下文.求積表達(dá)式(), 上下文.最小表達(dá)式());} ...private 節(jié)點(diǎn) 以本身向右擴(kuò)展為運(yùn)算節(jié)點(diǎn)(ParserRuleContext 上下文, ParserRuleContext 本身子節(jié)點(diǎn), ParserRuleContext 擴(kuò)展子節(jié)點(diǎn)) {節(jié)點(diǎn) 比較節(jié)點(diǎn) = visit(擴(kuò)展子節(jié)點(diǎn));if (本身子節(jié)點(diǎn) == null) {return 比較節(jié)點(diǎn);} else {return 構(gòu)建運(yùn)算節(jié)點(diǎn)(取運(yùn)算符(上下文), 本身子節(jié)點(diǎn), 比較節(jié)點(diǎn));}}// 第二個(gè)子節(jié)點(diǎn)為運(yùn)算符private 運(yùn)算符號(hào) 取運(yùn)算符(ParserRuleContext 原始表達(dá)式) {int 最后運(yùn)算符 = ((TerminalNodeImpl) 原始表達(dá)式.getChild(1)).symbol.getType();switch (最后運(yùn)算符) {case 圈5Parser.T加:return 運(yùn)算符號(hào).加;case 圈5Parser.T減: return 運(yùn)算符號(hào).減;case 圈5Parser.T乘:case 圈5Parser.T數(shù)乘:return 運(yùn)算符號(hào).乘;case 圈5Parser.T除:case 圈5Parser.T數(shù)除:return 運(yùn)算符號(hào).除;case 圈5Parser.T相等:case 圈5Parser.T為:return 運(yùn)算符號(hào).相等;default:return null;}}下面是需要細(xì)究的部分, 由于變量名包括了"為"字, 因此如果把這個(gè)詞-"為"定義在"T變量名"之后, 詞法分析就會(huì)有問(wèn)題.
T為: '為';另外, 如果不添加空格忽略規(guī)則, 如果代碼里帶空格, 也會(huì)詞法分析錯(cuò)誤. 加了此規(guī)則之后就支持"為先 為2":
T空格: [ ]+ ->skip;在"運(yùn)行器"的"求值"方法中, 添加"相等"支持:
case 相等: return 左結(jié)果 == 右結(jié)果;大于(等于), 小于(等于), 不等支持也是類似實(shí)現(xiàn). 源碼版本號(hào): program-in-chinese/quan5
轉(zhuǎn)載于:https://www.cnblogs.com/program-in-chinese/p/10487790.html
總結(jié)
以上是生活随笔為你收集整理的2018-01-17 Antlr4实现简单语言之整数比较表达式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【转】HashMap集合中key只能为引
- 下一篇: Hadoop+Hbase分布式集群架构“