//Парсерът приема всеки знак '-' за аритметична операция, затова тук се проверява //дали всъщност знакът е бил унарен оператор. //Замяната на знака се налага заради операциите със стека на ОПЗ, да се знае дали //да се прилага операцията върху един или два операнда. private void checkUnaryMinus(LexemеSequence input, Lexemе lexeme) { if (lexeme.id == Lexemе.MINUS) { bool unary_sign = false; if (input.GetPosition() > 1) { char symbol = input.getLexemе(input.GetPosition() - 2).id; if ((symbol == Lexemе.ASSIGNMENT) || (symbol == Lexemе.OPEN_BRACE) || (symbol == Lexemе.SEMICOLON) || (symbol == Lexemе.BITWISE_AND) || (symbol == Lexemе.BITWISE_OR) || (symbol == Lexemе.PLUS) || (symbol == Lexemе.MINUS) || (symbol == Lexemе.MULTUPLICATION) || (symbol == Lexemе.DIVISION) || (symbol == Lexemе.MODUL) || (symbol == Lexemе.BITWISE_INVERSION) || (symbol == Lexemе.BOOLEAN_INVERSION)) { unary_sign = true; } } else { unary_sign = true; } if (unary_sign) { lexeme.id = Lexemе.UNARY_MINUS; } } }
private void changeSymbol(LexemеSequence input, Lexemе lexeme, char search_symbol, char replace_symbol) { if (lexeme.id == search_symbol) { //проверка дали предходната лексема е идентификатор if (input.GetPosition() > 1) { if (input.getLexemе(input.GetPosition() - 2).id == Lexemе.IDENTIFIER) { lexeme.id = replace_symbol; return; } } //проверка дали следващата лексема е идентификатор if (input.GetPosition() < input.size()) { char symb = input.peekLexemе().id; if (input.peekLexemе().id == Lexemе.IDENTIFIER) { return; } else { throw new TranslatorException("Error 1: Expression " + search_symbol + " can be applyed only to identifier."); } } throw new TranslatorException("Error 2: Expression " + search_symbol + " can be applyed only to identifier."); } }