Вопрос: TypeScript ошибка: несовместимость типов в сравнении (TS2367)
Primary tabs
Вопрос возник во время выполения задачи 1 (реализация унарного минуса)
Ошибка возникает в классе SyntaxAnalyzer в методе scanTerm().
В методе scanTerm() есть цикл while. Условие для входа в цикл - текущий символ равен "*" или "/" и не равен null.
while (this.symbol !== null && (
this.symbol.symbolCode === SymbolsCodes.star ||
this.symbol.symbolCode === SymbolsCodes.slash
))
Далее в цикле для получения следующейго символа применяется метод nextSym().
Так как данный метод может вернуть "-", я хочу сделать проверку на равенство текущего символы "-".
if (this.symbol.symbolCode === SymbolsCodes.minus)
Вот при попытке сделать данную проверку получаю ошибку
This comparison appears to be unintentional because the types 'SymbolsCodes.star | SymbolsCodes.slash' and 'SymbolsCodes.minus' have no overlap.ts(2367)
При этом перед входом цикл while также есть проверка на раввенство текущего символа "-",
которая не вызывает ошибок
if (this.symbol.symbolCode === SymbolsCodes.minus)
Код класса
export class SyntaxAnalyzer {
lexicalAnalyzer: LexicalAnalyzer;
symbol: SymbolBase | null;
/**
* Деревья, которые будут построены (например, для каждой строки исходного кода)
*/
trees: TreeNodeBase[];
constructor(lexicalAnalyzer: LexicalAnalyzer) {
this.lexicalAnalyzer = lexicalAnalyzer;
this.symbol = null;
this.trees = [];
}
/**
* Перемещаемся по последовательности "символов" лексического анализатора,
* получая очередной "символ" ("слово")
*/
nextSym(): void {
this.symbol = this.lexicalAnalyzer.nextSym();
}
accept(expectedSymbolCode: string): void {
if (this.symbol === null) {
throw `${expectedSymbolCode} expected but END OF FILE found!`;
}
if (this.symbol.symbolCode === expectedSymbolCode) {
this.nextSym();
} else {
throw `${expectedSymbolCode} expected but ${this.symbol.symbolCode} found!`;
}
}
analyze(): TreeNodeBase[] {
this.nextSym();
while (this.symbol !== null) {
let expression: TreeNodeBase = this.scanExpression();
this.trees.push(expression);
// Последняя строка может не заканчиваться переносом на следующую строку.
if (this.symbol !== null) {
this.accept(SymbolsCodes.endOfLine);
}
}
return this.trees;
}
/**
* Разбор выражения
*/
scanExpression(): TreeNodeBase {
let term: TreeNodeBase = this.scanTerm();
let operationSymbol: SymbolBase | null = null;
while (this.symbol !== null && (
this.symbol.symbolCode === SymbolsCodes.plus ||
this.symbol.symbolCode === SymbolsCodes.minus
)) {
operationSymbol = this.symbol;
this.nextSym();
let secondTerm: TreeNodeBase = this.scanTerm();
switch (operationSymbol.symbolCode) {
case SymbolsCodes.plus:
term = new Addition(operationSymbol, term, secondTerm);
break;
case SymbolsCodes.minus:
term = new Subtraction(operationSymbol, term, secondTerm);
break;
}
}
return term;
}
/**
* Разбор "слагаемого"
*/
scanTerm(): TreeNodeBase {
let multiplier: TreeNodeBase;
let operationSymbol: SymbolBase | null = null;
if (this.symbol.symbolCode === SymbolsCodes.minus) {
operationSymbol = this.symbol;
this.nextSym();
multiplier = new UnaryMinus(operationSymbol, this.scanTerm())
} else {
multiplier = this.scanMultiplier();
while (this.symbol !== null && (
this.symbol.symbolCode === SymbolsCodes.star ||
this.symbol.symbolCode === SymbolsCodes.slash
)) {
operationSymbol = this.symbol;
this.nextSym();
let secondTerm: TreeNodeBase
/ / 'ТУТ ОШБКА'
if (this.symbol.symbolCode === SymbolsCodes.minus) // 'ТУТ ОШБКА'
{
let minus = this.symbol;
this.nextSym();
secondTerm = new UnaryMinus(minus, this.scanTerm());
} else {
secondTerm = this.scanMultiplier();
}
switch (operationSymbol.symbolCode) {
case SymbolsCodes.star:
multiplier = new Multiplication(operationSymbol, multiplier, secondTerm);
break;
case SymbolsCodes.slash:
multiplier = new Division(operationSymbol, multiplier, secondTerm);
break;
}
}
}
return multiplier;
}
/**
* Разбор "множителя"
*/
scanMultiplier(): NumberConstant {
let integerConstant: SymbolBase | null = this.symbol;
this.accept(SymbolsCodes.integerConst); // проверим, что текущий символ это именно константа, а не что-то еще
return new NumberConstant(integerConstant);
}
};- Log in to post comments
- 706 reads