]]> ]]>

Jawk

Реализация языка программирования AWK

Jawk — реализация 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

]]>

Работа программистам