Объединить утверждения утверждения с предложениями where - PullRequest
0 голосов
/ 26 мая 2018

Я заметил, что когда у меня есть несколько предложений where и несколько предложений asserting, я часто получаю синтаксические ошибки, когда объединяю их вместе.Ошибка скажет «неожиданный токен после где».Как я должен написать это, чтобы избежать этой ошибки?Вот последний пример:

Попытка 1:

def(class game_state game) ->commands [
        set(attack, cost),
        set(life, cost),
        set(abilities, []),
    ] where cost=(card.cost + (card.loyalty_cost * size(card.school)))
      where card=crypt_spells[choices[0]]
//      asserting size(choices) = 1 //FIXME: syntax error uncommented
        asserting choices != null
      where crypt_spells=filter(game.crypt.cards_of(player), value.type='spell')
      where player=game.player_obj

Я также попытался переписать его другим способом, что также привело к «неожиданному токену после где»синтаксическая ошибка.

Попытка 2:

def(class game_state game) ->commands [
        set(attack, cost),
        set(life, cost),
        set(abilities, []),
    ] where cost=(card.cost + (card.loyalty_cost * size(card.school)))
      where card=crypt_spells[choices[0]]
      asserting choices != null, size(choices)=1 | choices //FIXME: syntax error
      where crypt_spells=filter(game.crypt.cards_of(player), value.type='spell')
      where player=game.player_obj

Пример 3:

Вот еще один пример, который, я думаю, выдвигает на первый план проблему:

def(class game_state game, class message.play_card info) ->commands
  if(info.choices,
    ([ /* do stuff */ ]
      where entry=game.crypt.get_entry(info.choices[0])
      asserting size(info.targets)=1 | info.targets    /* PARSE ERROR! */
    ) asserting size(info.choices)=1 | info.choices,   /* WORKS */
    [ /* else */ ]
  )

Как видно из этого примера, asserting a=b работает нормально, если ему не предшествует предложение where.

1 Ответ

0 голосов
/ 27 мая 2018

Позвольте мне попытаться преобразовать ваш код в общий код консоли отладки:

f()
where f = def
        () -> commands [
                debug(['something']),
                debug(['more stuff']),
                debug(['yet more stuff']),
        ]
        where aaa = (0 + (1 * 2))
        where bbb = 4
//        asserting 2 + 2 = 4 // FIXME: syntax error uncommented
        asserting '000' != null
        where ccc = [0, 1, 2, 3]
        where ddd = {'0': 0, '1': 1, }

Консоль отладки может выполнить следующее:

(debug console):0: ['something']
(debug console):0: ['more stuff']
(debug console):0: ['yet more stuff']
[(Command Object: N10game_logic12_GLOBAL__N_113debug_commandE),
 (Command Object: N10game_logic12_GLOBAL__N_113debug_commandE),
 (Command Object: N10game_logic12_GLOBAL__N_113debug_commandE)]

Давайте проверим, что ваша синтаксическая ошибка все еще существуетили, по крайней мере, некоторая синтаксическая ошибка при раскомментировании утверждения:

f()
where f = def
        () -> commands [
                debug(['something']),
                debug(['more stuff']),
                debug(['yet more stuff']),
        ]
        where aaa = (0 + (1 * 2))
        where bbb = 4
        asserting 2 + 2 = 4 // FIXME: syntax error uncommented
        asserting '000' != null
        where ccc = [0, 1, 2, 3]
        where ddd = {'0': 0, '1': 1, }

Консоль отладки не может выполнить:

error parsing formula: formula.cpp:3942 ASSERTION FAILED: Unexpected tokens after
where
At (debug console) 0:
... where bbb = 4       asserting 2 + 2 = 4 // FIXME syntax error uncommen...
                                        ^

Движок использует простой синтаксический анализ, и в настоящее время whereasserting и = (и, может быть, даже ,?) Можно комбинировать интуитивно понятным, но плохо управляемым синтаксическим анализатором.

Здесь, я думаю, найден вторичный = для where до достижения ,, но я не знаю.Прямо сейчас я не знаю точно, каковы критерии для окончательного разбора where.Вы могли бы узнать, просто отладив парсер.

Это важная проблема, но, возможно, не критичная, и необходимо исправить сейчас , что в основном можно решить, добавив больше исчерпывающих значений.

Давайте разместим только одну пару паренов, начнем с ошибочного утверждения:

f()
where f = def
        () -> commands [
                debug(['something']),
                debug(['more stuff']),
                debug(['yet more stuff']),
        ]
        where aaa = (0 + (1 * 2))
        where bbb = 4
        asserting (2 + 2 = 4) // FIXME: syntax error uncommented
        asserting '000' != null
        where ccc = [0, 1, 2, 3]
        where ddd = {'0': 0, '1': 1, }

Консоль отладки может снова выполнить:

(debug console):0: ['something']
(debug console):0: ['more stuff']
(debug console):0: ['yet more stuff']
[(Command Object: N10game_logic12_GLOBAL__N_113debug_commandE),
 (Command Object: N10game_logic12_GLOBAL__N_113debug_commandE),
 (Command Object: N10game_logic12_GLOBAL__N_113debug_commandE)]

2018 27 мая добавлена ​​ошибка определения местоположения.

...