AEL2 новая версия компилятора AEL, написанная Steve Murphy.
Он был вначале представлен как большой патч Астериска в базе данных ошибок Астериска. Смотри http://bugs.digium.com/view.php?id=6021

Соглашения и Новости AEL2


НОВОЕ: Хорошая новость для всех фанатов AEL2.
НОВОЕ:
НОВОЕ:

Язык Расширений Астериска в.2


AEL в.2 предназначается для предоставления действительного языка программирования, который может использоваться для написания диалплана Астериска. Он далее продолжает AEL и предоставляет более гибкий синтаксис, больше сообщений об ощибках и некоторую недостающую функциональность.

AEL действительно объединяет 4 различных “языка” или синтаксиса:
  • Первый и наиболее очевидный—это сам синтаксис AEL в.2. BNF предоставляется в конце этого документа.
  • Второй синтаксис—Синтаксис Выражения, который нормально обрабатывает механизм расширения Астериска, выражения, заключнные в $[…].
  • Третий синтаксис—Синтаксис Ссылки Переменной, вещи, заключенные в ${…}. Это бит более включенный, чем помещение имени переменной в нем. Вы можете включить одну из дюжины “функций” и их аргументы, и это только какая-то строка манипуляции замечания там.
  • Последний синтаксис, который лежит в AEL/AEL2 и не используется непосредственно в AEL/AEL2—это Синтаксис Языка Расширения. Язык расширения—это то, что вы видите в extensions.conf, и AEL2 компилирует более высокий уровень языка AEL2 в расширениях и приоритетах, и передает их через вызовы функции в Астериск. ***

Каждый программист AEL должен быть знаком с его синтаксисом, конечно, так же хорошо, как с синтаксисом Выражения и синтаксисом Переменной. Ссылки на страницы Wiki, находятся внизу секции “ The Power of AEL”, которая вверху.

Астериск в двух словах


Астериск действует как сервер. Устройства, включенные в телефонирование, типа плат Zapata или VOIP телефонов, все показывают какой-либо контекст, который должен быть активирован в их интересах. Смотри файлы конфигурации, задающие форматы для IAX, SIP, zapata.conf, и т.д. Все они помогают описать устройство и все они указывают контекст для активации, когда кто-нибудь поднимает телефон, или приходит вызов от телефонной компании, или voip телефон и т.д.

Контексты
Контексты группируются расширениями.

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

Расширения и приоритеты
Контекст содержит ноль или более расширений. Вот несколько предопределенных расширений. Расширение “s”—это расширение “start”, и когда устройство активирует контекст, “s” расширение–одно, которое готовится запуститься. Другие расширения – это таймаут “t” расширение, допустимый ответ, и “i” расширени, и есть расшиерние “fax”. Для примера, обычный вызов будет активирован “s” расширением, но входящий FAX вызов придет в “fax” расширение, если оно сущкствует. (Кстати, Астериск может сказать, когда обращаются к факсу, маленьким “звуковым сигналом”, который выдает факс каждые несколько секунд.)

Расширения содержат несколько приоритетов, которые являются индивидуальными инструкциями для выполнения. Другие – такой комплекс, как инициированное приложение Речевой почты, для примера. Приоритеты выполняются надлежащим образом.

Когда расширение “s” завершается, Астериск ждет до времени ожидания для ответа. Если ответ совпадает с образцом расширения в контексте, тогда управление переходит к тому расширению. Обычно ответы издаются тонами, когда пользователь нажимает кнопку на телефоне. Например, контекст, ассоциированный с телефоном пульта управления, может не иметь расширения “s”. Он просто проигрывает диалтон до тех пор, пока кто-нибудь не стартует нажатием номера на клавиатуре телефона, собрать номер, найденный сопоставленным расширением, и начать исполнять его. Это расширение может набрать номер через соединенную телефонную линию для пользователя и затем соединяет две линии вместе.

Расширения также могут содержать расширения “jump” или “goto” для того, чтобы пропустить расширения в других контекстах. Условия предоставляют возможность влиять на различные входные сигналы, и они у вас есть.

Макрос
Считайте макрос комбинацией контекстов с одним анонимным расширением и подпрограммой. Он имеет аргументы, подобно подпрограмме. Вызов макроса может быть сделан внутри расширения, и отделтный операторы выполняются до тех пор, пока он не закончится. В этом пункте выполнение возвращается к следующему оператору после вызова макроса. Макрос может вызвать другие макросы. И они работают подобно вызовам функции.

Приложения
Вызовы приложения, такие как “Dial()”, или “Hangup()”, или “Answer()” доступны для пользователей для того, чтобы выполнять работу диалплана. Существует более 145 их на момент написания этого. И список все растет. Некоторые приложения делают довольно простые вещи, некоторые предоставляют на удивление сложные сервисы.

Надеемся, что вышеописанные объекты позволят вам делать то, что вам надо, в среде Астериска.

Подготовка


