[Конкурс] Транслятор языка

 
1 2 3 4 5 6 7 13
EE Татарин #04.08.2008 23:26
+
-
edit
 

Татарин

координатор
★★★★☆
Язык оперирует одним типом данных - вещественными числами, в которых заключена вся хитрость. Вещественные записываются в виде:
/возможен "-"/цифры.цифрыE/возможен "-"/цифрыBцифры
Цифры до точки - целая часть числа, после точки (необязательно) - дробная часть (если отсутсвует, то принимается за 0). Эту часть будем называть множителем.
После Е (латинская Е большая) необязательная часть - степень основания текущей системы счисления. Эту часть будем называть показателем. Если отсутствет, то принимается за 0.
После B (латинская B большая) необязательная часть - основание системы счисления (от 2 до 10 включительно). Если отсутсвует, то принимается за 10.

Первые нули, если они присутствуют, - не являются значимыми.

Примеры записи чисел:
101 (=101)
101B2 (=5)
1.01E2B2 (=5)
5B6 (=5)
314 (=314)
314.159 (=314.159)
3.14159Е2 (=314.159)
3.14159Е2B10 (=314.159)

Ограничения на длину чисел - как множителя, так и показателя - сто тысяч значащих цифр. Число 3.141591256137462364012630941207823456782346734657634789653478969723465623478659834657834695623895347658934623Е2346279469234689623489
- является корректным числом.

Некорректно заданное число, а также результат деления на ноль и т.п. некорректных операций являются особого рода числом - "нечислом". Примеры:
12Q12356 (="нечисло")
1.-1E12 (="нечисло")
5.3B2 (="нечисло")
1/0 (="нечисло")

Число значащих цифр (точность числа) есть сумма количества цифр дробной и целой части множителя (нули справа целой части - не считаются).
1.0 (две значащих цифры)
10 (две значащих цифры)
0.1 (одна значащая цифра)
1Е2 (одна значащая цифра)
0000000001 (одна значащая цифра)
1.1B3 (две значащих цифры)
111В2 (одна значащая цифра)
111.11В2 (пять значащих цифр)

Точность результатов вычислений определяется точностью задания чисел. Точность результатов вычислений может быть повышена в процессе вычислений согласно простому правилу: при сложении или вычитании берётся наибольшая точность операндов. При умножении или делении точность операндов складывается. Перед операцией числа приводятся к системе счисления числа с наибольшим базисом (при этом, после перевода число с меньшим базисом сохраняет абсолютное количество значащих цифр (математически это неправильно, но здесь так есть :))). Например,
5.00 + 1Е1 = 15.00
5.0*3.0 = 15.00
1500 * 1Е-2 = 15.00
1/3 = 0.3
1.0/3.0 = 0.3333
1/1В2 = 0.25
1/1B3 = 0.33
111В2*1 = 8.000
Вроде бы, максимально понятно, не? :)


Существуют операции над числами:
code text
  1. + (сложение)
  2. - (вычитание)
  3. * (умножение)
  4. / (деление)
  5. ^ (степень)
  6. > (если то, что слева больше того, что справа, то результат единица, иначе - ноль; числа с разной точностью - это РАЗНЫЕ числа)
  7. < (если то, что слева меньше того, что справа, то результат единица, иначе - ноль; числа с разной точностью - это РАЗНЫЕ числа)
  8. == (если правое и левое равны, то единица, иначе ноль)


Операторы <, >, == имеют наинизший приоритет.
Операторы * и / имеют приоритет над + и -,
Оператор ^ имеет приоритет над *, /, + и -.
Сначала исполняются операторы с наивысшим приоритетом.
Скобки ( и ) могут менять приоритет исполнения. Например, выражение (2+1)*2 даст 6
В остальном порядок исполнения определяется порядком в выражении.

Деление на ноль даёт нечисло.
Любая операция с нечислом даёт нечисло.
Исключение - оператор ==. Сравнивание нечисла с нечислом через этот оператор даёт 1, если же нечисло - лишь одно из операндов, то оператор даёт 0.



