boolean | or and |
real | +-*/ mod div = < > <= >= |
integer | +-*/ mod div = < > <= >= |
множества | +-* |
строки | + [] |
Всё в целом вполне кривовато. Аргументы при вызове функции плохо проверяются. И вообще проверки плохо сделаны (ровно насколько чтобы компилятор не падал). Внутренние проверки заложены так же в интерпретатор, но сообщения в них не расставлены и при любой ошибке диагноза и причины не сообщается. Хотя по моим соображениям никаких ошибок в интерпретации или компиляции быть не должно, всё должно улавливаться ещё при генерации промежуточного представления, хотя это и сложнее.
Множества сделаны ввиде массивов 32 битных чисел, а значения являются битами. Значения эти выравниваются, т.е. если элемент множества имеет знаения 100, то он будет 4-тым битом в какой-либо ячейке массива, независимо от границ множества. Сделано это для того чтобы всеоперации множеств можно было делать побайтно (точнее по 4 байта). Не знаю правда нафига я это сделал, о скорости я особо не думал. А проблем это добавляет, потому как до конца не отлаживалось.
Строка writeln(['0'..'9']+'z'); - букву рисовать не будет, потому как сначала создаётся множество с границами цифровых знаков, затем к нему добавляется буква которая в границы не попадает. Но это всего лишь одна из недоделаных мелочей, особых проблем тут не вижу.
Вообщем как Реальный паскаль, за пределами прилагаемых текстов, использовать эту прогу нельзя.
Вообще в идеале я очень хотел бы приблизить качество кодогенератора к тому что делает человек. Есть сотни неприкаянных идей.