自制编程语言(8)---语法分析---数组赋值

0.简介

数组也和变量一样,需要有直接赋值操作。

1.数组赋值

其语法如下

int a[3]={1,2,3};

这里主要对大括号里的内容进行处理,至于个数要到后面就解析的时候处理。

2.实现

//数组声明语句
class ArrayDeclareStatement :public Statement
{
public:
	ArrayDeclareStatement(int _line, int _column) :Statement(_line, _column) {}
	//数组类型
	Token type;
	//类型名
	std::string typeName;
	//数组元素个数
	std::vector<std::shared_ptr<Expression>> elementNums;
	//数组名字
	std::string name;
	//数组初始值
	std::shared_ptr<Expression> initValue;
	~ArrayDeclareStatement() {}
};

由于数组不能直接利用赋值语句,所在在数组声明语句中添加了新的字段专门用来保存初始值。

然后添加大括号内容读取的代码。

std::shared_ptr<Expression> Parser::parseUnaryExpr()

...
...
//遇到大括号的时候
	else if (getToken() == TK_LBRACE)
	{
		auto result = std::make_shared<ArrayValueExpression>(lines.front(),columns.front());
		//吃掉大括号
		pushNextToken();
		while (getToken() != TK_RBRACE)
		{
			//获取一个元素,也是一个表达式
			result->exprs.push_back(parseExpression());
			//如果下一个不是逗号或者右大括号说明表达式错误
			while(getToken() != TK_COMMA && getToken() != TK_RBRACE)
			{
				//报错
				error(INVAILD_ARRAY_VALUE,lines.front(),columns.front());
				//吃掉错误表达式
				pushNextToken();
				//可能会延续到结尾
				if (getToken() == TK_EOF)
					return nullptr;
			}
			if (getToken() == TK_RBRACE)
			{
				//吃掉大括号
				pushNextToken();
				break;
			}
			//吃掉逗号
			pushNextToken();
			
		}
		return result;
	}

这样就可以识别有大括号的语句了。

再修改一下数组声明语法分析函数,添加赋值处理

std::shared_ptr<ArrayDeclareStatement> Parser::arrayDeclare()
{
...
...
	//如果有赋值
	if (getToken() == TK_ASSIGN)
	{
		//吃掉赋值符号
		pushNextToken();
		//获取赋值
		result->initValue = parseExpression();
	}
	return result;
}

3.代码

这里

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值