Язык case sensitive, имена могут состоять из букв латинского алфавита от a до z, цифр и символа подчёркивания "_", но не могут начинаться с цифры.
Операторы разделяются символом точки с запятой ;.
Пробелы и переводы строки игнорируются и могут стоять в любом месте и любом количестве.
Переменные заводятся в тот момент, когда они впервые встретились в контексте по ходу исполнения. После заведения они содержат "нечисло". Например,
B = 1 (после выполнения существует переменная B равная 1)
В = 1*А (А - впервые упомянута, после выполнения В - нечисло)

Везде, где может стоять переменная, может стоять число или выражение любой сложности.
Выражение [переменная] подставляет значение целой части переменной в текст программы. Например,
B[A] = 2 (при выполнениии A = 1.01Е2В2, программа должна выполнить "B101 = 2")

Встроенные операторы:
print(переменная) - выводит переменную в её системе счисления с её родной точностью (нечисло выводится как NaN)
if(переменная)оператор - выполняет оператор, если переменная не нечисло и не 0
goto(метка) - безусловный переход исполнения на метку (метка имеет вид :метка: (и является нормальным оператором, то есть, отделяется точкой с запятой). Например, :a:; - метка а)
while(переменная)оператор - выполняет оператор до тех пор, пока переменная является числом и не равна 0.
{} - все операторы, что внутри этих скобок считаются одним оператором (например, if(a=3){print(a);print(b);}
plot(переменная1, переменная2, переменная3, переменная4) - ставит в окне программы/на экране точку с координатами (х=переменная1, у=переменная2), цветом переменная3 и ключом переменная4.
Размеры окна/экрана вывода - на усмотрение программиста, внутренние "программные" координаты с каждым выводом точки пересчитываются так, чтобы все точки всегда находились внутри экрана, всё изображение всегда внутри окна/экрана. Максимальное значение использованого когда-либо цвета соответсвует белому, минимальное - чёрному, цвета всех точек пересчитываются при каждом выводе.
unplot(переменная) - удаляет с экрана все точки с ключом переменная.

Интерпретатор должен уметь читать программу из файла.
Выполнение начинается с первой строки файла.
Программа всегда состоит из одного оператора.

В случае ошибки, интерпретатор обязан выдать строку в интерпретируемом файле, назвать ошибку и ожидать какого-нить нажатия клавиши или что-то в этом роде.
В случае нормального завершения, программа должна завершить процесс (ничего не ждать, а то бенчмаркить запаримся :)).

Реализация функциональности - на усмотрение программиста. Отсутсвие функциональности засчитывается как её нулевое быстродействие. :)
...А неубитые медведи делили чьи-то шкуры с шумом. Боюсь, мы поздно осознали, к чему всё это приведёт.  
Это сообщение редактировалось 05.08.2008 в 15:29
US Сергей-4030 #04.08.2008 23:44
+
-
edit
 

Сергей-4030

исключающий третье
★★
Уточнение - т.е. некорректно заданное число не вызывает ошибку выполнения? Оно просто "забывается"?
 
EE Татарин #04.08.2008 23:46  @Сергей-4030#04.08.2008 23:44
+
-
edit
 

Татарин

координатор
★★★★☆
Сергей-4030> Уточнение - т.е. некорректно заданное число не вызывает ошибку выполнения? Оно просто "забывается"?
Да. Как и деление на ноль или корень из -1.
...А неубитые медведи делили чьи-то шкуры с шумом. Боюсь, мы поздно осознали, к чему всё это приведёт.  
EE Татарин #04.08.2008 23:49
+
-
edit
 

Татарин

координатор
★★★★☆
Не перебор по части требуемого времени, нет?
...А неубитые медведи делили чьи-то шкуры с шумом. Боюсь, мы поздно осознали, к чему всё это приведёт.  
US Сергей-4030 #05.08.2008 00:10  @Татарин#04.08.2008 23:49
+
-
edit
 

Сергей-4030

исключающий третье
★★
Татарин> Не перебор по части требуемого времени, нет?

Нормально.
 
US Сергей-4030 #05.08.2008 00:20
+
-
edit
 

Сергей-4030

исключающий третье
★★
Еще одно. Т.е. 1SOMETHING есть нечисло, а просто SOMETHING - переменная? Неправильных чисел нет в принципе?
 
EE Татарин #05.08.2008 00:28  @Сергей-4030#05.08.2008 00:20
+
-
edit
 

Татарин

