0.简介
今天比较累,所以就写点简单的。
1.报错
当我们的代码出现错误的时候,编译器应该能识别到并且可以反馈给我们,我们需要在语法分析或者是词法分析的一些指定位置安插一些报错语句,当遇到了错误,然后返回错误信息,这样我们就能根据错误信息来修改代码。
2.错误类型
根据目前编译器所有的功能,有以下几个地方可以识别出错误
数组缺少中括号
数组声明的下标不是确定的数字
表达式语句无效
声明标识符错误
设计一个类,专门负责错误输出。
//错误代码
enum ErrID
{
MISSING_BARCKET = 0,//缺少中括号
ERROR_EXPRESSION,//表达式错误
ARRAY_DEC_ELEMENT,//数组声明下标错误
BAD_IDENT//错误标识符
};
//错误显示
class Error
{
std::string errorInfo[100] = {
"Missing bracket",
"Error expression",
"Number of elements of the array to be determined",
"Bad identifier"
};
public:
void operator()(ErrID id,int line,int column)
{
std::cout <<"ERR"<< id << ":" << "[" << line << "," << column << "]:" << errorInfo[id] << std::endl;
}
};
虽然功能不多,但是可以用来检测目前的问题。
具体在语法分析中加入如下代码。
std::shared_ptr<VariableDeclareStatement> Parser::variableDeclare()
{
...
//如果遇到的声明是非标识符则要报错
if(getToken() == TK_IDENT)
result->identName = getLexeme();
else
error(BAD_IDENT,line-1,column);
...
}