2017-12-02 編程語言試驗之Antlr4+JavaScript實現"圈4"

来源:https://www.cnblogs.com/program-in-chinese/archive/2019/03/05/10476800.html
-Advertisement-
Play Games

參考: "ANTLR4: Making a compiler with the JavaScript runtime" 演示效果雖弱, 還是先上圖吧: 線上演示: "地址" . 源碼庫: "program in chinese/quan4" 下載到本地後在瀏覽器中打開"圈4.html"就可以在本地試 ...


參考: ANTLR4: Making a compiler with the JavaScript runtime

演示效果雖弱, 還是先上圖吧:
2017_12_02_圈4

線上演示: 地址.

源碼庫: program-in-chinese/quan4

下載到本地後在瀏覽器中打開"圈4.html"就可以在本地試驗.

以後設計實現好語言後可以直接用靜態網頁作線上編程的演示, 覺得還蠻有用.

註: JS代碼中各種不良操作(比如全局函數定義). 請勿作為JS學習材料使用. 與前文一樣, 此文的目標不是一個實用的編程語言.

語法非常簡單(圈4.g4), 只為演示之用. 前文編程語言試驗之Antlr4+Java實現"圈2"有更多格式的解釋:

grammar 圈4;
程式   : 求約數;

求約數    : '求約數' T數 ;

T數 : [0-9]+ ;
T空白     : [ \n\t]+ -> skip;

下麵命令生成詞法語法分析器相關JavaScript文件(圈4.tokens, 圈4Lexer.js, 圈4Lexer.tokens, 圈4Listener.js, 圈4Parser.js):

$ java -cp "antlr-4.7-complete.jar:$CLASSPATH" org.antlr.v4.Tool -Dlanguage=JavaScript 圈4.g4

作為解釋器的"定製監聽器.js":

var antlr4 = require('antlr4/index');
const 圈4Listener = require('./圈4Listener.js').圈4Listener

定製監聽器 = function () {
  圈4Listener.call(this);
  return this;
}

定製監聽器.prototype = Object.create(圈4Listener.prototype);
定製監聽器.prototype.constructor = 定製監聽器;
/*
無需介面定義: enter程式/exit程式/enter求約數
*/
定製監聽器.prototype.exit求約數 = function(上下文) {
  var 原數 = parseInt(上下文.getChild(1).getText());
  document.getElementById("輸出").innerHTML = 原數 + "的約數: " + 求約數(原數);
};

function 求約數(原數) {
  var 約數 = [];
  for (var i = 1; i < 原數 - 1; i++) {
    if (原數 % i == 0) {
      約數.push(i);
    }
  }
  return 約數;
}

exports.定製監聽器 = 定製監聽器;

讀取文件輸入, 調用附著了定製監聽器的分析器"代碼分析.js":

const antlr4 = require("antlr4/index")
const 圈4Lexer = require("./圈4Lexer.js")
const 圈4Parser = require("./圈4Parser.js")
const 定製監聽器 = require("./定製監聽器.js").定製監聽器

運行();

// TODO: 需改進-現為全局, 由於browserify
function 運行() {
  var 代碼 = document.getElementById('輸入代碼').value;
  var 輸入流 = new antlr4.InputStream(代碼)
  var 詞法分析器 = new 圈4Lexer.圈4Lexer(輸入流)
  var 詞 = new antlr4.CommonTokenStream(詞法分析器)
  var 語法分析器 = new 圈4Parser.圈4Parser(詞)
  語法分析器.buildParseTrees = true

  antlr4.tree.ParseTreeWalker.DEFAULT.walk(new 定製監聽器(), 語法分析器.程式())
}

window.運行 = 運行;

HTML界面"圈4.html":

<html>
  <head>
    <!-- defer原因: https://stackoverflow.com/a/26077148/1536803 不然需要document.ready判斷 -->
    <script src="圈4.js" defer></script>
  </head>
  <body>
    <textarea id="輸入代碼">求約數50
    </textarea>
    <button onclick="運行()">運行</button> 
    <span id="輸出"></span>
  </body>
</html>

是的, 上面的"圈4.js"需要另行生成. 安裝Browserify後運行:

$ browserify 代碼分析.js > 圈4.js 

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • vue 開發過程中,保存一次就會編譯一次,如果能夠減少編譯的時間,哪怕是一丁點,也能節省不少時間。開發過程中個人編寫的源文件才會頻繁變動,而一些庫文件我們一般是不會去改動的。如果能把這些庫文件提取出來,就能減少打包體積,加快編譯速度。本文主要講述在 vue-cli3 中利用 DllPlugin 來進 ...
  • 1,在https://v3.bootcss.com/getting-started/#download下載bootstrap的壓縮包; 2,將壓縮包解壓到自己的工程文件中,會得到如下結果: 3,打開這個解壓的文件,一直點擊進去,裡面有三個文件的界面,展示如下: 4,css文件中裝的是樣式文件: 其中 ...
  • 開始我的初步認識-RequireJS能給我們帶來什麼好處? 1、實現js文件的非同步載入,避免網頁失去響應; 2、管理模塊之間的依賴性,便於代碼的編寫和維護。 3、基於AMD模塊化機制,讓前端代碼也能實現模塊化。查看《CommonJS和AMD/CMD區別詳解》。 ...
  • 我遇到了一個問題,我在已經配置babel的項目中通過require引入了一個項目目錄外層的另一個js文件,前期是可以成功轉換並打包的,但是到了後期就不行了,報錯: 這個報錯的意思是,引入的js文件中有es6的語法,所以跑項目,或者打包的時候不支持。還沒有想到babel可以如何配置,保證引入的js也自 ...
  • Web前端開發是由網頁製作演變而來的,主要由HTML、CSS、JavaScript三大要素組成。專業的Web前端開發入門知識也一定會包含這些內容,今天小編就給大家簡單介紹一下。 HTML,超文本標記語言,標準通用標記語言下的一個應用。包括“頭”部分(英語:Head)、和“主體”部分(英語:Body) ...
  • 前端開發中,總是會有這樣的需求,就是快速的寫一個腳本,或者一個簡單的demo頁面。這時,我們需要馬上可以啟動一個web服務,來支持開發。 ...
  • position:fixed; top:0; right:0; left:0; bottom:0; margin:auto; ...
  • 前言:2019年的第一篇分享... 一、什麼是基本類型值和引用類型值?ECMAScript包括兩個不同類型的值:基本數據類型和引用數據類型。基本數據類型指的是簡單的數據段,引用數據類型指的是有多個值構成的對象。當我們把變數賦值給一個變數時,解析器首先要確認的就是這個值是基本類型值還是引用類型值。 註 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...