0.简介
习惯了C语言和C++编程,一句话结尾没有分号觉得很别扭,所以这里同样也实现分号结尾。
1.合格的分号语法
;
int a;
int a;;
以上都是正确的分号。
2.实现
首先设置一个 专门检测分号的函数
void Parser::semicolon()
{
//检查是否为分号
if (getToken() == TK_SEM)
{
//吃掉分号
while(getToken() == TK_SEM)
pushNextToken();
}
else
{
//报错,缺少分号
error(MISSING_SEM,lines.front(),columns.front());
}
}
在涉及到分号结尾的语法结束部分添加此函数,同时前面的行数获取是错误的,这次都放到队列里就正确了。
下面是在语句末尾添加分号检查。
std::shared_ptr<Statement> Parser::parseStatement()
{
std::shared_ptr<Statement> result;
switch (getToken())
{
//声明语句
case KW_BOOL:
case KW_INT:
case KW_CHAR:
case KW_STRING:
case KW_FLOAT:
result = decalre();
//检测分号
semicolon();
break;
//表达式语句
default:
result = expression();
//检测分号
semicolon();
break;
}
return result;
}