自己动手写C语言编译器(1)

直接上代码 (表达式树  在此 初具 模型 )

 

由于没有做前期的“词法分析”,

1.支持 单个 字符 形式的变量

2.支持 单个 字符形式的操作符

3.支持 优先级 。

 

不支持

 

1.不支持多个字符的操作符和变量。

2. 不支持左右结合性

3.不支持函数 

4. 不支持语句 

5. 不支持关键字。

 

这些将陆续添加 。

 

// MyCompiler.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <fstream>
#include <list>
#include <map>
#include <string>
#include <iostream>
#include <vector>
//把Token转换为字符串
#define  ATokenToString(l, r) if(l == r)return #r;
using namespace std;
namespace tokens{
	enum TOKEN
	{
		INVALID_TYPE,
			WHITE_SPACE,
			NAME,
			NUMBER,
			END,
			PLUS,
			MINUS,
			MUL,
			DIV,
			PRINT,
			ASSIGN,
			LP,
			RP,
	};
	static string MyTokenToString(TOKEN token)
	{
		ATokenToString(token, WHITE_SPACE)
			ATokenToString(token, NAME)
			ATokenToString(token, NUMBER)
			ATokenToString(token, END)
			ATokenToString(token, PLUS)
			ATokenToString(token, MINUS)
			ATokenToString(token, MUL)
			ATokenToString(token, DIV)
			ATokenToString(token, PRINT)
			ATokenToString(token, ASSIGN)
			ATokenToString(token, LP)
			ATokenToString(token, RP)
			return "";
	}
}

class tokenizer
{
	int mTokenTypes[256];
	string mCurrentStrToken;
	tokens::TOKEN mCurrentTokenType;
	istream& mIfStream;
public:
	tokenizer(istream& infile):mIfStream(infile)
	{
		memset(mTokenTypes, 0, 256);
		mTokenTypes['+'] = tokens::PLUS;
		mTokenTypes['-'] = tokens::MINUS;
		mTokenTypes['*'] = tokens::MUL;
		mTokenTypes['/'] = tokens::DIV;
		mTokenTypes[';'] = tokens::PRINT;
		mTokenTypes['='] = tokens::ASSIGN;
		mTokenTypes['('] = tokens::LP;
		mTokenTypes[')'] = tokens::RP;
		mTokenTypes['\t'] = tokens::WHITE_SPACE;
		mTokenTypes[' '] = tokens::WHITE_SPACE;
		char ch = 0;
		for (ch = 'a'; ch <= 'z'; ch ++)
		{
			mTokenTypes[ch] = tokens::NAME; 
		}
		for(ch = 'A'; ch <= 'Z'; ch ++)
		{
			mTokenTypes[ch] = tokens::NAME; 
		}
		for(ch = '0'; ch <= '9'; ch ++)
		{
			mTokenTypes[ch] = tokens::NUMBER; 
		}
		mTokenTypes['.'] = tokens::NUMBER;
		
	}
	bool hasNext()
	{
		char temptoken = 0;
		if(mIfStream.get(temptoken))
		{
			mIfStream.putback(temptoken);
			return tr
  • 6
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值