К сожалению, MyApp остановился. Как я могу решить это?

Языки регексов недостаточно эффективны для сопоставления произвольно вложенных конструкций. Для этого вам нужен пусковой автомат (т. Е. Синтаксический анализатор). Доступно несколько таких инструментов, таких как PLY .

Python также предоставляет библиотеку синтаксиса для своего собственного синтаксиса, который может делать то, что вам нужно. Выход очень подробный, однако, и занимает некоторое время, чтобы обернуть голову. Если вы заинтересованы в этом угле, следующее обсуждение пытается объяснить все как можно проще.

>>> import parser, pprint
>>> pprint.pprint(parser.st2list(parser.expr('(((1+0)+1)+1)')))
[258,
 [327,
  [304,
   [305,
    [306,
     [307,
      [308,
       [310,
        [311,
         [312,
          [313,
           [314,
            [315,
             [316,
              [317,
               [318,
                [7, '('],
                [320,
                 [304,
                  [305,
                   [306,
                    [307,
                     [308,
                      [310,
                       [311,
                        [312,
                         [313,
                          [314,
                           [315,
                            [316,
                             [317,
                              [318,
                               [7, '('],
                               [320,
                                [304,
                                 [305,
                                  [306,
                                   [307,
                                    [308,
                                     [310,
                                      [311,
                                       [312,
                                        [313,
                                         [314,
                                          [315,
                                           [316,
                                            [317,
                                             [318,
                                              [7,
                                               '('],
                                              [320,
                                               [304,
                                                [305,
                                                 [306,
                                                  [307,
                                                   [308,
                                                    [310,
                                                     [311,
                                                      [312,
                                                       [313,
                                                        [314,
                                                         [315,
                                                          [316,
                                                           [317,
                                                            [318,
                                                             [2,
                                                              '1']]]]],
                                                         [14,
                                                          '+'],
                                                         [315,
                                                          [316,
                                                           [317,
                                                            [318,
                                                             [2,
                                                              '0']]]]]]]]]]]]]]]],
                                              [8,
                                               ')']]]]],
                                          [14,
                                           '+'],
                                          [315,
                                           [316,
                                            [317,
                                             [318,
                                              [2,
                                               '1']]]]]]]]]]]]]]]],
                               [8, ')']]]]],
                           [14, '+'],
                           [315,
                            [316,
                             [317,
                              [318, [2, '1']]]]]]]]]]]]]]]],
                [8, ')']]]]]]]]]]]]]]]],
 [4, ''],
 [0, '']]

Вы можете облегчить боль этой короткой функцией:

def shallow(ast):
    if not isinstance(ast, list): return ast
    if len(ast) == 2: return shallow(ast[1])
    return [ast[0]] + [shallow(a) for a in ast[1:]]

>>> pprint.pprint(shallow(parser.st2list(parser.expr('(((1+0)+1)+1)'))))
[258,
 [318,
  '(',
  [314,
   [318, '(', [314, [318, '(', [314, '1', '+', '0'], ')'], '+', '1'], ')'],
   '+',
   '1'],
  ')'],
 '',
 '']

Числа поступают из модулей Python symbol и token, которые вы можете использовать для построения таблицы поиска из чисел в имена:

map = dict(token.tok_name.items() + symbol.sym_name.items())

Вы даже можете свернуть это сопоставление в shallow(), чтобы вы могли работать со строками вместо чисел:

def shallow(ast):
    if not isinstance(ast, list): return ast
    if len(ast) == 2: return shallow(ast[1])
    return [map[ast[0]]] + [shallow(a) for a in ast[1:]]

>>> pprint.pprint(shallow(parser.st2list(parser.expr('(((1+0)+1)+1)'))))
['eval_input',
 ['atom',
  '(',
  ['arith_expr',
   ['atom',
    '(',
    ['arith_expr',
     ['atom', '(', ['arith_expr', '1', '+', '0'], ')'],
     '+',
     '1'],
    ')'],
   '+',
   '1'],
  ')'],
 '',
 '']

742
задан naXa 11 September 2018 в 09:41
поделиться

1 ответ

Воссоздают катастрофический отказ.

Попытка воссоздать проблему как или когда это произошло.

  1. , Что Вы недавно изменили?
  2. при изменении чего-то связанный код попытайтесь комментировать код, пока Вы не достигли точки, где это больше не отказывает.
  3. Попытка узнать , ГДЕ точно в Вашем процессе выполнения программы это отказывающий

, Если у Вас ранее было рабочее решение, сравните то, что Вы имели, к какому Вы имеете теперь.

ТОЧКИ ОСТАНОВА ИСПОЛЬЗОВАНИЯ!!! : https://developer.android.com/studio/debug. Ступите через свой проект, попытайтесь видеть то, что значения переменных и почему он мог потенциально отказывать.

Делают Ваш код читаемым и понятным кому-либо еще. прочитывает Ваш собственный код снова и пытаются видеть, имеет ли он смысл Вам, объясните это себе. Если существует что-то в Вашем коде, Вы не понимаете, или Вы не уверены в этом, смотрите на него снова, пытаетесь писать это более ясный:

  1. использование ясные, понятные имена переменной
  2. код взлома в мелкие кусочки (методы или функции)
  3. использование комментирует для объяснения чего-либо, что не ясно или легко понять

(, необходимо понять код, и необходимо быть в состоянии объяснить, что Вы пытаетесь сделать)

, И наконец попытайтесь исследовать, и узнать больше о конкретный часть Вашего кода Вы не понимаете, или Вы не уверены в.

0
ответ дан a_local_nobody 28 July 2019 в 16:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: