用C++做自己的编程语言(一)

祝大家新年快乐!从今天开始,我将教大家如何自己开发一门编程语言!(记得点赞+关注)

一、目的

一个编程语言,应该运行速度快,功能强大,拥有自己的风格、特点。我就以自己做的编程语言为例,教大家开发自己的编程语言。

二、名称

我把我做的编程语言叫做“C+”,因为有C和C++,应该再加一个C+。但是我相信你们会有更好的想法!

三、大致框架

99%的人都会这样做:把一行代码拆成一个一个的token,然后用NBF来执行它。我给大家提供一个全新的思路:任何一行代码都可以看成一个中缀表达式,而中缀表达式可以用栈来实现。所以,我们会用栈来执行每一行代码。(如果你还不知道栈是什么,先去学习栈,再来看这篇文章)首先定义每个运算符的优先级(函数也是一种运算符),然后把一行代码拆成一个个的token,并压入栈中(有两个栈,一个是数据栈,一个是运算符栈),最后根据他们的优先级,进行计算。

四、计算表达式

代码如下:

#include <bits/stdc++.h>
using namespace std;
stack<string> op;
stack<int> num;
map<string, int> pr = {{"*", 12}, {"/", 12}, {"+", 11}, {"-", 11}}; //定义优先级
void eval(){
    string c = op.top();
    op.pop();
    int b = num.top();
    num.pop();
    int a = num.top();
    num.pop();
    int x = 0;
    if (c == "*") x = a * b;
    else if (c == "/") x = a / b;
    else if (c == "+") x = a + b;
    else if (c == "-") x = a - b;
    num.push(x);
}
double calc(string s){
    for (int i = 0; i < s.size(); ++i){
        char c = s[i];
        if (c == ' ') continue;
        if ('0' <= s[i] && s[i] <= '9'){ //将数压入栈
            string x = "";
            int j = i;
            while (j < s.size() && ('0' <= s[j] && s[j] <= '9')){
                x += s[j];
                ++j;
            }
            num.push(stoi(x));
            i = j - 1;
        }
        else if (c == '(') op.push("(");
        else if (c == ')'){
            while (op.top() != "(") eval();
            op.pop();
        } else{ //将运算符压入栈
            string tmp = "", tm = "";
            tm += s[i];
            while (i < s.size() && pr[tm]){
                tmp += s[i];
                ++i;
                tm = "";
                tm += s[i];
            }
            --i;
            while (op.size() && pr[op.top()] >= pr[tmp]) eval();
            op.push(tmp);
        }
    }
    while (op.size()) eval();
    return num.top();
}
int main(){
    string s;
    while (1){
        cout << "请输入要计算的表达式:";
        getline(cin, s);
        cout << "计算结果:" << calc(s) << endl << endl;
    }
    return 0;
}

运行结果:

这段代码只能计算整数的四则运算,下一篇我会给大家讲一下实现更高级的功能,以及把它改造成一个半编译的语言!(前提是这篇文章达到5个赞)

  • 15
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值