高段位氣質御姐【功夫不好不要找我】姐妹花~連體絲襪~大奶晃動~絲襪騷腳 /
ANTLR4(全称为'ANother Tool for Language Recognition')是一种用于构建谈话识别器的弘大器具。它是一个自动生成的证据器生成器free_porn,使用ANTLR4不错匡助开发东谈主员快速创建自界说的谈话或DSL。
ANTLR4的特质 援手多种办法谈话,包括Java、C#、Python、JavaScript等。援手LL(*)(LL star)语法分析器,不错照应包含汗漫数办法上前看象征(lookahead)的语法。援手词法和语法伪善照应,不错生成显着的伪善音信和收复战略。援手生成AST(概括语法树),通俗谈话照应器进行语法分析和代码生成。提供了丰富的API和器具集,不错自界说和优化ANTLR4生成的证据器。 ANTLR4的语法规矩 语法规矩的声明ANTLR4的语法规矩必须以“grammar”关键字开动,背面随着语法规矩的称号。举例:
grammar MyGrammar;
这里声明了一个名为'MyGrammar'的语法规矩。
.g4文献的代码规矩 词法规矩ANTLR4语法规矩以词法规矩(lexer rules)开动。词法规矩界说了输入文本中的各个单词(或象征),这些单词将被语法规矩使用。每个词法规矩界说一个单词的称号和匹配该单词的正则抒发式。
以下是一个约略的例子:
// 界说变量名为一个字母后跟零个或多个字母、数字或下划线 ID : [a-zA-Z] [a-zA-Z0-9_]*;
在这个例子中,咱们界说了一个名为ID的词法规矩,该规矩匹配一个以字母开头,后跟零个或多个字母、数字或下划线的字符串。在语法规矩中,咱们不错使用ID来匹配变量名。
语法规矩ANTLR4语法规矩界说了输入文本的结构。语法规矩由词法规矩和其他语法规矩构成,界说了输入文本的结构。语法规矩频繁以一个称为start的语法规矩开动,这个语法规矩界说了通盘输入文本的结构。
以下是一个约略的例子:
// 界说一个约略的算术抒发式语法规矩 expr : INT | expr op=('*' | '/') expr | expr op=('+' | '-') expr | '(' expr ')' ; INT : [0-9]+;
在这个例子中,咱们界说了一个名为expr的语法规矩,该规矩界说了一个约略的算术抒发式。该规矩由四个子规矩构成,每个子规矩界说了一种抒发式。第一个子规矩匹配整数,第二个和第三个子规矩匹配乘法、除法、加法和减法,临了一个子规矩匹配括号中的抒发式。咱们还界说了一个名为INT的词法规矩,该规矩匹配一个或多个数字。在这个例子中,咱们使用INT来匹配整数。
语法规矩中的操作// 界说一个带有语义谓词的语法规矩 expr : INT { $INT.text.equals('0')}
在这个例子中,咱们界说了一个名为expr的语法规矩,该规矩匹配整数,并使用语义谓词来指定该规矩是否适用于输入文本。在这个例子中,语义谓词查验整数是否为零。
若何使用ANTLR4下载并装置ANTLR4:只需要下载官方网站上提供的ANTLR4 JAR文献,然后将其添加到您的Java类旅途中即可。您还不错遴荐装置ANTLR4插件来集成到您的IDE中,以便更通俗地使用ANTLR4。底下咱们演示如安在IDEA中使用ANTLR4插件。
编写语法文献:在ANTLR4中free_porn,您需要编写一个.g4文献来界说词法和语法规矩。您不错使用文本裁剪器编写.g4文献。
生成代码:一朝您编写了.g4文献,您不错使用ANTLR4生成Java代码。使用以下高歌不错生成Java代码:
java -jar antlr-4.9.2-complete.jar YourGrammar.g4
在上头的高歌中,您需要将YourGrammar.g4替换为您的.g4文献的称号。
编写证据器:一朝您生成了Java代码,您不错编写一个Java证据器来证据输入文本。您不错使用ANTLR4提供的Java API来编写证据器。CharStream input = CharStreams.fromStream(System.in); YourGrammarLexer lexer = new YourGrammarLexer(input); CommonTokenStream tokens = new CommonTokenStream(lexer); YourGrammarParser parser = new YourGrammarParser(tokens); YourGrammarParser.StartContext tree = parser.start();
在上头的代码中,您需要将YourGrammarLexer和YourGrammarParser替换为您生成的Lexer和Parser类的称号。您还需要替换start()才调,该才调应该复返您的语法规矩中的start规矩的ParseTree对象。
实战咱们来作念一个具体的例子,经典的筹办器,主淌若竣事四则运算,带括号等等。
IDEA装置ANTLR插件File->Settings->Plugins->Marketplace
图片free_porn
新建名堂新建一个maven名堂
图片
pom.xml引入antlr的依赖<dependency> <groupId>org.antlr</groupId> <artifactId>antlr4-runtime</artifactId> <version>4.10.1</version> </dependency>创建一个.g4文献
图片
grammar Arithmetic; /* * Parser rules */ parse : expr EOF ; expr : term (('+'|'-') term)* ; term : factor (('*'|'/') factor)* ; factor : NUMBER | '(' expr ')' ; /* * Lexer rules */ NUMBER : DIGIT+ ('.' DIGIT+)? ; DIGIT : [0-9] ; WHITESPACE : [ \t\n\r] -> skip ;
在这个语法规矩中,咱们界说了四个规矩:
parse:最高档别的规矩,暗示一个无缺的抒发式。它由一个expr规矩背面随着一个EOF象征构成。expr:暗示一个加法或减法抒发式。它由一个term规矩背面随着零个或多个加法或减法象征,背面再随着一个term规矩构成。term:暗示一个乘法或除法抒发式。它由一个factor规矩背面随着零个或多个乘法或除法象征,背面再随着一个factor规矩构成。factor:暗示一个数字或括号内的抒发式。它不错是一个数字,或者是一个由左括号、一个抒发式和右括号构成的组合。瞩目,在这个示例中,咱们还界说了一些Lexer规矩,用于识别数字和忽略空格和换行符。
咱们不错通过idea的antlr插件来查验咱们的语法规矩: 如下图,点击ANTLR Preview不错来到如下界面。左边的框填写需要校验的抒发式,右边等于语法树证据的服从。
图片
接下来,咱们需要使用ANTLR来生成Java代码。 通过插件生成java代码右键.g4文献,遴荐Configure ANTLR,成就java文献的生成旅途。
图片
图片
再次右键.g4文献,遴荐Generate ANTLR Reconizer 即可生成java代码
图片
创建一个EvalVisitor遍历AST咱们创建一个EvalVisitor遍历AST,并筹办抒发式的值。最终,咱们打印筹办服从。 EvalVisitor是一个咱们需要我方竣事的类,它接管了ArithmeticBaseVisitor,并重写了其中的才调。底下是一个约略的竣事示例: 新建类EvalVisitor.java
public class EvalVisitor extends ArithmeticBaseVisitor<Double> { // 使用一个Map来存储变量名和值的映射关联 Map<String, Double> memory = new HashMap<String, Double>(); // 重写visitExpr才调,用于筹办加法和减法 @Override public Double visitExpr(ArithmeticParser.ExprContext ctx) { Double result = visit(ctx.term(0)); for (int i = 1; i < ctx.term().size(); i++) { String op = ctx.getChild(2*i - 1).getText(); Double term = visit(ctx.term(i)); if (op.equals('+')) { result += term; } else { result -= term; } } return result; } // 重写visitTerm才调,用于筹办乘法和除法 @Override public Double visitTerm(ArithmeticParser.TermContext ctx) { Double result = visit(ctx.factor(0)); for (int i = 1; i < ctx.factor().size(); i++) { String op = ctx.getChild(2*i - 1).getText(); Double factor = visit(ctx.factor(i)); if (op.equals('*')) { result *= factor; } else { result /= factor; } } return result; } // 重写visitFactor才调,用于筹办数字和括号内的抒发式 @Override public Double visitFactor(ArithmeticParser.FactorContext ctx) { if (ctx.NUMBER() != null) { // 如果是一个数字,径直复返其值 return Double.parseDouble(ctx.NUMBER().getText()); } else { // 如果是括号内的抒发式,递归调用visit才调 return visit(ctx.expr()); } } }测试
新建测试类Test.java
public class Test { public static void main(String[] args) throws Exception { String input = '(1+2)*3-4'; // 创建一个词法分析器,用于将输入补救为象征 ArithmeticLexer lexer = new ArithmeticLexer(CharStreams.fromString(input)); // 创建一个象征流,用于将象征传递给证据 CommonTokenStream tokens = new CommonTokenStream(lexer); // 创建一个证据器,用于将象征补救为AST ArithmeticParser parser = new ArithmeticParser(tokens); // 调用证据器的parse才调,生成AST ParseTree tree = parser.parse(); // 创建一个AST遍历器,用于筹办抒发式的值 EvalVisitor eval = new EvalVisitor(); // 遍历AST,并筹办抒发式的值 double result = eval.visit(tree); // 打印筹办服从 System.out.println(result); } }
测试(1+2)*3-4服从如图:
图片
av下载 本站仅提供存储管事,通盘本色均由用户发布,如发现存害或侵权本色,请点击举报。- free_porn 我国冰雪装备器材产业原意发展2024-11-09
- free_porn 香港国外机场三跑说念系统将于本月28日启用2024-11-08
- free_porn 《弄堂东说念主家》里有以下期间的缩影2024-11-08
- free_porn 中证港股通通讯作事抽象指数报2321.97点,前十大权重包含中国电信等2024-11-08
- free_porn 精确落实医疗搭救计谋 两部门激动处置信息分享不足时问题2024-11-07
- free_porn 重磅文献出炉,事关水泥玻璃行业产能置换!影响几何?2024-11-07