当前位置: 首页 > news >正文

唐山网站建设拓怎么设计网页主页

唐山网站建设拓,怎么设计网页主页,网站关键字如何选择,我做网站可以赚钱吗antlr java在我以前的文章中#xff0c;有一段时间我写了关于使用Java的内部DSL的文章。 在Martin Fowler撰写的《 领域特定语言 》一书中#xff0c;他讨论了另一种称为外部DSL的DSL#xff0c;其中DSL是用另一种语言编写的#xff0c;然后由宿主语言进行解析以填充语义模… antlr java 在我以前的文章中有一段时间我写了关于使用Java的内部DSL的文章。 在Martin Fowler撰写的《 领域特定语言 》一书中他讨论了另一种称为外部DSL的DSL其中DSL是用另一种语言编写的然后由宿主语言进行解析以填充语义模型。 在前面的示例中我讨论了有关创建用于定义图形的DSL的问题。 使用外部dsl的好处是图形数据中的任何更改都不需要重新编译程序而是程序可以仅加载外部dsl创建解析树然后填充语义模型。 语义模型将保持不变并且使用语义模型的优点是无需更改语义模型就可以对DSL进行修改。 在内部DSL和外部DSL之间的示例中我没有修改语义模型。 为了创建外部DSL我使用了ANTLR 。 什么是ANTLR 官方网站上给出的定义是 ANTLR另一种语言识别工具是功能强大的解析器生成器用于读取处理执行或翻译结构化文本或二进制文件。 它被广泛用于构建语言工具和框架。 ANTLR通过语法生成可以构建和遍历语法树的语法分析器。 根据以上定义ANTLR的显着特征是 用于结构化文本或二进制文件的解析器生成器 可以建造和行走解析树 语义模型 在此示例中我将利用ANTLR的上述功能来解析DSL然后遍历解析树以填充语义模型。 概括地说语义模型由Graph Edge和Vertex类组成它们分别表示Graph和Graph的Edge和Vertex。 下面的代码显示了类定义 public class Graph {private ListEdge edges;private SetVertex vertices;public Graph() {edges new ArrayList();vertices new TreeSet();}public void addEdge(Edge edge){getEdges().add(edge);getVertices().add(edge.getFromVertex());getVertices().add(edge.getToVertex());}public void addVertice(Vertex v){getVertices().add(v);}public ListEdge getEdges() {return edges;}public SetVertex getVertices() {return vertices;}public static void printGraph(Graph g){System.out.println(Vertices...);for (Vertex v : g.getVertices()) {System.out.print(v.getLabel() );}System.out.println();System.out.println(Edges...);for (Edge e : g.getEdges()) {System.out.println(e);}}}public class Edge {private Vertex fromVertex;private Vertex toVertex;private Double weight;public Edge() {}public Edge(Vertex fromVertex, Vertex toVertex, Double weight) {this.fromVertex fromVertex;this.toVertex toVertex;this.weight weight;}Overridepublic String toString() {return fromVertex.getLabel() to toVertex.getLabel() with weight getWeight();}public Vertex getFromVertex() {return fromVertex;}public void setFromVertex(Vertex fromVertex) {this.fromVertex fromVertex;}public Vertex getToVertex() {return toVertex;}public void setToVertex(Vertex toVertex) {this.toVertex toVertex;}public Double getWeight() {return weight;}public void setWeight(Double weight) {this.weight weight;} }public class Vertex implements ComparableVertex {private String label;public Vertex(String label) {this.label label.toUpperCase();}Overridepublic int compareTo(Vertex o) {return (this.getLabel().compareTo(o.getLabel()));}public String getLabel() {return label;}public void setLabel(String label) {this.label label;} }创建DSL 在创建语法规则之前让我们先提出语言的结构。 我打算提出的结构是这样的 Graph {A - B (10)B - C (20)D - E (30) } Graph块中的每条线代表一条边并且该边所涉及的顶点以及括号中的值代表该边的权重。 我要强制执行的一个限制是图不能具有悬空的顶点即不属于任何边线的顶点。 可以通过稍微更改语法来消除此限制但是我将其留给本帖子的读者练习。 创建DSL的首要任务是定义语法规则。 这些是词法分析器和解析器用来将DSL转换为抽象语法树 / 解析树的规则 。 然后ANTLR使用此语法生成解析器Lexer和侦听器它们不过是Java类用于扩展/实现ANTLR库中的某些类。 DSL的创建者必须利用这些Java类来加载外部DSL对其进行解析然后在解析器遇到某些节点时使用侦听器填充语义模型将其视为XML的SAX解析器的变体。 现在我们已经非常简短地了解了ANTLR可以做什么以及使用ANTLR的步骤我们将需要设置ANTLR即下载ANTLR API jar并设置一些脚本来生成解析器和词法分析器然后通过命令行尝试使用该语言。工具。 对于请访问这个从ANTLR官方教程显示了如何设置ANTLR和一个简单的Hello World例子。 DSL语法 现在您已经设置了ANTLR让我深入了解DSL的语法 grammar Graph; graph: Graph { edge }; vertex: ID; edge: vertex - vertex ( NUM ) ; ID: [a-zA-Z]; NUM: [0-9]; WS: [ \t\r\n] - skip; 让我们通过以下规则 graph: Graph { edge }; 上面的语法规则即开始规则说该语言应以“ Graph {”开头以“}”结尾并且必须至少包含一个边或多个边。 vertex: ID; edge: vertex - vertex ( NUM ) ; ID: [a-zA-Z]; NUM: [0-9]; 以上四个规则说一个顶点至少应具有一个字符或多个字符。 边定义为两个顶点的集合两个顶点之间用“-”分隔并且在“”中包含一些数字。 我将语法语言命名为“ Graph”因此一旦使用ANTLR生成Java类即解析器和词法分析器我们最终将看到以下类GraphParserGraphLexerGraphListener和GraphBaseListener。 前两个类处理解析树的生成后两个类处理解析树的遍历。 GraphListener是一个接口其中包含处理解析树的所有方法即处理事件例如输入规则退出规则访问终端节点此外还包含用于处理与输入图相关的事件的方法规则输入边缘规则并输入顶点规则。 我们将利用这些方法来拦截dsl中存在的数据然后填充语义模型。 填充语义模型 我在资源包中创建了一个文件graph.gr其中包含用于填充图形的DSL。 由于资源包中的文件在运行时可供ClassLoader使用因此我们可以使用ClassLoader读取DSL脚本然后将其传递给Lexer和解析器类。 使用的DSL脚本是 Graph {A - B (10)B - C (20)D - E (30)A - E (12)B - D (8) } 以及加载DSL并填充语义模型的代码 //Please resolve the imports for the classes used. public class GraphDslAntlrSample {public static void main(String[] args) throws IOException {//Reading the DSL scriptInputStream is ClassLoader.getSystemResourceAsStream(resources/graph.gr);//Loading the DSL script into the ANTLR stream.CharStream cs new ANTLRInputStream(is);//Passing the input to the lexer to create tokensGraphLexer lexer new GraphLexer(cs);CommonTokenStream tokens new CommonTokenStream(lexer);//Passing the tokens to the parser to create the parse trea. GraphParser parser new GraphParser(tokens);//Semantic model to be populatedGraph g new Graph();//Adding the listener to facilitate walking through parse tree. parser.addParseListener(new MyGraphBaseListener(g));//invoking the parser. parser.graph();Graph.printGraph(g);} }/*** Listener used for walking through the parse tree.*/ class MyGraphBaseListener extends GraphBaseListener {Graph g;public MyGraphBaseListener(Graph g) {this.g g;}Overridepublic void exitEdge(GraphParser.EdgeContext ctx) {//Once the edge rule is exited the data required for the edge i.e //vertices and the weight would be available in the EdgeContext//and the same can be used to populate the semantic modelVertex fromVertex new Vertex(ctx.vertex(0).ID().getText());Vertex toVertex new Vertex(ctx.vertex(1).ID().getText());double weight Double.parseDouble(ctx.NUM().getText());Edge e new Edge(fromVertex, toVertex, weight);g.addEdge(e);} } 执行上述操作时的输出为 Vertices... A B C D E Edges... A to B with weight 10.0 B to C with weight 20.0 D to E with weight 30.0 A to E with weight 12.0 B to D with weight 8.0 总而言之本文创建了一个外部DSL用于通过使用ANTLR填充图形数据。 我将增强这种简单的DSL并将其公开为实用程序供从事图形工作的程序员使用。 这篇文章非常讲究概念和代码您可以随意提出任何疑问以便我也可以尝试解决这些问题以使他人受益。 参考来自Experiences Unlimited博客的JCG合作伙伴 Mohamed Sanaulla 使用ANTLR和Java创建外部DSL 。 翻译自: https://www.javacodegeeks.com/2013/07/creating-external-dsls-using-antlr-and-java.htmlantlr java
http://www.zqtcl.cn/news/326566/

