1. Куча / Говнокод #3204

    +131

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    #include <default.inc>
    
    var a:float=0.0;
    var b:float=0.0;
    var c:float=0.0;
    var d:float=0.0;
    var x1:float=0.0;
    var x2:float=0.0;
    
    ::no
    	write 'Enter A: ';
    	in a;
    	write 'Enter B: ';
    	in b;
    	write 'Enter C: ';
    	in c;
    	write '$a*x^2+$b*x+c=0	[y/n]: ';
    	var s:string='';
    	string readline(s);
    	if eq(s, 'y') yes : no;
    	::yes
    	math d='b*b-4*a*c';
    	
    if eq(d, 0) dzero : dnzero;
    if low(d, 0) dex;
    
    ::dzero
    	math x1='(-b)/(2*a)';
    	writeln 'X = $x1';
    	jump exit;
    
    ::dnzero
    	math x1='(-b+Math.sqrt(d))/(2*a)';
    	math x2='(-b-Math.sqrt(d))/(2*a)';
    	write 'X1 = $x1		X2 = $x2';
    	jump exit;
    
    ::dex
    	write 'Don`t exist!';
    
    ::exit
    	write 'Repeat? [y/n]';
    	string readline(s);
    	if eq(s, 'y') no;
    	write 'Bye!';
    	call readkey;

    Программа развязывания квадратных уравнений на самодельном ЯП =)
    Да, это не совсем ГК, но тем не менее смешно.
    ЗЫ. В "default.inc" находятся ф-ции "write" и "readkey".

    Запостил: FMB, 12 Мая 2010

    Комментарии (20) RSS

    • Если уж сам язык делал, то мог бы сделать нормальные операторы присваивания и сравнения. А не так, что оператор, выглядящий, как оператор сравнения, на самом деле присваивает, а сравнивающий выглдит в виде двух равенств (это вообще кто такое извращение придумал...).
      Ответить
      • Делал я яп когда даже не подозревал про существование yacc, конечных автоматов и прочей компиляторостроительной фигни. И весь парсинг программы делается при помощи регулярных выражений =)
        Ответить
    • а где тут говно?
      насколько я понял возможности языка не дадут написать лучше.
      ну да куча goto, а так вроде все адекватно
      Ответить
      • Я же написал: "Да, это не совсем ГК, но тем не менее смешно".
        Ответить
        • да не очень как-то
          Ответить
          • Увидели бы вы код интерпретатора...
            Ответить
          • Вот маленькая часть интерпретатора:
            Regex ParseCMD = new Regex(@"\s*(?<func>[_a-zA-Z]+[_a-zA-Z0-9]*)\s+(?<operand>((\-|\+)?\d+(\.\d+)?)|.*?)\s*;\s*$");
            			Match cmdm = null;
            			SetDefConstant();
            			List<string> cmds = cmdslst;
            			cmds = ReplaceIncludes(cmds);
            			BuildLabelTree(cmds);
            			BuildFunctionList(cmds);
            			for (int CommandIndex = 0; CommandIndex < cmds.Count; CommandIndex++)
            			{
            					foreach (var Fi in funcs)
            					{
            						if (Fi.Value.FunctionStart == CommandIndex) CommandIndex = Fi.Value.FunctionEnd + 1;
            					}
            				if ((cmdm = ParseCMD.Match(cmds[CommandIndex])).Success)
            				{
            					string func = cmdm.Groups["func"].Value.ToLower(),
            						   operand = cmdm.Groups["operand"].Value;
            
            					switch (func)
            					{
            						case "in":
            							{
            								if (IsExistVar(operand))
            									vars[operand].SecondValue = ToDouble(Console.ReadLine().Replace('.', ','));
            							} break;
            
            // и так ещё 1000 строк кода
            Ответить
            • Да это нормально, у меня парсер тоже состоит из огромного числа else if.
              Правда, это только при считывании, там все строки переделываются во внутренние коды интерпретатора. А при вызове по кодам делается switch на 500 строчек.
              Ответить
              • нормально. Писал эмуль спекки на яве, не нашел ничего более подходящего, как свитч на околотого строк
                Ответить
    • позвольте, а зачем вам свой интерпретируемый скриптовый субьязык с интерпретатором на регекспах?
      я молчу про скорость выполнения скрипта, но еще сколько сил и времени грохать на разработку и отладку.....
      Ответить
      • На регексах потому, что другого метода на тот момент я не знал. Скорость мне была неважна, важен был результат.
        Ответить
        • я про то, зачем вообще изобретать "лисапед"?
          Ответить
          • Ну захотелось сделать что-то свое, и заодно узнать как же эти "лисапеды" изобретаются.
            Ответить
            • за стремление плюс, а за заодно... как говорится, "за изобретение пять, а по предмету неуд" - разве же на регекспах парсеры делают? если все еще интересно, почитайте, как делают другие
              Ответить
              • Ой, я, наверное, от жизни отстал, ибо все еще пишу на лексе. А там одни сплошные регэкспы.
                Это если не придираться к тому, что означает слово parse:)))
                Ответить

    Добавить комментарий