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

如何在公司服务器建个内部 网站苏州网站制作网络建设公司

如何在公司服务器建个内部 网站,苏州网站制作网络建设公司,南京建设监理协会网站,企业网站优化兴田德润文章目录 什么是ANTLR?第一个例子ANTLR4 的工作流程Lua脚本语法校验准备一个Lua Grammar文件maven配置新建实体类Lua语法遍历器语法错误监听器单元测试 参考 什么是ANTLR? https://www.antlr.org/ ANTLR (ANother Tool for Language Recognition) is a…

文章目录

  • 什么是ANTLR?
  • 第一个例子
  • ANTLR4 的工作流程
  • Lua脚本语法校验
    • 准备一个Lua Grammar文件
    • maven配置
    • 新建实体类
    • Lua语法遍历器
    • 语法错误监听器
    • 单元测试
  • 参考

什么是ANTLR?

https://www.antlr.org/

ANTLR (ANother Tool for Language Recognition) is a powerful parser generator for reading, processing, executing, or translating structured text or binary files. It’s widely used to build languages, tools, and frameworks. From a grammar, ANTLR generates a parser that can build and walk parse trees.

ANTLR(ANother Tool for Language Recognition)是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件。 它被广泛用于构建语言、工具和框架。ANTLR 根据语法定义生成解析器,解析器可以构建和遍历解析树。

第一个例子

https://github.com/antlr/antlr4/blob/master/doc/getting-started.md#a-first-example

  1. 新建个Hello.g4文件:
// Define a grammar called Hello
grammar Hello;
r  : 'hello' ID ;         // match keyword hello followed by an identifier
ID : [a-z]+ ;             // match lower-case identifiers
WS : [ \t\r\n]+ -> skip ; // skip spaces, tabs, newlines
  1. 安装IDEA插件
    ANTLR v4:https://plugins.jetbrains.com/plugin/7358-antlr-v4

  2. 打开ANTLR Preview
    r : 'hello' ID ; // match keyword hello followed by an identifier这行上右键,点击Test Rule r
    输入hello world,能够准确识别出ID为word。
    在这里插入图片描述
    输入hello World,就不能够识别出ID为world了。
    在这里插入图片描述

ANTLR4 的工作流程

  • 词法分析器 (Lexer) :将字符序列转换为单词(Token)的过程。词法分析器(Lexer)一般是用来供语法解析器(Parser)调用的。
  • 语法解析器 (Parser) :通常作为编译器或解释器出现。它的作用是进行语法检查,并构建由输入单词(Token)组成的数据结构(即抽象语法树)。语法解析器通常使用词法分析器(Lexer)从输入字符流中分离出一个个的单词(Token),并将单词(Token)流作为其输入。实际开发中,语法解析器可以手工编写,也可以使用工具自动生成。
  • 抽象语法树 (Parse Tree) :是源代码结构的一种抽象表示,它以树的形状表示语言的语法结构。抽象语法树一般可以用来进行代码语法的检查,代码风格的检查,代码的格式化,代码的高亮,代码的错误提示以及代码的自动补全等。
    在这里插入图片描述
    如上左边的点线流程代表了通过 ANTLR4,将原始的.g4 规则转化为 Lexer、Parser、Listener 和 Visitor。右边的虚线流程代表了将原始的输入流通过 Lexer 转化为 Tokens,再将 Tokens 通过 Parser 转化为语法树,最后通过 Listener 或 Visitor 遍历 ParseTree 得到最终结果。

Lua脚本语法校验

准备一个Lua Grammar文件

https://github.com/antlr/grammars-v4/tree/master/lua