координатор
★★★★☆
Сергей-4030> Еще одно. Т.е. 1SOMETHING есть нечисло, а просто SOMETHING - переменная? Неправильных чисел нет в принципе?
Да, именно так. Имена переменных не могут начинаться с цифры (умолчание частое, но я должен был дописать).
...А неубитые медведи делили чьи-то шкуры с шумом. Боюсь, мы поздно осознали, к чему всё это приведёт.  
EE Татарин #05.08.2008 00:35
+
-
edit
 

Татарин

координатор
★★★★☆
Кстати, там местами математика несколько странна. Это намеренно, и оценивается, как всегда, именно соответсвие ТЗ. :)
...А неубитые медведи делили чьи-то шкуры с шумом. Боюсь, мы поздно осознали, к чему всё это приведёт.  
US Сергей-4030 #05.08.2008 01:17
+
-
edit
 

Сергей-4030

исключающий третье
★★
Ах да, еще. Если показатель степени пропущен - это число, или нет? Скажем:

100EB2
 
US Сергей-4030 #05.08.2008 01:29
+
-
edit
 

Сергей-4030

исключающий третье
★★
OK, буду считать, что это не число.
 
US Сергей-4030 #05.08.2008 05:11
+
-
edit
 

Сергей-4030

исключающий третье
★★
Операторы * и / имеют приоритет над + и -,
Оператор ^ имеет приоритет над *, /, + и -.
Операторы <, >, == имеют приоритет над всеми.
Сначала исполняются операторы с наивысшим приоритетом.
Скобки ( и ) могут менять приоритет исполнения. Например, выражение (2+1)*2 даст 6
В остальном порядок исполнения определяется порядком в выражении.
 


Т.е. A+B>C значит A+(B>C)? Как-то нетривиально. :)
 
EE Татарин #05.08.2008 13:02  @Сергей-4030#05.08.2008 01:29
+
-
edit
 

Татарин

координатор
★★★★☆
Сергей-4030> OK, буду считать, что это не число.
Да, всё правильно.

Сергей-4030> Т.е. A+B>C значит A+(B>C)? Как-то нетривиально. :)
Уй, как стормозил. Нет мне прощения. Дерьмовый из меня тим-лид, значит, был. :)
Виноват, да: сравнение имеет наинизший приоритет, сейчас пофикшу.
...А неубитые медведи делили чьи-то шкуры с шумом. Боюсь, мы поздно осознали, к чему всё это приведёт.  
RU Balancer #05.08.2008 13:06  @Татарин#05.08.2008 13:02
+
-
edit
 

Balancer

администратор
★★★★★
Татарин> Виноват, да: сравнение имеет наинизший приоритет, сейчас пофикшу.

У присваивания ниже :)
 
EE Татарин #05.08.2008 13:09  @Balancer#05.08.2008 13:06
+
-
edit
 

Татарин

координатор
★★★★☆
Татарин>> Виноват, да: сравнение имеет наинизший приоритет, сейчас пофикшу.
Balancer> У присваивания ниже :)
А об этом ни слова нет, это и так все знают. :)
...А неубитые медведи делили чьи-то шкуры с шумом. Боюсь, мы поздно осознали, к чему всё это приведёт.  
BG Реконструктор #05.08.2008 15:05  @Татарин#04.08.2008 23:26
+
-
edit
 
Татарин> Программа всегда состоит из одного оператора.

Т.е. без подпрограмм?
 
EE Татарин #05.08.2008 15:24  @Реконструктор#05.08.2008 15:05
+
-
edit
 

Татарин

координатор
★★★★☆
Татарин>> Программа всегда состоит из одного оператора.
Реконструктор> Т.е. без подпрограмм?
Без.
...А неубитые медведи делили чьи-то шкуры с шумом. Боюсь, мы поздно осознали, к чему всё это приведёт.  
BG Реконструктор #05.08.2008 20:28
+
-
edit
 
Как насчет выполнения кода? Построчно или обработка перед выполнением, типа JIT compilation?
 
US Сергей-4030 #05.08.2008 20:51
+
-
edit
 

Сергей-4030

исключающий третье
★★
Блин, похоже, сегодня не успею. :( Парсер/исполнение начерно сделал, но бесконечную арифметику и рисование придется делать завтра, сегодня работы куча по работе. Так что если Реконструктор сегодня все доделает - у него много шансов выиграть. Но если завтра - то как минимум ничья. :)
 
