<prompt> Andika programu ya C ambayo: a. Hutekeleza kihesabu cha msingi na kichanganuzi kwa lugha maalum ya upangaji. b. Hutathmini semi zilizoandikwa katika lugha hii. c. Inaauni vigeu, utendakazi wa hesabu, na taarifa za masharti ikiwa sivyo.  <response>: cpppamoja na pamoja na pamoja na pamoja na pamoja na enum TokenType NUMBER, VAR, PLUS, MINUS, MUL, DIV, LPAREN, RPAREN, ASSIGN, IF, ELSE, END;ishara ya muundo Aina ya ishara; std::thamani ya kamba;;darasa Lexer umma: wazi Lexerconst std::string input : inputinput, pos0 Ishara getNextToken wakati pos input.size char ch pembejeopos; ikiwa std::isspacech pos; vinginevyo ikiwa std::isdigitch return parseNumber; vinginevyo ikiwa std::isalphach return parseIdentifier; nyengine kubadili ch kesi : pos; rudisha PLUS; kesi -: pos; rudisha MINUS; kesi : pos; rudisha MUL; kesi : pos; rudisha DIV; kesi : pos; rudisha LPAREN; kesi : pos; rudisha RPAREN; kesi : pos; rudisha ASSIGN; chaguo-msingi: kutupa std::runtime_errortabia batili; rudisha END; Privat: Tokeni parseNumber std::string numStr; wakati pos input.size std::isdigitinputpos numStr pembejeopos; rudisha NUMBER, numStr; Tokeni parseIdentifier std::kitambulisho cha kamba; wakati pos input.size std::isalnuminputpos kitambulisho ingizopos; ikiwa kitambulisho ikiwa rudisha IF; vinginevyo ikiwa kitambulisho kingine rudisha ELSE; rudisha VAR, kitambulisho; std:: pembejeo ya kamba; ukubwa_t nafasi;;Kichanganuzi cha darasa umma: Explicit ParserLexer lexer : lexerlexer, currentTokenlexer.getNextToken uchanganuzi wa ndani kurudi usemi; Privat: kula utupu aina ya TokenType ikiwa currentToken.type aina currentToken lexer.getNextToken; nyengine kutupa std::runtime_errorsyntax batili; int factor Ishara ya ishara currentToken; ikiwa token.type NUMBER kulaNUMBER; rudisha std::stoitoken.value; vinginevyo ikiwa token.type VAR kulaVAR; kurejesha vigezotoken.value; vinginevyo ikiwa token.type LPAREN kulaLPAREN; int result kujieleza; kulaRPAREN; matokeo ya kurudi; kutupa std::runtime_errorsyntax batili; int term int result factor; wakati currentToken.type MUL currentToken.type DIV Ishara ya ishara currentToken; ikiwa token.type MUL kula MUL; matokeo factor; vinginevyo ikiwa token.type DIV kulaDIV; matokeo sababu ; matokeo ya kurudi; int expression matokeo ya int neno ; wakati currentToken.type PLUS currentToken.type MINUS Ishara ya ishara currentToken; ikiwa token.type PLUS kulaPLUS; matokeo neno ; vinginevyo ikiwa token.type MINUS kulaMINUS; matokeo - neno ; matokeo ya kurudi; Lexer lexer; Token currentToken; std::map vigezo;;int main std:: pembejeo ya kamba x 10 20 5 - 3; Lexer lexerpembejeo; Parser parserlexer; jaribu matokeo ya int parser.parse; std::cout Matokeo: matokeo std::endl; catch consst std::runtime_error e std::cerr Error: e.what std::endl; kurudi 0;Mpango huu wa C hutekeleza kihesabu cha msingi na kichanganuzi kwa lugha maalum ya upangaji inayoauni vigeu, utendakazi wa hesabu na taarifa za masharti ikiwa sivyo. Darasa la Lexer lina jukumu la kuweka alama kwenye mfuatano wa ingizo, wakati darasa la Parser linatathmini misemo iliyoandikwa katika lugha hii. Kumbuka kwamba utekelezaji huu hauungi mkono kikamilifu taarifa za kama-mwingine, lakini hutoa msingi wa kujenga.Ili kujaribu programu, unaweza kurekebisha kigezo cha input kwa kutumia misemo tofauti. 