相关文章:

  • 网站制作价格与售后视频网站建设有什么意义
  • 网站建设+太原1核1g可以做几个网站
  • 电商设计网站有哪些内容西安百度推广外包
  • 深圳网站建设价格多少做废旧金属的网站
  • wordpress 文档超级优化空间
  • 湖北seo网站推广官方网站怎么制作
  • 随州网站seo诊断wordpress 只显示一个主题
  • 建站登录可信网站认证 费用
  • 互站网站源码用jsp做网站一般会用到什么
  • 个人免费设计网站fomo3d 网站怎么做
  • 菏泽做网站公司公关公司经营范围
  • 钓鱼网站营销型网站建设实战
  • 可以下载电影的网站怎么做做网站公司西安
  • 自己做签名网站网店美工培训教程
  • 宁波产品网站设计模板php 网站 教程
  • 制作一个网站的费用是多少免费网站空间怎么
  • 如何建立自己的微网站网站建设教程怎么建
  • seo网站项目讲解沈阳网红
  • 苏州大型网站建设公司网站外链优化
  • 阿里云购买域名后怎么建网站沂南网站设计
  • 网站建设基础考试php网站开发入门
  • 广州五屏网站建设seo诊断报告示例
  • 周浦高端网站建设公司信阳做网站的公司
  • 博客网站怎么建设湛江新闻头条最新消息
  • 外贸网站建设 评价有没有教做网站实例视频
  • 县 住房和城乡建设局网站wordpress接入支付宝
  • 网站建设初期推广方式天津网站建设案例
  • 销项税和进项导入是在国税网站做吗凡科网站模块
  • 苏州建网站皆去苏州聚尚网络常州企业建站系统
  • 网站建设明细wordpress 主题稳定