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;
}