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。

我们将添加一个文本区域和一个按钮。 当用户单击按钮时,我们将解析文本区域的内容。 简单吧?

Selection_052

这是此设计杰作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返回的树的结构。

Selection_054

显示结果

如果我们正在构建某种TODO应用程序,我们可能希望以某种方式表示用户通过DSL插入的信息。

让我们得到这样的东西:

Selection_053

为此,我们基本上需要添加功能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例子

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/336264.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【WebRTC---入门篇】(十)NAT

NAT主要用于内网穿透 NAT产生原因 NAT的种类 NAT穿越原理 完全锥型:内网主机先向外发送一个请求形成IP和port

maven java1.7_本周Java技巧#7 – Maven慢吗?

maven java1.7本周Java本周技巧是有关Maven的上一期的后续内容。 第一个视频介绍了与Maven依赖关系有关的方面。 该视频将介绍一些加快Maven构建速度的技术。 Maven慢吗&#xff1f; 从Maven 3开始&#xff0c;您可以并行运行构建。 根据构建机器和项目结构的不同&#xff0c;…

【WebRTC---入门篇】(十一)STUN协议

STUN作用:用于NAT穿越;它是典型的CS模式 RFC STUN规范 STUN header STUN Header格式

mysql数据迁移到sqlserver_一个通用数据库操作组件DBUtil(c#)、支持SqlServer、Oracle、Mysql、postgres、SQLITE...

这是一个.net下操作数据库(结构数据库)的工具类&#xff0c;支持sqlserver、oracle、mysql、postgres、sqlite、access等常见数据库。注意&#xff1a;它并不是一个orm工具(常见的orm框架如&#xff1a;EF、Dapper等)。2.1 引入DBUtil依赖1. 首先打开vs(推荐vs2019)&#xff0c…

【H.264/AVC视频编解码技术】第二章【H264码流分析】

H264码流分层 NAL层,视频数据网络抽象层,作用是控制二进制数据的传输,主要用于网络传输。 VCL层,视频数据编码层。 VCL结构关系 NALU NAL Header (1B)+ RBSP H264码流中NALU sps pps IDR帧的理解 概念 什么是NALU? H264码流可以分为两层,VCL层和NAL层,NAL的全称…

android相册管理,Piktures - 最优雅的相册管理 - Android 应用 - 【最美应用】

多维度管理&#xff0c;美到每一个细节Piktures 的优雅&#xff0c;首先在于其浏览、管理的维度设计上。Android 原生相册最为人所诟病的就是其乱糟糟的浏览体验&#xff0c;所有带图片的文件夹都毫无章法地直接呈现。而 Piktures 则做了全面的改进。左滑即开打开文件夹管理模式…

【H264码流分析】 SPS/PPS/Slice Header

SPS中相关 H264 Profile 对视频压缩特性的描述&#xff0c;Profile越高&#xff0c;就说明采用了越高级的压缩特性 H264 Level Level是对视频的描述,Levrl越高&#xff0c;视频的码率&#xff0c;分辨率&#xff0c;fps越高 分辨率 帧相关 帧率计算 PPS Slice Header

access update语句执行_SQL Server与Access数据库sql语法十大差异

本文总结了SQL Server与Access数据库sql语法的十大差异。ACCESS结构简单容易处理&#xff0c;而且也能满足多数的应用程序要求&#xff0c;也是初学者的试牛刀。随着时间的推移&#xff0c;大多数数据库应用程序都会发展&#xff0c;变得更复杂&#xff0c;并且需要支持更多用户…

junit测试起名字规则_如何在JUnit 5中替换规则

junit测试起名字规则最近发布的JUnit 5&#xff08;又名JUnit Lambda&#xff09; alpha发行版引起了我的兴趣&#xff0c;在浏览文档时&#xff0c;我注意到规则以及运行程序和类规则都消失了。 根据文档&#xff0c;这些部分竞争的概念已被单个一致的扩展模型取代。 多年来&…

android照片编辑软件,照片编辑免费软件下载-照片编辑软件app下载 v7.45最新版_5577安卓网...

照片编辑免费软件app下载&#xff0c;提供给你全新的图片处理工具&#xff0c;这是软件包含了丰富的功能内容&#xff0c;软件一键即可轻松对各种照片組合、编辑和拼貼&#xff0c;那么有需要图片处理的用户下载该app使用吧&#xff01;【软件特色】【 拼图编辑&#xff1a;强大…

扩展 junit 框架_JUnit 5 –扩展模型

扩展 junit 框架我们已经对Java最普遍的测试框架的下一个版本了解很多。 现在&#xff0c;让我们看一下JUnit 5扩展模型&#xff0c;该模型将允许库和框架将自己的实现添加到JUnit中。 总览 建立 基本 建筑 扩展模型 条件 注射 … 在新兴的《 JUnit 5用户指南》中可以找…

【WebRTC---入门篇】(十二)WebRTC传输协议

浏览器协议栈(左图传统HTTP 右图WebRTC) RTP/SRTP RTP是未加密的数据,SRTP是加密后的数据。 RTP协议

springcloud官方文档_通俗易懂!Spring Cloud简介:官方文档翻译版

什么是微服务&#xff1f;"微服务架构是一种架构模式&#xff0c;它提倡将单一应用程序划分成一组小的服务&#xff0c;服务之间相互协调、互相配合&#xff0c;为用户提供最终价值。每个服务运行在其独立的进程中&#xff0c;服务和服务之间采用轻量级的通信机制相互沟通…

【RTMP协议分析与抓包实测】

传输协议 RTMP基本通讯 RTMP基于TCP之上传输 TCP三次握手,相关文章链接&#xff0c;TCP三次握手流程 进行握手 c- --> s 发送c0c1 c ---> s 发送c2 s ---> c 发送s0s1s2 建立RTMP连接 真实建立连接的场景 c- --> s RTMP发送connect建立连接 s ---> c 协商(滑动…

【WebRTC---入门篇】(十三)WebRTC音视频数据采集

音视频采集API false表示不采集,true表示采集 WebRTC API适配 获取音视频设备的访问权限 通过 return navigator.mediaDevices.enumerateDevices();/*返回一个promise,为了获取音视频的权限*/ 视频约束

app登录界面背景 css_计算机毕业设计中Java web实现简登录页面(MyBatis+jsp+servlet+html+css+javascript)...

点击上方“蓝字”&#xff0c;关注我们.本文利用MyBatisjspservlethtmlcssjavascript实现了一个简单的登录页面。对用户输入的用户名和密码就行校验&#xff0c;校验通过则登录成功&#xff0c;密码和用户信息保存在mysql表中&#xff0c;通过MyBatis访问(MyBatis相关知识可参考…

android strm,Android 关于so文件的随记

1.背景&#xff1a;项目中要集成商汤的活体检测sdk&#xff0c;2.遇到的问题&#xff1a;商汤提供的demo 可以正常运行&#xff0c;但是将sdk集成至项目中时一直报错&#xff0c;但是商汤侧却没办法提供具体的报错原因3.解决问题&#xff1a;反编译商汤的源码发现&#xff0c;报…

【WebRTC---入门篇】(十五)WebRTC信令服务器实现

如何使用socket.io发送消息 io代表整个节点

activiti高亮显示图片_如今透明LED显示屏成为广告橱窗,它们之间有什么关联?...

如今我们在街道行走时&#xff0c;我们就会看到各种玻璃橱窗&#xff0c;这是商家想利用橱窗进行不同产品宣传角度。其实无论是海报、灯箱或是实物展示&#xff0c;这些都是商家通过橱窗广告进行来吸引消费者&#xff0c;而现在是5G时代到来使橱窗数字化营销成为了一种新的趋势…