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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

antlr4例子_ANTLR和网络:一个简单的例子

發布時間:2023/12/3 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 antlr4例子_ANTLR和网络:一个简单的例子 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

antlr4例子

網絡上的ANTLR:為什么?

我開始在MS-DOS上編寫我的第一個程序。 因此,我非常習慣在自己的機器上安裝工具。 但是在2016年,網絡無處不在,因此那里也可能需要我們的語言。

可能的情況:

  • ANTLR 也在網絡上:
    • 用戶可能還希望從網絡訪問DSL編寫的文件,并可能對其進行較小的更改,同時繼續使用胖客戶端執行復雜的任務。
  • ANTLR 在網絡上:
    • 您正在與不愿安裝IDE的領域專家打交道,因此他們更喜歡使用一些Web應用程序編寫DSL程序。

在第一種情況下,您可以使用Java目標 Javascript目標來生成ANTLR解析器,而在第二種情況下,您可以僅以JavaScript為目標

一個簡單的例子:待辦事項清單

在此示例中,我們將使用的DSL非常簡單:它將表示一個待辦事項列表,其中每個待辦事項都包含在單獨的行中,并以星號開頭。

有效輸入的示例:

* do this * do that* do something else after an empty line

這是我們的語法:

grammar todo;elements: (element|emptyLine)* EOF;element: '*' ( ' ' | '\t' )* CONTENT NL+;emptyLine: NL;NL: '\r' | '\n' ;CONTENT: [a-zA-Z0-9_][a-zA-Z0-9_ \t]*;

使用ANTLR Javascript目標

您將需要安裝ANTLR工具才能為我們的解析器生成Javascript代碼。 您可以使用簡單的Gradle腳本來代替手動下載ANTLR及其依賴項。 更新所使用的ANTLR版本也非常簡單。

apply plugin: 'java'repositories {jcenter() }dependencies {runtime 'org.antlr:antlr4:4.5.2' }task generateParser(type:JavaExec) {main = 'org.antlr.v4.Tool'classpath = sourceSets.main.runtimeClasspathargs = ['-Dlanguage=JavaScript', 'todo.g4', '-o', 'static/generated-parser'] }

您現在可以通過運行以下命令生成解析器:

gradle generateParser

好的,這很簡單。

調用解析器

不幸的是,僅打開本地文件時,我們使用的JS庫無法正常工作:這意味著對于我們的小示例,我們也需要使用HTTP。 我們的Web服務器只需要提供大量靜態文件即可。 為此,我選擇在flask中編寫一個超級簡單的應用程序。 提供靜態文件的替代方案有數百萬種,因此請選擇您喜歡的一種。 我不會在此處詳細說明如何通過flask提供靜態文件,但是GitHub上提供了代碼,如果您對此有疑問,可以在此帖子中添加評論以告知我。

我們的靜態文件將包括:

  • 通過運行gradle generateParser得到的生成的解析器
  • Antlr4 JS運行時
  • JS庫require.js
  • HTML和CSS

您可以從此處獲取Antlr4 JS運行時。 為了避免必須手動導入數十個文件,我們將使用require.js。 您可以從此處獲取我們需要的口味或require.js。

我們將添加一個文本區域和一個按鈕。 當用戶單擊按鈕時,我們將解析文本區域的內容。 簡單吧?

這是此設計杰作HTML代碼:

<div id="inputs"> <textarea id="code"> * play with antlr4 * write a tutorial </textarea> <br/> <button id="parse">Parse</button> </div>

首先,導入require.js:

<script type="text/javascript" src="lib/require.js"></script>

順便說一句,我們沒有使用jQuery,我知道這可能令人震驚。

好,現在我們必須調用解析器

<script type="text/javascript"> var antlr4 = require('antlr4/index'); var TodoLexer = require('generated-parser/todoLexer'); var TodoParser = require('generated-parser/todoParser'); document.getElementById("parse").addEventListener("click", function(){var input = document.getElementById("code").value;var chars = new antlr4.InputStream(input);var lexer = new TodoLexer.todoLexer(chars);var tokens = new antlr4.CommonTokenStream(lexer);var parser = new TodoParser.todoParser(tokens);parser.buildParseTrees = true;var tree = parser.elements();console.log("Parsed: "+ tree); }); </script>

太好了,現在我們的代碼已解析,但是我們不對其執行任何操作。 當然,我們可以在瀏覽器中啟動開發者控制臺,并打印有關樹的一些信息,以驗證樹是否正常工作并熟悉ANTLR返回的樹的結構。

顯示結果

如果我們正在構建某種TODO應用程序,我們可能希望以某種方式表示用戶通過DSL插入的信息。

讓我們得到這樣的東西:

為此,我們基本上需要添加功能updateTree來導航ANTLR返回的樹并構建一些DOM節點來表示其內容

<script type="text/javascript"> var updateTree = function(tree, ruleNames) {var container = document.getElementById("tree");while (container.hasChildNodes()) {container.removeChild(container.lastChild);}for (var i = 0; i < tree.children.length; i++) {var child = tree.children[i];var nodeType = ruleNames[child.ruleIndex];if (nodeType == "element") {var newElement = document.createElement("div");newElement.className = "todoElement";var newElementText = document.createTextNode(child.children[2].getText());newElement.appendChild(newElementText);container.appendChild(newElement);}} };var antlr4 = require('antlr4/index'); var TodoLexer = require('generated-parser/todoLexer'); var TodoParser = require('generated-parser/todoParser'); document.getElementById("parse").addEventListener("click", function(){var input = document.getElementById("code").value;var chars = new antlr4.InputStream(input);var lexer = new TodoLexer.todoLexer(chars);var tokens = new antlr4.CommonTokenStream(lexer);var parser = new TodoParser.todoParser(tokens);parser.buildParseTrees = true;var tree = parser.elements();console.log("Parsed: "+ tree);updateTree(tree, parser.ruleNames); }); </script>

干得好!

如果這不是您第一次閱讀此博客,您可能會懷疑某些代碼即將到來。 和往常一樣,代碼在GitHub上: https : //github.com/ftomassetti/antlr-web-example

下一步

下一步是執行錯誤處理:我們要捕獲錯誤并將其指向用戶。 然后,我們可能希望通過使用ACE來添加語法突出顯示。 這似乎是一個很好的起點:

  • https://github.com/antlr/antlr4/blob/master/doc/ace-javascript-target.md

我真的認為簡單的文本DSL可以幫助使多個應用程序更加強大。 但是,在網絡上創建良好的編輯體驗并非易事。 我想花更多時間玩這個。

翻譯自: https://www.javacodegeeks.com/2016/05/antlr-web-simple-example.html

antlr4例子

總結

以上是生活随笔為你收集整理的antlr4例子_ANTLR和网络:一个简单的例子的全部內容,希望文章能夠幫你解決所遇到的問題。

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