/*
BSD LicenseCopyright (c) 2013, Kazunori Sakamoto
Copyright (c) 2016, Alexander Alexeev
All rights reserved.Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:1. Redistributions of source code must retain the above copyrightnotice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyrightnotice, this list of conditions and the following disclaimer in thedocumentation and/or other materials provided with the distribution.
3. Neither the NAME of Rainer Schuster nor the NAMEs of its contributorsmay be used to endorse or promote products derived from this softwarewithout specific prior written permission.THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.This grammar file derived from:Lua 5.3 Reference Manualhttp://www.lua.org/manual/5.3/manual.htmlLua 5.2 Reference Manualhttp://www.lua.org/manual/5.2/manual.htmlLua 5.1 grammar written by Nicolai Mainierohttp://www.antlr3.org/grammar/1178608849736/Lua.gTested by Kazunori Sakamoto with Test suite for Lua 5.2 (http://www.lua.org/tests/5.2/)Tested by Alexander Alexeev with Test suite for Lua 5.3 http://www.lua.org/tests/lua-5.3.2-tests.tar.gz
*/grammar Lua;chunk: block EOF;block: stat* retstat?;stat: ';'| varlist '=' explist| functioncall| label| 'break'| 'goto' NAME| 'do' block 'end'| 'while' exp 'do' block 'end'| 'repeat' block 'until' exp| 'if' exp 'then' block ('elseif' exp 'then' block)* ('else' block)? 'end'| 'for' NAME '=' exp ',' exp (',' exp)? 'do' block 'end'| 'for' namelist 'in' explist 'do' block 'end'| 'function' funcname funcbody| 'local' 'function' NAME funcbody| 'local' attnamelist ('=' explist)?;attnamelist: NAME attrib (',' NAME attrib)*;attrib: ('<' NAME '>')?;retstat: 'return' explist? ';'?;label: '::' NAME '::';funcname: NAME ('.' NAME)* (':' NAME)?;varlist: var_ (',' var_)*;namelist: NAME (',' NAME)*;explist: exp (',' exp)*;exp: 'nil' | 'false' | 'true'| number| string| '...'| functiondef| prefixexp| tableconstructor| <assoc=right> exp operatorPower exp| operatorUnary exp| exp operatorMulDivMod exp| exp operatorAddSub exp| <assoc=right> exp operatorStrcat exp| exp operatorComparison exp| exp operatorAnd exp| exp operatorOr exp| exp operatorBitwise exp;prefixexp: varOrExp nameAndArgs*;functioncall: varOrExp nameAndArgs+;varOrExp: var_ | '(' exp ')';var_: (NAME | '(' exp ')' varSuffix) varSuffix*;varSuffix: nameAndArgs* ('[' exp ']' | '.' NAME);nameAndArgs: (':' NAME)? args;/*
var_: NAME | prefixexp '[' exp ']' | prefixexp '.' NAME;prefixexp: var_ | functioncall | '(' exp ')';functioncall: prefixexp args | prefixexp ':' NAME args;
*/args: '(' explist? ')' | tableconstructor | string;functiondef: 'function' funcbody;funcbody: '(' parlist? ')' block 'end';parlist: namelist (',' '...')? | '...';tableconstructor: '{' fieldlist? '}';fieldlist: field (fieldsep field)* fieldsep?;field: '[' exp ']' '=' exp | NAME '=' exp | exp;fieldsep: ',' | ';';operatorOr: 'or';operatorAnd: 'and';operatorComparison: '<' | '>' | '<=' | '>=' | '~=' | '==';operatorStrcat: '..';operatorAddSub: '+' | '-';operatorMulDivMod: '*' | '/' | '%' | '//';operatorBitwise: '&' | '|' | '~' | '<<' | '>>';operatorUnary: 'not' | '#' | '-' | '~';operatorPower: '^';number: INT | HEX | FLOAT | HEX_FLOAT;string: NORMALSTRING | CHARSTRING | LONGSTRING;// LEXERNAME: [a-zA-Z_][a-zA-Z_0-9]*;NORMALSTRING: '"' ( EscapeSequence | ~('\\'|'"') )* '"';CHARSTRING: '\'' ( EscapeSequence | ~('\''|'\\') )* '\'';LONGSTRING: '[' NESTED_STR ']';fragment
NESTED_STR: '=' NESTED_STR '='| '[' .*? ']';INT: Digit+;HEX: '0' [xX] HexDigit+;FLOAT: Digit+ '.' Digit* ExponentPart?| '.' Digit+ ExponentPart?| Digit+ ExponentPart;HEX_FLOAT: '0' [xX] HexDigit+ '.' HexDigit* HexExponentPart?| '0' [xX] '.' HexDigit+ HexExponentPart?| '0' [xX] HexDigit+ HexExponentPart;fragment
ExponentPart: [eE] [+-]? Digit+;fragment
HexExponentPart: [pP] [+-]? Digit+;fragment
EscapeSequence: '\\' [abfnrtvz"'\\]| '\\' '\r'? '\n'| DecimalEscape| HexEscape| UtfEscape;fragment
DecimalEscape: '\\' Digit| '\\' Digit Digit| '\\' [0-2] Digit Digit;fragment
HexEscape: '\\' 'x' HexDigit HexDigit;fragment
UtfEscape: '\\' 'u{' HexDigit+ '}';fragment
Digit: [0-9];fragment
HexDigit: [0-9a-fA-F];COMMENT: '--[' NESTED_STR ']' -> channel(HIDDEN);LINE_COMMENT: '--'(                                               // --| '[' '='*                                      // --[==| '[' '='* ~('='|'['|'\r'|'\n') ~('\r'|'\n')*   // --[==AA| ~('['|'\r'|'\n') ~('\r'|'\n')*                // --AAA) ('\r\n'|'\r'|'\n'|EOF)-> channel(HIDDEN);WS: [ \t\u000C\r\n]+ -> skip;SHEBANG: '#' '!' ~('\n'|'\r')* -> channel(HIDDEN);

maven配置

使用JDK8的注意:antlr4最高版本为4.9.3,原因如下:
来源:https://github.com/antlr/antlr4/releases/tag/4.10

Increasing minimum java version
Going forward, we are using Java 11 for the source code and the compiled .class files for the ANTLR tool. The Java runtime target, however, and the associated runtime tests use Java 8 (bumping up from Java 7).

<dependencies><dependency><groupId>org.antlr</groupId><artifactId>antlr4-runtime</artifactId><version>${antlr.version}</version></dependency>
</dependencies><build><plugins><plugin><groupId>org.antlr</groupId><artifactId>antlr4-maven-plugin</artifactId><version>${antlr.version}</version><configuration><visitor>true</visitor><listener>true</listener></configuration><executions><execution><goals><goal>antlr4</goal></goals></execution></executions></plugin></plugins>
</build><properties><!--https://mvnrepository.com/artifact/org.antlr/antlr4-runtime--><antlr.version>4.9.3</antlr.version><mojo.version>3.0.0</mojo.version>
</properties>

新建实体类

语法错误:每行有什么错误。

package com.baeldung.antlr.lua.model;/*** 语法错误** @author duhongming* @see* @since 1.0.0*/
public class SyntaxErrorEntry {private Integer lineNum;private String errorInfo;public Integer getLineNum() {return lineNum;}public void setLineNum(Integer lineNum) {this.lineNum = lineNum;}public String getErrorInfo() {return errorInfo;}public void setErrorInfo(String errorInfo) {this.errorInfo = errorInfo;}
}

语法错误报告:每行有什么错误的集合。

package com.baeldung.antlr.lua.model;import java.util.LinkedList;
import java.util.List;/*** 语法错误报告** @author duhongming* @see* @since 1.0.0*/
public class SyntaxErrorReportEntry {private final List<SyntaxErrorEntry> syntaxErrorList = new LinkedList<>();public void addError(int line, int charPositionInLine, Object offendingSymbol, String msg) {SyntaxErrorEntry syntaxErrorEntry = new SyntaxErrorEntry();syntaxErrorEntry.setLineNum(line);syntaxErrorEntry.setErrorInfo(line + "行," + charPositionInLine + "列," + offendingSymbol + "字符处,存在语法错误:" + msg);syntaxErrorList.add(syntaxErrorEntry);}public List<SyntaxErrorEntry> getSyntaxErrorReport() {return syntaxErrorList;}
}

Lua语法遍历器

package com.baeldung.antlr.lua;import com.baeldung.antlr.LuaParser;
import com.baeldung.antlr.LuaVisitor;
import org.antlr.v4.runtime.tree.ErrorNode;
import org.antlr.v4.runtime.tree.ParseTree;
import org.antlr.v4.runtime.tree.RuleNode;
import org.antlr.v4.runtime.tree.TerminalNode;/*** Lua语法遍历器** @author duhongming* @see* @since 1.0.0*/
public class LuaSyntaxVisitor implements LuaVisitor<Object> {
// ctrl+O Override即可
}

语法错误监听器

package com.baeldung.antlr.lua;import com.baeldung.antlr.lua.model.SyntaxErrorReportEntry;
import org.antlr.v4.runtime.BaseErrorListener;
import org.antlr.v4.runtime.RecognitionException;
import org.antlr.v4.runtime.Recognizer;/*** 语法错误监听器** @author duhongming* @see* @since 1.0.0*/
public class SyntaxErrorListener extends BaseErrorListener {private final SyntaxErrorReportEntry reporter;public SyntaxErrorListener(SyntaxErrorReportEntry reporter) {this.reporter = reporter;}@Overridepublic void syntaxError(Recognizer<?, ?> recognizer,Object offendingSymbol, int line, int charPositionInLine,String msg, RecognitionException e) {this.reporter.addError(line, charPositionInLine, offendingSymbol, msg);}
}

单元测试

package com.baeldung.antlr;import com.baeldung.antlr.lua.LuaSyntaxVisitor;
import com.baeldung.antlr.lua.SyntaxErrorListener;
import com.baeldung.antlr.lua.model.SyntaxErrorEntry;
import com.baeldung.antlr.lua.model.SyntaxErrorReportEntry;
import org.antlr.v4.runtime.CharStream;
import org.antlr.v4.runtime.CharStreams;
import org.antlr.v4.runtime.CommonTokenStream;
import org.junit.Test;import java.util.List;import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;public class LuaSyntaxErrorUnitTest {public static List<SyntaxErrorEntry> judgeLuaSyntax(String luaScript) {//新建一个CharStream,读取数据CharStream charStreams = CharStreams.fromString(luaScript);//包含一个词法分析器的定义,作用是将输入的字符序列聚集成词汇符号。LuaLexer luaLexer = new LuaLexer(charStreams);//新建一个词法符号的缓冲区,用于存储词法分析器生成的词法符号(Token)CommonTokenStream tokenStream = new CommonTokenStream(luaLexer);//新建一个语法分析器,用于分析词法符号缓冲区中的词法符号LuaParser luaParser = new LuaParser(tokenStream);SyntaxErrorReportEntry syntaxErrorReporter = new SyntaxErrorReportEntry();SyntaxErrorListener errorListener = new SyntaxErrorListener(syntaxErrorReporter);luaParser.addErrorListener(errorListener);LuaSyntaxVisitor luaSyntaxVisitor = new LuaSyntaxVisitor();luaSyntaxVisitor.visit(luaParser.chunk());return syntaxErrorReporter.getSyntaxErrorReport();}@Testpublic void testGood() throws Exception {List<SyntaxErrorEntry> errorEntryList = judgeLuaSyntax("if a~=1 then print(1) end");assertThat(errorEntryList.size(), is(0));}@Testpublic void testBad() throws Exception {//新建一个CharStream,读取数据List<SyntaxErrorEntry> errorEntryList = judgeLuaSyntax("if a!=1 then print(1) end");assertThat(errorEntryList.size(), is(2));}
}

最终目录情况,及单元测试情况!
在这里插入图片描述

参考

https://www.baeldung.com/java-antlr
https://juejin.cn/post/7018521754125467661
https://www.nosuchfield.com/2023/08/26/ANTLR4-from-Beginning-to-Practice/
https://blog.csdn.net/qq_37771475/article/details/106387201
https://blog.csdn.net/qq_37771475/article/details/106426327


文章转载自:

http://VHS7ybBj.zqdzg.cn
http://x9Tq5aYG.zqdzg.cn
http://LxMrSy5W.zqdzg.cn
http://Od5KPCs4.zqdzg.cn
http://uJadq419.zqdzg.cn
http://TOwW2vHJ.zqdzg.cn
http://zUPS1IxU.zqdzg.cn
http://hDjfMWq9.zqdzg.cn
http://UegMHW6K.zqdzg.cn
http://5mi2dH3d.zqdzg.cn
http://3G870KNL.zqdzg.cn
http://jqcSNKhM.zqdzg.cn
http://C3Ci0t1u.zqdzg.cn
http://6EBD6Gns.zqdzg.cn
http://7DssrvWz.zqdzg.cn
http://Mo4AUXE6.zqdzg.cn
http://RAH9ZHLK.zqdzg.cn
http://m4l8bEak.zqdzg.cn
http://kziYVKDE.zqdzg.cn
http://92bcdJlN.zqdzg.cn
http://tfnXP5vb.zqdzg.cn
http://DBY419Qb.zqdzg.cn
http://V2YmNVLE.zqdzg.cn
http://E2jnZdit.zqdzg.cn
http://G0X3304r.zqdzg.cn
http://3etRzxP1.zqdzg.cn
http://rK0xfhZO.zqdzg.cn
http://YxBnOAlT.zqdzg.cn
http://XpJOc9zV.zqdzg.cn
http://TZoZPS4r.zqdzg.cn
http://www.dtcms.com/wzjs/716638.html

相关文章:

  • 福州做网站的成都企业网站优化服务
  • 网站微信推广方案企业管理软件a6
  • 受大众喜欢的域名备案加急惠州市seo广告优化营销工具
  • 广东省公路建设有限公司网站泸州住房城乡建设局官方网站
  • 广告公司做的网站字体侵权文字创意logo设计
  • 精通网站建设 pdf深圳工装公司
  • 如何查看网站是否被kwordpress 批量删除
  • 怀化新站优化深圳住建局官方网电话
  • dedecms图片网站模板淄博网站排名
  • 免费制作主图的网站厦门网站建设解决方案
  • 微信购物网站开发自己怎样开网站
  • 做二手房产网站多少钱网络优化行业怎么样
  • 网站建设合同服务响应时间wordpress二级
  • 大气的企业网站设计黑龙江省建设工程招标网站
  • 建设厅网站贵州人事考试信息网织梦cms做企业网站
  • 站长工具外链查询如何建立网站 个人
  • 深圳网站优化多少钱现货交易平台排名
  • 承接网站建设文案小学生做创客大赛网站的题
  • 自建网站和第三方平台的区别做网站公司需要提供的资料
  • 济阳做网站公司宝塔本地wordpress
  • 毕设做网站太简单网站制作设计正规公司
  • 做网站专业python自动写wordpress
  • 建设网站要学编程吗wordpress 点赞 用户
  • 网站建站卖首饰侵权wordpress 短代码失效
  • 网站建设个人工作室可口可乐公司建设网站的目的是什么意思
  • 188旅游网站源码wordpress手机版弹出式导航
  • 个人淘客网站备案国外做二手服装网站
  • 只有网站才需要域名吗做网站用什么工具好
  • 建网站需要什么手需自学开发一个游戏app
  • 网站建设毕业设计总结网站模板 整站源码