Мне нужно понимание логики условных синтаксисов 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