Мне нужно понимание логики условных синтаксисов Rivescript

      ! var name = Alex

+ my name is *
* <formal>   == <bot name> => Wow, we have the same name!<set name=<formal>>
* <get name> == undefined  => <set name=<formal>>Nice to meet you!
- <set oldname=<get name>><set name=<formal>> I thought your name was <get oldname>?

Я не понимаю, как интерпретатор rivescript будет интерпретировать этот код в последовательности, особенно 4-я строка меня сильно смутила. Может ли кто-нибудь объяснить мне, как этот код будет выполняться построчно?

Например: - В 4-й строке (<set oldname=> <set name =>), если мне нужно вернуть первое имя, которое сказал пользователь, я все равно могу сделать это без этой логики (упомянутой выше) и установить имя переменной вместо.

Следовательно, если пользователь говорит Алекс, а затем говорит Джон. Будет запущена 4-я строка, и бот сообщит пользователю, что его зовут Алекс.

1 ответ

В каждом языке сценарий сначала токенизируется, затем анализируется в AST (абстрактное синтаксическое дерево), а затем интерпретируется AST.

Пример Rivescript AST из https://github.com/aichaos/rivescript-python/blob/master/rivescript/parser.py

      ...
"triggers": [   # array of triggers
                            {
                                "trigger": "hello bot",
                                "reply": [], # array of replies
                                "condition": [], # array of conditions
                                "redirect": None, # redirect command
                                "previous": None, # 'previous' reply
                            },...

Если у вас нет опыта реализации на вашем собственном языке программирования, я рекомендую попробовать этот курс https://github.com/kanaka/mal/blob/master/process/guide.md

Другие вопросы по тегам