В следующем обсуждении, если вы используете “rtunk” версии Астериска, пжлст заметьте, что AEL2 восстанавливает оригиналуную реализацию AEL. Так, в следующем обсуждении везде, где упоминаются “ael2” или “AEL2”, их можно заменить на “ael” и “AEL”. Например, в обсуждении ниже вы можете напечатать команду “ael2 reload”, если вы используете Астериск версии 1.2.х; но если у вас версия “trunk”, вы должны писать “ael reload”.

Как бы там ни было, для этой инсталляции AEL2 в версию 1.2 Астериска, надо отметить, что ael2 и AEL2 должны использоваться как as-is.

Парсер AEL2 (pbx_ael2.so) полностью отделен от модуля, который анализирует extensions.conf (pbx_config.so). Для того, чтобы использовать AEL, единственная вещь, которую надо сделать—это модуль pbx_ael.so должен быть загружен Астериском. Это делается автоматически, если используется “autoload=yes” в /etc/asterisk/modules.conf. Когда модуль загружен, он будет искать “extensions.ael” в /etc/asterisk/. Оба extensions.conf и extensions.ael могут быть использованы в конъюнкции с любым другим, если это требуется. Некоторые пользователи могут хотеть сохранить extensions.conf для признаков, которые сконфигурированы в сегменте “general” файла extensions.conf.

Перезагрузка extensions.ael2


Для того, чтобы перезагрузить extensions.ael2, следующая команда должна быть выдана в CLI.

*CLI> ael2 reload

Отладка


Верно в настоящий момент, следующие команды возможны, но ничего не делают.

Разрешает отладку контекстов AEL2
*CLI> ael2 debug contexts

Разрешает отладку макросов AEL2
*CLI> ael2 debug macros

Разрешает отладку AEL2 операции чтения блока
*CLI> ael2 debug read

Разрешает отладку AEL2 лексем
*CLI> ael2 debug tokens

Отключает отладочные сообщения AEL2
*CLI> ael2 no debug

Если вещи, которые вы делаете, направильны в вашем диалплане, вы можете использовать следующие средства для отладки вашего файла:
1. Журнал сообщений в /var/log/Asterisk. (с проверок выполняющихся во время загрузки)
2. Команда в Астериске “show dialplan”.
3. Автономное выполнение, построение “aelparce” в utils/dir в источнике.

Вы также можете использовать программу “aelparse” для того, чтобы проверить файл “extensions.ael2” перед подачей его в Астериск. Хорошо ли это для устранения большинства ошибок перед передачей файла Астериску?

AELPARSE


Вы никогда не должны помещать код в /etc/extansion.ael без его предварительной проверки с помощью aelparse!
Программа aelparse встроена в директории Asterisk/utils. Это автономный exec и принимает только опции –d, -w, -q и –n.

-d: Вместо чтения файла “extensoins.ael2” из /etc/Asterisk, он будет искаться в текущей директории.
-w: Преобразование входного файла диалплана (extension.ael2) в формат extensions.conf и вывод файла в текущую директорию под именем “extensions.conf.aeldump”.
-n: Не выводить вызовы функции для построения расширения в Астериске.
-q (подразумевается n): Весьма много, только показывает предупреждения и ошибки.

Общие замечания о синтаксисе


Заметим, что синтакс и стиль – немного более свободной формы. Открытые “{” (фигурные скобки) не должны быть на той же самой строке, что и ключевое слово, которое им предшествует. Операторы должны быть оазбиты по строкам, пока элементарные значения не разорвутся деланием этого. Более одного оператора может содержаться на одной строке. Любой из вас думает, что это лучшее!

Вы можете легко написать,
”if(${x}=1) { NoOp(hello!); goto s|3; } else { NoOp(Goodbye!); goto s|12; }“

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

if(${x}=1)
{
NoOp(hello!);
goto s|3;
}
else
{
NoOp(Goodbye!);
goto s|12;
}

или:

if(${x}=1) {
NoOp(hello!);
goto s|3;
} else {
NoOp(Goodbye!);
goto s|12;
}

или:

if (${x}=1) {
NoOp(hello!); goto s|3;
} else {
NoOp(Goodbye!); goto s|12;
}

или даже:

if
(${x}=1)
{
NoOp(hello!);
goto s|3;
}
else
{
NoOp(Goodbye!);
goto s|12;
}

Зарезервированные слова


Зарезервированные слова в AEL регистро зависимы. Если имя команды и зарезервированное слово перекрываются, это вероятно хороший аргумент, чтобы вы обдумали замену вызова команды с оператором AEL2. Если вы не хотите так делать, вам надо все-таки использовать команду, используя преобразованный из строчного в заглавный символ где-либо в ее имени. В AEL имена команд регистро НЕзависимы.

В AEL2 существуют следующие зарезервированные слова:

• abstract
• context
• macro
• globals
• ignorepat
• switch
• if
• ifTime
• else
• random
• goto
• jump
• return
• break
• continue
• regexten
• hint
• for
• while
• case
• pattern
• default — NOTE: the "default" keyword can be used as a context name, for those who would like to do so.
• catch
• switches
• eswitches
• includes