日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

2017-11-26 编程语言试验之Antlr4+Java实现圈2

發(fā)布時(shí)間:2024/8/26 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2017-11-26 编程语言试验之Antlr4+Java实现圈2 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

"中文編程"知乎專欄原文

此文涉及的源碼版本: program-in-chinese/quan2

聲明 代碼來(lái)源 How to Create Language Using Antlr4

本作主要作為學(xué)習(xí)Antlr, 以及實(shí)踐中文命名之用. 目標(biāo)不是一個(gè)實(shí)用的編程語(yǔ)言.

個(gè)人感覺(jué)這樣可以比較容易的用原型來(lái)嘗試和演示不同語(yǔ)法設(shè)計(jì), 如果有更簡(jiǎn)單的途徑請(qǐng)不吝賜教. 歡迎各種自行修改~碰到任何問(wèn)題也歡迎一同探討.

下面是"圈2"語(yǔ)言的示例代碼:

開(kāi)始使 甲 為 5使 乙 為 10加 3 到 乙加 乙 到 甲加 甲 到 乙打印 乙打印 3 結(jié)束

附上需要自行編寫(xiě)的三個(gè)文件:
Antlr4的語(yǔ)法定義文件:

按照README說(shuō)明, Antlr可以據(jù)此自動(dòng)生成四個(gè)分析器相關(guān)類文件. T前綴是由于Antlr約定大寫(xiě)開(kāi)頭是Token定義. 標(biāo)識(shí)符支持中文.

grammar 圈2; 程序 : '開(kāi)始' 聲明+ '結(jié)束';聲明 : 賦值 | 加 | 打印 ;賦值 : '使' T標(biāo)識(shí)符 '為' (T數(shù) | T標(biāo)識(shí)符) ; 打印 : '打印' (T數(shù) | T標(biāo)識(shí)符) ; 加 : '加' (T數(shù) | T標(biāo)識(shí)符) '到' T標(biāo)識(shí)符 ;T標(biāo)識(shí)符 : ('a' .. 'z' | 'A' .. 'Z' | '\u4E00'..'\u9FA5' | '\uF900'..'\uFA2D')+ ; T數(shù) : [0-9]+ ; T空白 : [ \n\t]+ -> skip;

定制監(jiān)聽(tīng)器:

通過(guò)對(duì)每種語(yǔ)句分析后進(jìn)行對(duì)應(yīng)處理, 實(shí)質(zhì)上起了解釋器的作用.

public class 定制監(jiān)聽(tīng)器 extends 圈2BaseListener {private Map<String, Integer> 變量表;public 定制監(jiān)聽(tīng)器() {變量表 = new HashMap<>();}@Overridepublic void exit賦值(賦值Context 上下文) {// 賦值語(yǔ)句分析結(jié)束時(shí)運(yùn)行此方法String 變量名 = 上下文.T標(biāo)識(shí)符(0).getText();// 如果語(yǔ)句中有兩個(gè)變量(標(biāo)識(shí)符), 那么取第二個(gè)變量的值, 否則取數(shù)的值int 值 = 上下文.T標(biāo)識(shí)符().size() > 1? 變量表.get(上下文.T標(biāo)識(shí)符(1).getText()): Integer.parseInt(上下文.T數(shù)().getText());// 更新變量值變量表.put(變量名, 值);}@Overridepublic void exit加(加Context 上下文) {// 加語(yǔ)句分析結(jié)束時(shí)運(yùn)行此方法String 變量名 = 上下文.T標(biāo)識(shí)符().size() > 1 ? 上下文.T標(biāo)識(shí)符(1).getText() : 上下文.T標(biāo)識(shí)符(0).getText();int 添加值 = 上下文.T標(biāo)識(shí)符().size() > 1 ? 變量表.get(上下文.T標(biāo)識(shí)符(0).getText()): Integer.parseInt(上下文.T數(shù)().getText());變量表.put(變量名, 變量表.get(變量名) + 添加值);}@Overridepublic void exit打印(打印Context 上下文) {// 打印語(yǔ)句分析結(jié)束時(shí)運(yùn)行此方法String 輸出 = 上下文.T標(biāo)識(shí)符() == null ? 上下文.T數(shù)().getText() : 變量表.get(上下文.T標(biāo)識(shí)符().getText()).toString();System.out.println(輸出);} }

運(yùn)行器:

讀取文件輸入, 調(diào)用附著了定制監(jiān)聽(tīng)器的分析器

public class 運(yùn)行器 {public static void main(String[] 參數(shù)) {try {ANTLRInputStream 輸入 = new ANTLRInputStream(new FileInputStream(參數(shù)[0]));圈2Lexer 詞法分析器 = new 圈2Lexer(輸入);圈2Parser 語(yǔ)法分析器 = new 圈2Parser(new CommonTokenStream(詞法分析器));語(yǔ)法分析器.addParseListener(new 定制監(jiān)聽(tīng)器());// 開(kāi)始分析語(yǔ)法分析器.程序();} catch (IOException e) {e.printStackTrace();}} }

尚未探索如何用Antlr4實(shí)現(xiàn)無(wú)空格語(yǔ)法設(shè)計(jì)(不允許標(biāo)識(shí)符中出現(xiàn)關(guān)鍵字應(yīng)該可以做到, 但那樣限制太多)

轉(zhuǎn)載于:https://www.cnblogs.com/program-in-chinese/p/10474443.html

總結(jié)

以上是生活随笔為你收集整理的2017-11-26 编程语言试验之Antlr4+Java实现圈2的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。