祝大家新年快乐!从今天开始,我将教大家如何自己开发一门编程语言!(记得点赞+关注)
一、目的
一个编程语言,应该运行速度快,功能强大,拥有自己的风格、特点。我就以自己做的编程语言为例,教大家开发自己的编程语言。
二、名称
我把我做的编程语言叫做“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个赞)