일지
인터프리터...32
niamdank
2021. 1. 11. 11:37
C 방식 식 분석 프로그램
MiniCalculator_ver.C.h
#pragma region 실행 처리
int varArr[26];
// 계산 처리
void Operate(TokenKind op)
{
int num2{ Pop() }, num1{ Pop() };
switch (op)
{
case TokenKind::Plus:
Push(num1 + num2);
break;
case TokenKind::Minus:
Push(num1 - num2);
break;
case TokenKind::Multiply:
Push(num1 * num2);
break;
case TokenKind::Divide:
if (num2 == 0)
{
std::cout << "0으로 나눌 수 없습니다.\n";
exit(1);
}
Push(num1 / num2);
break;
case TokenKind::Modular:
if (num2 == 0)
{
std::cout << "0으로 나눌 수 없습니다.\n";
exit(1);
}
Push(num1 % num2);
break;
}
}
// And 처리
void AndExpression()
{
EqualsExpression();
TokenKind op;
while (token.tokenKind == TokenKind::And)
{
op = token.tokenKind;
token = NextToken();
EqualsExpression();
Operate(op);
}
}
// Equals 처리
void EqualsExpression()
{
RelationExpression();
TokenKind op;
while (token.tokenKind == TokenKind::Equal
|| token.tokenKind == TokenKind::NotEqual)
{
op = token.tokenKind;
token = NextToken();
RelationExpression();
Operate(op);
}
}
// Relation 처리
void RelationExpression()
{
AddExpression();
TokenKind op;
while (token.tokenKind == TokenKind::Less
|| token.tokenKind == TokenKind::LessEqual
|| token.tokenKind == TokenKind::Grater
|| token.tokenKind == TokenKind::GraterEqual)
{
op = token.tokenKind;
token = NextToken();
AddExpression();
Operate(op);
}
}
// +, - 처리
void AddExpression()
{
MultiplyExpression();
TokenKind op;
while (token.tokenKind == TokenKind::Plus
|| token.tokenKind == TokenKind::Minus)
{
op = token.tokenKind;
token = NextToken();
MultiplyExpression();
Operate(op);
}
}
// *, /, % 처리
void MultiplyExpression()
{
Factor();
TokenKind op;
while (token.tokenKind == TokenKind::Multiply
|| token.tokenKind == TokenKind::Divide
|| token.tokenKind == TokenKind::Modular)
{
op = token.tokenKind;
token = NextToken();
Factor();
Operate(op);
}
}
// 인자 처리
void Factor()
{
TokenKind op;
switch (token.tokenKind)
{
case TokenKind::Plus:
case TokenKind::Minus:
case TokenKind::Not:
op = token.tokenKind;
token = NextToken();
Factor();
if (op == TokenKind::Minus)
{
Push(-Pop());
}
else if (op == TokenKind::Not)
{
Push(!Pop());
}
break;
case TokenKind::VariableName:
Push(varArr[token.intValue]);
break;
case TokenKind::Int:
Push(token.intValue);
break;
case TokenKind::LeftParenthesis:
token = NextToken();
Expression();
CheckToken(TokenKind::RightParenthesis);
break;
default:
std::cout << "에러 발생!\n";
exit(1);
}
token = NextToken();
}
// 식 처리
void Expression()
{
TokenKind op;
AndExpression();
while (token.tokenKind == TokenKind::Or)
{
op = token.tokenKind;
token = NextToken();
AndExpression();
Operate(op);
}
}
// 문 처리
void Statement()
{
int variableNumber;
switch (token.tokenKind)
{
case TokenKind::VariableName:
variableNumber = token.intValue;
token = NextToken();
CheckToken(TokenKind::Assign);
token = NextToken();
Expression();
varArr[variableNumber] = Pop();
break;
case TokenKind::Print:
token = NextToken();
Expression();
CheckToken(TokenKind::EndOfToken);
std::cout << " " << Pop() << '\n';
return;
default:
std::cout << "에러 발생!\n";
exit(1);
}
CheckToken(TokenKind::EndOfToken);
}
#pragma endregion
더보기