ANTLR4(十) 内嵌代码之计算器

本文介绍如何使用ANTLR4构建一个内嵌代码的计算器,允许用户逐行输入表达式并立即看到结果。文章详细讲解了语法文件的设置、自定义Visitor的创建、内嵌语法文件的方法以及主程序的重写。最后展示了运行结果和编译执行的步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写在之前

采用访问器的计算器

语法文件:

grammar Expr; 

prog:   stat+ ;

stat:   expr NEWLINE                
    |   ID '=' expr NEWLINE         
    |   CLEAR NEWLINE               
    |   NEWLINE                     
    ;

expr:   expr op=('*'|'/') expr      
    |   expr op=('+'|'-') expr      
    |   INT                         
    |   ID                          
    |   '(' expr ')'                
    ;

MUL :   '*' ; 
DIV :   '/' ;
ADD :   '+' ;
SUB :   '-' ;

ID  :   [a-zA-Z]+ ;      // match identifiers
INT :   [0-9]+ ;         // match integers
NEWLINE:'\r'? '\n' ;     // return newlines to parser (is end-statement signal)
WS  :   [ \t]+ -> skip ; // toss out whitespace

自定义Visitor:

//EvalVistor.java
import java.util.HashMap;
import java.util.Map;

public class EvalVisitor extends LabeledExprBaseVisitor<Integer> {
   
    /** "memory" for our calculator; variable/value pairs go here */
    Map<String, Integer> memory = new HashMap<String, Integer>();

    /** ID '=' expr NEWLINE */
    @Override
    public Integer visitAssign(LabeledExprParser.AssignContext ctx) {
   
        String id = ctx.ID().getText();  // id is left-hand side of '='
        int value = visit(ctx.expr());   // compute value of expression on right
        memory.put(id, value);           // store it in our memory
        return value;
    }

    /** expr NEWLINE */
    @Override<
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值