lex.pas 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. const
  2. DEY = ['+','-','*','/'];
  3. Type
  4. PBTree = ^TBTree;
  5. TBTree = record
  6. info : char;
  7. Left : PBTree;
  8. Right: PBTree;
  9. end;
  10. ps = ^el;
  11. el = record
  12. data : integer;
  13. prev : ps;
  14. end;
  15. Var
  16. inp : string;
  17. p : byte;
  18. tree: PBTree;
  19. out : string;
  20. Procedure BackPolsk(Tr:PBTree);
  21. begin
  22. if ((Tr^.left^.left<>nil) and (Tr^.left^.right<>nil)) then BackPolsk(Tr^.left);
  23. out := out+Tr^.left^.info;
  24. if ((Tr^.right^.left<>nil) and (Tr^.right^.right<>nil)) then BackPolsk(Tr^.right);
  25. out := out+Tr^.right^.info;
  26. end;
  27. {---------------------------------}
  28. Procedure DelBranch(br:PBTree);
  29. begin
  30. if br^.left <> nil then DelBranch(br^.left);
  31. if br^.right <> nil then DelBranch(br^.right);
  32. Dispose(br);
  33. end;{DelBranch}
  34. {-=-==-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-}
  35. Procedure Create(TR:PBTree);
  36. begin
  37. New(Tr^.left);
  38. Tr^.left^.right:=nil;
  39. Tr^.left^.left:=nil;
  40. if inp[p] = '(' then
  41. begin
  42. inc(p);
  43. Create(tr^.left);
  44. end
  45. else
  46. tr^.left^.info := inp[p];
  47. inc(P);
  48. tr^.info := inp[p];
  49. inc(p);
  50. new(tr^.right);
  51. Tr^.right^.right:=nil;
  52. Tr^.right^.left:=nil;
  53. if (inp[p]='(') then
  54. begin
  55. inc(p);
  56. Create(tr^.right)
  57. end
  58. else
  59. tr^.right^.info := inp[p];
  60. if (inp[p+1]=')') then inc(p);
  61. end;{---=--=--=-=-=-=-=-=---=-=-=-=-=--}
  62. Procedure PUSH(i:integer;var head:ps);
  63. var ne : ps;
  64. begin
  65. New(ne);
  66. ne^.data := i;
  67. ne^.prev := head;
  68. head := ne;
  69. end;
  70. Function POP(var head:ps):integer;
  71. var ret:integer;newhead:ps;
  72. begin
  73. ret := head^.data;
  74. newhead := head^.prev;
  75. Dispose(head);
  76. head := newhead;
  77. POP := ret;
  78. end;
  79. {-=-=-=-=-===-=-=-=-=-=-=-=-=-=-=-=-=-}
  80. Procedure MakeD(var num1:integer;num2:integer;dey:char);
  81. begin
  82. case dey of
  83. '+': num1 := num1 + num2;
  84. '-': num1 := num1 - num2;
  85. '*': num1 := num1 * num2;
  86. '/': if num2 <> 0 then num1 := num1 div num2;
  87. end;
  88. end;
  89. {-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-}
  90. Procedure Calculate(polsk:string;var header : ps);
  91. Var
  92. pos1 : byte;
  93. num1,
  94. num2 : integer;
  95. begin
  96. for pos1 := 1 to length(polsk) do
  97. begin
  98. if polsk[pos1] in dey then
  99. begin
  100. num2 := POP(header);
  101. num1 := POP(header);
  102. makeD(num1,num2,polsk[pos1]);
  103. PUSH(num1,header);
  104. end
  105. else
  106. begin
  107. num1:=ord(polsk[pos1])-ord('0');
  108. PUSH(num1,header);
  109. end;
  110. end;
  111. end;
  112. {--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--}
  113. var
  114. header:ps;
  115. {--------------------------------------}
  116. Begin
  117. New(Tree);
  118. Tree^.left:=nil;
  119. Tree^.right:=nil;
  120. p:=1;
  121. WriteLn('Enter expression, using brackets:');
  122. readln(inp);
  123. Create(tree);
  124. out :='';
  125. BackPolsk(tree);
  126. out:=out+Tree^.info;
  127. DelBranch(tree);
  128. header^.prev:=nil;
  129. Calculate(out,header);
  130. WriteLn('Back polsk record: ',out);
  131. WriteLN('Result: ',POP(header));
  132. Readln;
  133. End.