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();
  }
}