shuntingYard method
void
shuntingYard()
Creates an AST from the String.
Implementation
// ignore: code-metrics
void shuntingYard() {
for (var i = 0; i < _stream.length; i++) {
switch (_stream[i][1]) {
case 'b':
_outputStack.add(_stream[i][0]);
break;
case 'f':
_operatorStack.add(_stream[i]);
break;
case 'l':
if (_stream[i][0] == r'\left|') {
_operatorStack.add([r'\abs', 'f']);
}
_operatorStack.add(_stream[i]);
break;
case 'r':
while (_operatorStack.isNotEmpty) {
if (_operatorStack.last[1] != 'l') {
_outputStack.add(_operatorStack.last[0]);
_operatorStack.removeLast();
continue;
} else {
_operatorStack.removeLast();
}
break;
}
break;
case 'u':
if (_stream[i][0] is num) {
_outputStack.add(_stream[i][0]);
}
break;
default:
while (_operatorStack.isNotEmpty) {
if (_operatorStack.last[1] == 'f') {
_outputStack.add(_operatorStack.last[0]);
_operatorStack.removeLast();
continue;
}
if (_operatorStack.last[1] is List) {
if (_operatorStack.last[1][1] > _stream[i][1][1]) {
_outputStack.add(_operatorStack.last[0]);
_operatorStack.removeLast();
continue;
} else if (_operatorStack.last[1][1] == _stream[i][1][1] &&
_operatorStack.last[1][2] == 'l') {
_outputStack.add(_operatorStack.last[0]);
_operatorStack.removeLast();
continue;
}
}
break;
}
_operatorStack.add(_stream[i]);
}
}
while (_operatorStack.isNotEmpty) {
_outputStack.add(_operatorStack.last[0]);
_operatorStack.removeLast();
}
}