Jawk
Реализация языка программирования AWKJawk — реализация AWK на Java, включающая в себя как интерпретатор (jawk.jar), так и компилятор в байт-код JVM (Jawk Compiler Module). Для запуска интерпретатора достаточно скачать соответствующий .jar-файл, и выполнить команду
java -jar jawk.jar {command-line-arguments}
Jawk полностью реализует язык AWK и предоставляет ряд дополнительных возможностей:
- компиляция в промежуточный формат, позволяющий избежать повторной компиляции и обфусцировать исходные скрипты.
- текстовые дампы абстрактного синтаксического дерева и промежуточного представления кода.
- хранение ассоциативных массивов отсортированными по ключу.
- выявление ошибок в параметре формата команд printf/sprintf (опция -r).
- компиляция скриптов в байт-код JVM.
- гибкая система расширений языка, создаваемых на Java.
В некоторых аспектах реализация отличается от спецификаций языка из-за использования Java в реализации (в основном это касается регулярных выражений и printf/sprintf).
Jawk лицензирован под GNU GPL.
Ссылки:
Примеры:
Hello, World!:
Пример для версий Jawk 1.02, gawk 3.1.6, mawk 1.3.3Печать выполняется шаблоном BEGIN
, т.е. перед обработкой входных данных. Сами данные не обрабатываются.
BEGIN { print "Hello, World!" }
Факториал:
Пример для версий Jawk 1.02, gawk 3.1.6, mawk 1.3.3Используется итеративное определение факториала. Отдельные команды в пределах блока могут разделятся точками с запятой или переносами строк.
BEGIN {
f = 1
print "0! = " f
for (i=1; i<17; i++) {
f *= i
print i "! = " f
}
}
Числа Фибоначчи:
Пример для версий Jawk 1.02, gawk 3.1.6, mawk 1.3.3Используется итеративное определение чисел Фибоначчи. fib
— ассоциативный массив, pr
— строка.
BEGIN {
fib[1] = 1
fib[2] = 1
for (i=3; i<17; i++)
fib[i] = fib[i-1]+fib[i-2]
pr = ""
for (i=1; i<17; i++)
pr = pr fib[i] ", "
print pr "..."
}
Квадратное уравнение:
Пример для версий Jawk 1.02, gawk 3.1.6, mawk 1.3.3{ A = $1
B = $2
C = $3
if (A == 0)
print "Not a quadratic equation"
else
{ D = B*B-4*A*C
if (D == 0)
print "x = " (-B/2/A)
else if (D > 0)
{ print "x1 = " ((-B+sqrt(D))/2/A)
print "x2 = " ((-B-sqrt(D))/2/A)
}
else
{ print "x1 = (" (-B/2/A) "," (sqrt(-D)/2/A) ")"
print "x2 = (" (-B/2/A) "," (-sqrt(-D)/2/A) ")"
}
}
}
CamelCase:
Пример для версий Jawk 1.02, gawk 3.1.6, mawk 1.3.3В реализации mawk нет функции length
для определения количества элементов массива. В реализации Jawk ее также нельзя использовать — возникает ошибка “Cannot evaluate an unindexed array.”.
Вместо этого во всех реализациях можно использовать то, что функция split
возвращает количество полученных ею фрагментов. В остальном этот пример аналогичен примеру для gawk.
{ text = $0;
N = split(text, words, /[^a-zA-Z]+/);
for (i=1; i<=N; i++) {
res = res toupper(substr(words[i],1,1)) tolower(substr(words[i],2));
}
print res
}
Комментарии
]]>blog comments powered by Disqus
]]>