Data update
This commit is contained in:
parent
5150844a7d
commit
4bb20c9b71
7735 changed files with 38060 additions and 199180 deletions
|
|
@ -1,82 +0,0 @@
|
|||
type Priority is range 1..4;
|
||||
type Infix is record
|
||||
Precedence : Priority;
|
||||
Expression : Unbounded_String;
|
||||
end record;
|
||||
package Expression_Stack is new Generic_Stack (Infix);
|
||||
use Expression_Stack;
|
||||
|
||||
function Convert (RPN : String) return String is
|
||||
Arguments : Stack;
|
||||
procedure Pop
|
||||
( Operation : Character;
|
||||
Precedence : Priority;
|
||||
Association : Priority
|
||||
) is
|
||||
Right, Left : Infix;
|
||||
Result : Infix;
|
||||
begin
|
||||
Pop (Right, Arguments);
|
||||
Pop (Left, Arguments);
|
||||
Result.Precedence := Association;
|
||||
if Left.Precedence < Precedence then
|
||||
Append (Result.Expression, '(');
|
||||
Append (Result.Expression, Left.Expression);
|
||||
Append (Result.Expression, ')');
|
||||
else
|
||||
Append (Result.Expression, Left.Expression);
|
||||
end if;
|
||||
Append (Result.Expression, ' ');
|
||||
Append (Result.Expression, Operation);
|
||||
Append (Result.Expression, ' ');
|
||||
if Right.Precedence < Precedence then
|
||||
Append (Result.Expression, '(');
|
||||
Append (Result.Expression, Right.Expression);
|
||||
Append (Result.Expression, ')');
|
||||
else
|
||||
Append (Result.Expression, Right.Expression);
|
||||
end if;
|
||||
Push (Result, Arguments);
|
||||
end Pop;
|
||||
Pointer : Integer := RPN'First;
|
||||
begin
|
||||
while Pointer <= RPN'Last loop
|
||||
case RPN (Pointer) is
|
||||
when ' ' =>
|
||||
Pointer := Pointer + 1;
|
||||
when '0'..'9' =>
|
||||
declare
|
||||
Start : constant Integer := Pointer;
|
||||
begin
|
||||
loop
|
||||
Pointer := Pointer + 1;
|
||||
exit when Pointer > RPN'Last
|
||||
or else RPN (Pointer) not in '0'..'9';
|
||||
end loop;
|
||||
Push
|
||||
( ( 4,
|
||||
To_Unbounded_String (RPN (Start..Pointer - 1))
|
||||
),
|
||||
Arguments
|
||||
);
|
||||
end;
|
||||
when '+' | '-' =>
|
||||
Pop (RPN (Pointer), 1, 1);
|
||||
Pointer := Pointer + 1;
|
||||
when '*' | '/' =>
|
||||
Pop (RPN (Pointer), 2, 2);
|
||||
Pointer := Pointer + 1;
|
||||
when '^' =>
|
||||
Pop (RPN (Pointer), 4, 3);
|
||||
Pointer := Pointer + 1;
|
||||
when others =>
|
||||
raise Constraint_Error with "Syntax";
|
||||
end case;
|
||||
end loop;
|
||||
declare
|
||||
Result : Infix;
|
||||
begin
|
||||
Pop (Result, Arguments);
|
||||
return To_String (Result.Expression);
|
||||
end;
|
||||
end Convert;
|
||||
|
|
@ -1,12 +0,0 @@
|
|||
with Ada.Strings.Unbounded; use Ada.Strings.Unbounded;
|
||||
with Ada.Text_IO; use Ada.Text_IO;
|
||||
with Generic_Stack;
|
||||
|
||||
procedure RPN_to_Infix is
|
||||
-- The code above
|
||||
begin
|
||||
Put_Line ("3 4 2 * 1 5 - 2 3 ^ ^ / + = ");
|
||||
Put_Line (Convert ("3 4 2 * 1 5 - 2 3 ^ ^ / +"));
|
||||
Put_Line ("1 2 + 3 4 + ^ 5 6 + ^ = ");
|
||||
Put_Line (Convert ("1 2 + 3 4 + ^ 5 6 + ^"));
|
||||
end RPN_to_Infix;
|
||||
Loading…
Add table
Add a link
Reference in a new issue