人妻管理员-free_porn ANTLR4初学【打造你我方的语法规矩】

高段位氣質御姐【功夫不好不要找我】姐妹花~連體絲襪~大奶晃動~絲襪騷腳 /

你的位置:人妻管理员 > 高段位氣質御姐【功夫不好不要找我】姐妹花~連體絲襪~大奶晃動~絲襪騷腳 > free_porn ANTLR4初学【打造你我方的语法规矩】
free_porn ANTLR4初学【打造你我方的语法规矩】
发布日期:2024-11-04 10:02    点击次数:78

free_porn ANTLR4初学【打造你我方的语法规矩】

著作目次 什么是ANTLR4ANTLR4的特质ANTLR4的语法规矩语法规矩的声明.g4文献的代码规矩词法规矩语法规矩语法规矩中的操作 若何使用ANTLR4实战IDEA装置ANTLR插件新建名堂创建一个.g4文献通过插件生成java代码创建一个EvalVisitor遍历AST测试 什么是ANTLR4

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下载 本站仅提供存储管事,通盘本色均由用户发布,如发现存害或侵权本色,请点击举报。