EE Татарин #05.08.2008 21:01  @Реконструктор#05.08.2008 20:28
+
-
edit
 

Татарин

координатор
★★★★☆
Реконструктор> Как насчет выполнения кода? Построчно или обработка перед выполнением, типа JIT compilation?
Это лично твой выбор - ТЗ и критерии его оценки тебе известны.
Ты ж не кодер, а программист. Выбор структуры программы и способов решения задач - за тобой.
...А неубитые медведи делили чьи-то шкуры с шумом. Боюсь, мы поздно осознали, к чему всё это приведёт.  
US Сергей-4030 #05.08.2008 21:22
+
-
edit
 

Сергей-4030

исключающий третье
★★
Кстати, с goto страдать просто жопа. :( Я как-то проглядел goto, нарисовал схему исполнения, все красивенько, а тут - goto. :( Пришлось переписывать. goto - вред, однозначно. :)
 
EE Татарин #05.08.2008 21:35  @Сергей-4030#05.08.2008 21:22
+
-
edit
 

Татарин

координатор
★★★★☆
Сергей-4030> Кстати, с goto страдать просто жопа. :( Я как-то проглядел goto, нарисовал схему исполнения, все красивенько, а тут - goto. :( Пришлось переписывать. goto - вред, однозначно. :)
Дык! Не раз уже авторитеты о том говорили. :)

Да, это был намеренный вред - он введён именно ради того, чтоб можно было встроить метку куда угодно, и усложнить (иначе, ИМХО, слишком простую) иерархическую структуру.
...А неубитые медведи делили чьи-то шкуры с шумом. Боюсь, мы поздно осознали, к чему всё это приведёт.  
BG Реконструктор #05.08.2008 21:48  @Татарин#05.08.2008 21:01
+
-
edit
 
Реконструктор>> Как насчет выполнения кода? Построчно или обработка перед выполнением, типа JIT compilation?
Татарин> Это лично твой выбор - ТЗ и критерии его оценки тебе известны.
Татарин> Ты ж не кодер, а программист. Выбор структуры программы и способов решения задач - за тобой.

Супер. :D
Насчет ^, пологаю, что правый операнд может быть что угодно, не только целочисленое?
 
BG Реконструктор #05.08.2008 21:50  @Сергей-4030#05.08.2008 20:51
+
-
edit
 
Сергей-4030> Блин, похоже, сегодня не успею. :( Парсер/исполнение начерно сделал, но бесконечную арифметику и рисование придется делать завтра, сегодня работы куча по работе. Так что если Реконструктор сегодня все доделает - у него много шансов выиграть. Но если завтра - то как минимум ничья. :)

Ну, я буду делать это как минимум 2 недели. Так что не беспокойся.
 
US Сергей-4030 #05.08.2008 22:26
+
-
edit
 

Сергей-4030

исключающий третье
★★
Гы. Только что моск сломал, думаючи, где у меня баг. Запускал такой тест:

code text
  1. {
  2.         a=1;
  3.         b=2;
  4.         c=3;
  5.         while(c>0) {
  6.                 :next:;
  7.                 d=b*b-4*a*c;
  8.                 if(d>0)
  9.                         print(d);
  10.                 if(d==8)
  11.                         goto next;
  12.         }
  13.         if(b==5)
  14.                 goto next;
  15. }


Она мне говорит - ашипка в строке 13, неверный символ IF, ждем ';'. А я не врубаюсь - с какой стати. :lol: Ищу багу, ищу... А вы видите? ;)
 
RU Kernel3 #05.08.2008 22:34  @Сергей-4030#05.08.2008 22:26
+
-
edit
 

Kernel3

аксакал

Сергей-4030> Она мне говорит - ашипка в строке 13, неверный символ IF, ждем ';'. А я не врубаюсь - с какой стати. :lol: Ищу багу, ищу... А вы видите? ;)
Ээээээ... А в какой момент эта штука вообще должна из цикла выйти? %(
Broken Windows® cures my ills and makes me feel alright... ©  
1 2 3 4 5 6 7 13

в начало страницы | новое
 
Поиск
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru