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

小说网站开发源码wordpress uk

小说网站开发源码,wordpress uk,2024年最新时事新闻,网站超链接怎么做 word概念 ANTLR#xff08;ANother Tool for Language Recognition#xff09;是一个强大的解析器生成工具#xff0c;用于读取、处理、执行或翻译结构化文本或二进制文件。ANTLR通过定义文法#xff08;grammar#xff09;来识别、构建和访问语言中的元素。 ANTLR为包括Jav…概念 ANTLRANother Tool for Language Recognition是一个强大的解析器生成工具用于读取、处理、执行或翻译结构化文本或二进制文件。ANTLR通过定义文法grammar来识别、构建和访问语言中的元素。 ANTLR为包括Java、C、C#在内的多种语言提供了一个通过语法描述来自动构造自定义语言的识别器recognizer、编译器parser和解释器translator的框架。ANTLR使用Adaptive LL(*) 语法分析技术进行语法分析支持词法分析、语法分析、语义分析以及代码生成等功能。 Antlr 提供了大量的官方Grammar示例包含了各种场景语言如SQL、Javascript等。 核心功能 1自动生成语法分析器ANTLR可以根据用户定义的语法规则自动生成相应的词法分析器和语法分析器无需手动编写复杂的语法分析代码 词法分析器Lexer负责将输入文本分割成一个个的标记Token。词法分析器不关心所生成的单个Token的语法意义及其与上下文之间的关系 语法分析器Parser使用词法分析器生成的标记来构建语法树。语法分析器关注Token之间的语法关系和上下文信息 2语法树构造ANTLR能够将输入文本转换为语法树ASTAbstract Syntax Tree使文本的结构更加清晰易懂 3语法错误提示ANTLR在解析过程中能够发现语法错误并提供详细的错误提示帮助用户快速定位和修复问题 4自定义语言支持ANTLR支持自定义语言的识别、解析和翻译为开发者提供了极大的灵活性 工作流程 1定义语法规则使用ANTLR的语法规范描述语言通常为.g4文件定义目标语言的语法规则 2生成解析器使用ANTLR工具根据语法规则文件自动生成词法分析器和语法分析器的源码 3编译解析器将自动生成的词法分析器和语法分析器的源代码拷贝到应用项目中编译成可执行文件或库 3使用解析器在应用程序中调用自动生成的解析器对输入的文本进行解析并根据生成的语法树进行其他处理 ANTLR准备 本篇以IDEA中使用 Antlr 4.x 为例。 4.1 Antlr插件安装 在使用之前要先安装Antlr插件。安装步骤如下 打开 File - Settings - Plugins 菜单中如图 选择插件市场搜索antlr。 如果搜索不了可以修改代理如图 在弹出的界面中选择自动代理并在url中输入 https://plugins.jetbrains.com/ 如果以上配置还是搜索不了可以直接在浏览器中访问JetBrains Marketplace在界面中搜索antlr并选择安装。如图 4.2 插件使用 Antlr 插件安装之后idea 开发工具中才能支持 .g4 文件的创建。 4.2.1 Generate ANTLR Recognizer 在 g4 文件中右击选择 “Generate ANTLR Recognizer”在项目的根目录自动创建一个 gen 目录自动生成词法分析器和语法分析器的源码。 如 Hello.g4 文件自动的文件如下 4.2.2 ANTLR Preview 在 Idea 中打开 “ANTLR Preview”如下 选择任意 g4 文件在左侧输入框中输入满足条件的信息右侧可以预览生成的解析树。 Hello 示例 5.1 示例 Antlr 支持正则表达式集合表示法。以下示例为使用 hello 开头的短语。 1创建 Hello.g4 文件文件内容如下 grammar Hello; // 定义名字 header {package com.jingai.antlr; } // java 的packages : hello ID | EOF ; // 匹配关键字hello和标志符 ID: [a-z] ; // 标识符由小写字母组成 WS: [ \t\r\n] - skip ; // 跳过空格、制表符、回车符和换行符 a文件以 grammar 开头名称跟着文件名 Hello bheader 可以用于指定自动生成的词法分析器等 java 文件的报名 c在本例中s 为解析树的root节点如上面 4.2.2 所示 dID 节点匹配任意长度的小写字母 匹配一次或多次*匹配零次或多次匹配零次或一次 e- skip 用于指定跳过的信息 fEOF 结束标识 2使用 ANTLR Preview可以预留生成的解析树如 4.2.2 所示 3使用 Generate ANTLR Recognizer自动生成词法分析器和语法分析器的源码如 4.2.1 所示 4在项目中创建一个包名称为 g4 文件中通过 header 指定。将自动生成的 java 文件拷贝到包中 5自定义Visitor代码如下 package com.jingai.anltr.hello;import org.antlr.v4.runtime.tree.ParseTree;import java.util.List;public class EvalVisitor extends HelloBaseVisitorString {Overridepublic String visitS(HelloParser.SContext ctx) {ListParseTree children ctx.children;StringBuffer sb new StringBuffer();for (ParseTree t : children) {System.out.println(visit child : t.getText());sb.append(t.getText()).append( );}return sb.toString();}}在 Antlr 中可以通过实现监听器Listener或访问者Visitor接口来遍历语法树。在自动生成的代码中除了词法分析器和语法分析器以外还生成了对应的 Listener 和 Visitor 接口以及基础的默认实现类。 5编写测试用例代码如下 package com.jingai.anltr.hello;import org.antlr.v4.runtime.CharStreams; import org.antlr.v4.runtime.CommonTokenStream;public class HelloTest {public static void main(String[] args) {// 创建词法分析器 hello world 字符串HelloLexer lexer new HelloLexer(CharStreams.fromString(hello world));// 获取tokenCommonTokenStream tokens new CommonTokenStream(lexer);// 解析tokenHelloParser parser new HelloParser(tokens);// 获取根rootHelloParser.SContext tree parser.s();EvalVisitor visitor new EvalVisitor();System.out.println(visitor.visit(tree));} }执行以上的测试用例打印的信息为 5.2 解析 在上面的自定义Visitor中在for循环中添加断点执行信息如下 1visitS() 方法访问根节点 s该根节点存在两个子节点分别为 hello 和 world 2子节点的类型为TerminalNodeImpl包含 symbol 和 parent 信息。其中symbol为当前节点的信息、parent为父节点信息 asymbol 为 CommonToken 类型打印的信息为[1,6:10world,2,1:6] bCommonToken 的 toString() 源码中返回的代码如下 return [ this.getTokenIndex() , // 索引从0开始this.start : this.stop // 开始和结束位置 txt , // 对应文本 typeString // 类型channelStr , // 频道信息在 g4 文件中可以通过 channel() 指定this.line : // 所在的行从1开始this.getCharPositionInLine() ]; // 所在行的开始位置从0开始 c结合以上分析[1,6:10world,2,1:6] 表示如下 1表示为第1个即第2个 6:10表示文本在第6个字符到第10个字符之间 2表示类型为2。可以在自动生成的代码中查看如 1:6表示在第1行从第6个字符开始 算式计算示例 以下通过计算表达式的解析计算表达式的值为例。 1创建Calcultor.g4文件代码如下 grammar Calculator;header {package com.jingai.antlr.calculator; } // java 的packageexpr: INT # int| expr op(*|/) expr # mulDiv| expr op(|-) expr # addSub| ( expr ) # brackets| EOF # e;INT : [0-9] ;MUL : * ; DIV : / ; ADD : ; SUB : - ;WS: [ \t\r\n] - skip ; // 跳过空格、制表符、回车符和换行符 a| 表示或的关系即 expr 是由 INT 或者乘除表达式或者加减表达式或者括号表达式组成 b在每一项后面使用 # 加字母在自动生成的Visitor或Listener中会自动生成对应的visit或enter方法。如 # mulDiv在CalcultorVisiter中自动生成 visitMulDiv()方法 二义性处理 所谓的二义性是指解析的信息同时匹配多种语法结构。如上面算式表达式如果要解析的是 5 2 * 3那么 5 2 匹配了加法表达式2 * 3 匹配了乘法表达式此时就存在二义性。 在 Antlr 中通过使输入字符串和语法中第一个指定的规则匹配来解决词法二义性。 如上面的 5 2 * 3因为在语法定义中乘除是放在加减前面所以会匹配先匹配乘法。解析树为 如果在语法中修改乘除和加减的位置同一个表达式解析树为 2通过 Generate ANTLR Recognizer 自动生成源码并拷贝到项目 3编写Visiter类进行算式运算代码如下 package com.jingai.anltr.calculator;public class MyCalculatorVisitor extends CalculatorBaseVisitorInteger {/*** 加减运算*/Overridepublic Integer visitAddSub(CalculatorParser.AddSubContext ctx) {// 获取加减运算左右的数字Integer left visit(ctx.expr(0));Integer right visit(ctx.expr(1));// 根据计算类型执行相应计算并返回计算结果if(ctx.op.getType() CalculatorParser.ADD) {return left right;}return left - right;}/*** 乘除运算*/Overridepublic Integer visitMulDiv(CalculatorParser.MulDivContext ctx) {// 获取乘除运算左右的数字Integer left visit(ctx.expr(0));Integer right visit(ctx.expr(1));if(ctx.op.getType() CalculatorParser.MUL) {return left * right;}return left / right;}Overridepublic Integer visitInt(CalculatorParser.IntContext ctx) {return Integer.parseInt(ctx.INT().getText());}Overridepublic Integer visitBrackets(CalculatorParser.BracketsContext ctx) {return visit(ctx.expr());} }4编写测试用例代码如下 package com.jingai.anltr.calculator;import org.antlr.v4.runtime.CharStreams; import org.antlr.v4.runtime.CommonTokenStream;public class CalculatorTest {public static void main(String[] args) {CalculatorLexer lexer new CalculatorLexer(CharStreams.fromString(12-(3*3)8-4/2));CommonTokenStream tokens new CommonTokenStream(lexer);CalculatorParser parser new CalculatorParser(tokens);CalculatorParser.ExprContext tree parser.expr();MyCalculatorVisitor visitor new MyCalculatorVisitor();System.out.println(visitor.visit(tree));} }执行结果如下 其他语法 1通过parser::members{}添加 java 代码该代码会自动添加到Parser解析器中 2使用locals定义局部变量添加 java 代码对应代码会自动添加到Parser解析器对应的标签解析中 3默认情况下Antlr 从左到右结合运算符进行解析对于特殊情况需要从右到左的可以使用assoc手动指定示例如下 expr : expr ^assocright expr // 运算符是右结合的| INT; 4支持语义谓词添加示例如下 // 示例一 group : INT sequence[$INT.int]; // INT为int类型sequence[int n] locals [int i 1;] // 在自动生成的Parser类的sequence()方法中会添加 int n 的参数: ({$i $n}? INT {$i;})* ;INT : [0-9] ;// 示例二 predicates: expression predicate[$expression.ctx]? // expression的ctx为ParserRuleContext类型;predicate[ParserRuleContext value] : // 在自动生成的Parser类的predicate()方法中会添加ParserRuleContext value的参数expression: STR; 小结 本篇分析到这里以下做一个小结 1Antlr 用于按照编写的语法规则解析文本字符串。语法支持正则表达式规则 先将文本按词进行分解而后通过语法进行匹配分析。 2通过 ANTLR Preview可以预留解析树 3通过 Generate ANTLR Recognizer可以自动生成词法分析器和语法分析器 在语法中可以按照特定格式添加对应语言的代码代码将自动添加在Parser语法分析器中。也可在自动生成后的Parser语法分析器代码中进行修改该种方式不太规范 4通过继承自动生成的Visiter或Listener可以对解析后的信息进行提取即相应处理 关于本篇内容你有什么自己的想法或独到见解欢迎在评论区一起交流探讨下吧。 参考 《ANTLR 4简明教程》 - 书栈网 · BookStack GitHub - antlr/grammars-v4: Grammars written for ANTLR v4; expectation that the grammars are free of actions.
http://www.dnsts.com.cn/news/141441.html

相关文章:

  • 安徽省城乡建设厅网站wordpress可以管理现有网啊
  • 做网站一屏是多大wordpress html5 win8
  • 成都食品网站开发有个性的个人网站
  • 泰安有口碑的企业建站公司华宁网站建设
  • 网站建设houxiaoer大连网络公司排名
  • 大连网站排名推广最新科技新闻消息
  • 用网站做数据库吗为网站做安全认证服务
  • 《网站开发实践》 实训报告什么网站必须要flash
  • 酒泉市住房和城乡建设局网站网站开发后端开发
  • asp网站建设教程游昕手游代理平台
  • 广州市从化区住房和建设据网站高端品质网站建设
  • 大兴安岭网站制作wordpress能做任何网站
  • 上海大规模网站建设平台商业网站排名
  • 企业网站维护更新外贸自建站平台价格
  • 绿地建设集团网站百度云搭建网站
  • 国外英语写作网站校园网站建设培训班
  • 温州建设信息港网站做网站快速排名软件
  • 建设部网站规范查询男女做羞羞羞的事视频网站
  • 重庆千牛建设工程有限公司网站苏州企业网站制作设计公司
  • 济南做网站推广有哪些公司扬州百度seo
  • 保洁公司做网站有什么作用河北城乡建设官方网站
  • 专做酒的小程序网站如何做网站栏目规划
  • php快速建网站东莞 企业网站建设
  • 网站制作的重要流程图大连哪家公司做网站好
  • 骨骼型的网站可以免费注册网站
  • 新闻单位网站建设的意义中环互联网网站建设套餐
  • 北京建设执业资格注册网站哪里可以学效果图制作
  • asp.net网站设计有没有做相册的网站
  • 画册设计网站重庆有几个区
  • 平顶山网站建设电话网站用户告知书