编译器一日一练(DIY系列之连续加减法)

本文基于上一篇用javacc写加法器解析工具的内容,介绍如何制作连续加减法工具。包括在加法基础上修改成减法工具,实现可选择加法或减法运算,以及在加、减法基础上增加连续运算,还给出了代码链接。

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

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

        上一篇我们说到了怎么用javacc写一个加法器的解析工具。今天继续,可以在这个基础上看一下怎么做一个连续加减法的工具。

        代码链接:https://github.com/feixiaoxing/DIYCompiler

1、减法工具

        剑法工具比较简单,就是在原来加法的基础之上,修改成-就可以了。我们可以看一下对应生成的Adder.jj文件,

options {
    STATIC = false;
}
 
PARSER_BEGIN(Adder)
import java.io.*;
public class Adder {
    public static void main(String[] args) {
        for (String arg : args) {
            try {
                System.out.println(evaluate(arg));
            } catch (ParseException ex) {
                System.err.println(ex.getMessage());
            }
        }
    }
 
    public static long evaluate(String src) throws ParseException {
        Reader reader = new StringReader(src);
        return new Adder(reader).expr();
    }
}
PARSER_END(Adder)
 
SKIP: { <[" ", "\t", "\r", "\n"]> }
TOKEN: {
    <INTEGER: (["0"-"9"])+>
}
 
long expr() throws NumberFormatException :
{
    Token a ;
    Token b ;
    int value = 0 ;
}
{
    a = <INTEGER> "-" b = <INTEGER>
    { 
		value = Integer.parseInt( a.image ) - Integer.parseInt(b.image); 
	}
    <EOF>
    { return value ; }
}

2、加法或者减法

        这个比较有意思,其实就相当于可以做加法,也可以做减法,但是每次只能做一个。所以,这里Adder.jj要做一点修改,

options {
    STATIC = false;
}
 
PARSER_BEGIN(Adder)
import java.io.*;
public class Adder {
    public static void main(String[] args) {
        for (String arg : args) {
            try {
                System.out.println(evaluate(arg));
            } catch (ParseException ex) {
                System.err.println(ex.getMessage());
            }
        }
    }
 
    public static long evaluate(String src) throws ParseException {
        Reader reader = new StringReader(src);
        return new Adder(reader).expr();
    }
}
PARSER_END(Adder)
 
SKIP: { <[" ", "\t", "\r", "\n"]> }
TOKEN: {
    <INTEGER: (["0"-"9"])+>
}
 
long expr() throws NumberFormatException :
{
    Token a ;
    Token b ;
    int value = 0 ;
}
{
    
	a = <INTEGER>
	{
		value = Integer.parseInt(a.image); 
	}
	
	(
	 "+" b = <INTEGER>
    { 
		value += Integer.parseInt(b.image); 
	} |
	"-" b = <INTEGER>
    { 
		value -= Integer.parseInt(b.image); 
	}
	)
    <EOF>
    { return value ; }
}

        通过上面的规则分析,可以看到第一个INTEGER已经被放到了外面。第二个INTEGER中添加了一个|,这样就可以做选择题了。不管是输入+运算,还是-运算,都可以开始计算。

3、连续加减法

        所谓的连续加减法,就是在上面加、减法的基础上增加一个连续运算。大家可以看一下,两个Adder.jj文件的变化。

options {
    STATIC = false;
}
 
PARSER_BEGIN(Adder)
import java.io.*;
public class Adder {
    public static void main(String[] args) {
        for (String arg : args) {
            try {
                System.out.println(evaluate(arg));
            } catch (ParseException ex) {
                System.err.println(ex.getMessage());
            }
        }
    }
 
    public static long evaluate(String src) throws ParseException {
        Reader reader = new StringReader(src);
        return new Adder(reader).expr();
    }
}
PARSER_END(Adder)
 
SKIP: { <[" ", "\t", "\r", "\n"]> }
TOKEN: {
    <INTEGER: (["0"-"9"])+>
}
 
long expr() throws NumberFormatException :
{
    Token a ;
    Token b ;
    int value = 0 ;
}
{
    
	a = <INTEGER>
	{
		value = Integer.parseInt(a.image); 
	}
	
	(
	 "+" b = <INTEGER>
    { 
		value += Integer.parseInt(b.image); 
	} |
	"-" b = <INTEGER>
    { 
		value -= Integer.parseInt(b.image); 
	}
	)*
    <EOF>
    { return value ; }
}

        细心的同学可能注意到了,这个示例比上一个示例代码就多了一个*。不要小瞧这一个*,有了这一个*,运算就可以变成连续运算了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式-老费

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值