diff options
| author | Georg Brandl <georg@python.org> | 2021-01-18 21:24:00 +0100 |
|---|---|---|
| committer | Georg Brandl <georg@python.org> | 2021-01-18 22:08:36 +0100 |
| commit | 2a3d3a7d5b9c60dedf6638d876161d9563faebcf (patch) | |
| tree | 809c0b4a686db98f5954afa1944404cd9652c6b2 /tests/lexers/modula2/example2.txt | |
| parent | f0445be718da83541ea3401aad882f3937147263 (diff) | |
| download | pygments-git-examplefiles.tar.gz | |
Move test_examplefiles to new tests/lexers scheme.examplefiles
Diffstat (limited to 'tests/lexers/modula2/example2.txt')
| -rw-r--r-- | tests/lexers/modula2/example2.txt | 1913 |
1 files changed, 1913 insertions, 0 deletions
diff --git a/tests/lexers/modula2/example2.txt b/tests/lexers/modula2/example2.txt new file mode 100644 index 00000000..6c15d32c --- /dev/null +++ b/tests/lexers/modula2/example2.txt @@ -0,0 +1,1913 @@ +---input--- +(* LIFO Storage Library + * + * @file LIFO.mod + * LIFO implementation + * + * Universal Dynamic Stack + * + * Author: Benjamin Kowarsch + * + * Copyright (C) 2009 Benjamin Kowarsch. All rights reserved. + * + * License: + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met + * + * 1) NO FEES may be charged for the provision of the software. The software + * may NOT be published on websites that contain advertising, unless + * specific prior written permission has been obtained. + * + * 2) Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 3) Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and other materials provided with the distribution. + * + * 4) Neither the author's name nor the names of any contributors may be used + * to endorse or promote products derived from this software without + * specific prior written permission. + * + * 5) Where this list of conditions or the following disclaimer, in part or + * as a whole is overruled or nullified by applicable law, no permission + * is granted to use the software. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + *) + + +IMPLEMENTATION (* OF *) MODULE LIFO; + +FROM SYSTEM IMPORT ADDRESS, ADR, TSIZE; +FROM Storage IMPORT ALLOCATE, DEALLOCATE; + + +(* --------------------------------------------------------------------------- +// Private type : ListEntry +// --------------------------------------------------------------------------- +*) +TYPE ListPtr = POINTER TO ListEntry; + +TYPE ListEntry = RECORD + value : DataPtr; + next : ListPtr +END; (* ListEntry *) + + +(* --------------------------------------------------------------------------- +// Opaque type : LIFO.Stack +// --------------------------------------------------------------------------- +// CAUTION: Modula-2 does not support the use of variable length array fields +// in records. VLAs can only be implemented using pointer arithmetic which +// means there is no type checking and no boundary checking on the array. +// It also means that array notation cannot be used on the array which makes +// the code difficult to read and maintain. As a result, Modula-2 is less +// safe and less readable than C when it comes to using VLAs. Great care must +// be taken to make sure that the code accessing VLA fields is safe. Boundary +// checks must be inserted manually. Size checks must be inserted manually to +// compensate for the absence of type checks. *) + +TYPE Stack = POINTER TO StackDescriptor; + +TYPE StackDescriptor = RECORD + overflow : ListPtr; + entryCount : StackSize; + arraySize : StackSize; + array : ADDRESS (* ARRAY OF DataPtr *) +END; (* StackDescriptor *) + + +(* --------------------------------------------------------------------------- +// function: LIFO.new( initial_size, status ) +// --------------------------------------------------------------------------- +// +// Creates and returns a new LIFO stack object with an initial capacity of +// <initialSize>. If zero is passed in for <initialSize>, then the stack +// will be created with an initial capacity of LIFO.defaultStackSize. The +// function fails if a value greater than LIFO.maximumStackSize is passed +// in for <initialSize> or if memory could not be allocated. +// +// The initial capacity of a stack is the number of entries that can be stored +// in the stack without enlargement. +// +// The status of the operation is passed back in <status>. *) + +PROCEDURE new ( initialSize : StackSize; VAR status : Status ) : Stack; + +VAR + newStack : Stack; + +BEGIN + + (* zero size means default *) + IF initialSize = 0 THEN + initialSize := defaultStackSize; + END; (* IF *) + + (* bail out if initial size is too high *) + IF initialSize > maximumStackSize THEN + status := invalidSize; + RETURN NIL; + END; (* IF *) + + (* allocate new stack object *) + ALLOCATE(newStack, TSIZE(Stack) + TSIZE(DataPtr) * (initialSize - 1)); + + (* bail out if allocation failed *) + IF newStack = NIL THEN + status := allocationFailed; + RETURN NIL; + END; (* IF *) + + (* initialise meta data *) + newStack^.arraySize := initialSize; + newStack^.entryCount := 0; + newStack^.overflow := NIL; + + (* pass status and new stack to caller *) + status := success; + RETURN newStack + +END new; + + +(* --------------------------------------------------------------------------- +// function: LIFO.push( stack, value, status ) +// --------------------------------------------------------------------------- +// +// Adds a new entry <value> to the top of stack <stack>. The new entry is +// added by reference, no data is copied. However, no entry is added if the +// the stack is full, that is when the number of entries stored in the stack +// has reached LIFO.maximumStackSize. The function fails if NIL is passed in +// for <stack> or <value>, or if memory could not be allocated. +// +// New entries are allocated dynamically if the number of entries exceeds the +// initial capacity of the stack. +// +// The status of the operation is passed back in <status>. *) + +PROCEDURE push ( VAR stack : Stack; value : DataPtr; VAR status : Status ); +VAR + newEntry : ListPtr; + valuePtr : POINTER TO DataPtr; + +BEGIN + + (* bail out if stack is NIL *) + IF stack = NIL THEN + status := invalidStack; + RETURN; + END; (* IF *) + + (* bail out if value is NIL *) + IF value = NIL THEN + status := invalidData; + RETURN; + END; (* IF *) + + (* bail out if stack is full *) + IF stack^.entryCount >= maximumStackSize THEN + status := stackFull; + RETURN; + END; (* IF *) + + (* check if index falls within array segment *) + IF stack^.entryCount < stack^.arraySize THEN + + (* store value in array segment *) + + (* stack^.array^[stack^.entryCount] := value; *) + valuePtr := ADR(stack^.array) + TSIZE(DataPtr) * stack^.entryCount; + valuePtr^ := value; + + ELSE (* index falls within overflow segment *) + + (* allocate new entry slot *) + NEW(newEntry); + + (* bail out if allocation failed *) + IF newEntry = NIL THEN + status := allocationFailed; + RETURN; + END; (* IF *) + + (* initialise new entry *) + newEntry^.value := value; + + (* link new entry into overflow list *) + newEntry^.next := stack^.overflow; + stack^.overflow := newEntry; + + END; (* IF *) + + (* update entry counter *) + INC(stack^.entryCount); + + (* pass status to caller *) + status := success; + RETURN + +END push; + + +(* --------------------------------------------------------------------------- +// function: LIFO.pop( stack, status ) +// --------------------------------------------------------------------------- +// +// Removes the top most value from stack <stack> and returns it. If the stack +// is empty, that is when the number of entries stored in the stack has +// reached zero, then NIL is returned. +// +// Entries which were allocated dynamically (above the initial capacity) are +// deallocated when their values are popped. +// +// The status of the operation is passed back in <status>. *) + +PROCEDURE pop ( VAR stack : Stack; VAR status : Status ) : DataPtr; + +VAR + thisValue : DataPtr; + thisEntry : ListPtr; + valuePtr : POINTER TO DataPtr; + +BEGIN + + (* bail out if stack is NIL *) + IF stack = NIL THEN + status := invalidStack; + RETURN NIL; + END; (* IF *) + + (* bail out if stack is empty *) + IF stack^.entryCount = 0 THEN + status := stackEmpty; + RETURN NIL; + END; (* IF *) + + DEC(stack^.entryCount); + + (* check if index falls within array segment *) + IF stack^.entryCount < stack^.arraySize THEN + + (* obtain value at index entryCount in array segment *) + + (* thisValue := stack^.array^[stack^.entryCount]; *) + valuePtr := ADR(stack^.array) + TSIZE(DataPtr) * stack^.entryCount; + thisValue := valuePtr^; + + ELSE (* index falls within overflow segment *) + + (* obtain value of first entry in overflow list *) + thisValue := stack^.overflow^.value; + + (* isolate first entry in overflow list *) + thisEntry := stack^.overflow; + stack^.overflow := stack^.overflow^.next; + + (* remove the entry from overflow list *) + DISPOSE(thisEntry); + + END; (* IF *) + + (* return value and status to caller *) + status := success; + RETURN thisValue + +END pop; + + +(* --------------------------------------------------------------------------- +// function: LIFO.stackSize( stack ) +// --------------------------------------------------------------------------- +// +// Returns the current capacity of <stack>. The current capacity is the total +// number of allocated entries. Returns zero if NIL is passed in for <stack>. +*) +PROCEDURE stackSize( VAR stack : Stack ) : StackSize; + +BEGIN + + (* bail out if stack is NIL *) + IF stack = NIL THEN + RETURN 0; + END; (* IF *) + + IF stack^.entryCount < stack^.arraySize THEN + RETURN stack^.arraySize; + ELSE + RETURN stack^.entryCount; + END; (* IF *) + +END stackSize; + + +(* --------------------------------------------------------------------------- +// function: LIFO.stackEntries( stack ) +// --------------------------------------------------------------------------- +// +// Returns the number of entries stored in stack <stack>, returns zero if +// NIL is passed in for <stack>. *) + +PROCEDURE stackEntries( VAR stack : Stack ) : StackSize; + +BEGIN + + (* bail out if stack is NIL *) + IF stack = NIL THEN + RETURN 0; + END; (* IF *) + + RETURN stack^.entryCount + +END stackEntries; + + +(* --------------------------------------------------------------------------- +// function: LIFO.dispose( stack ) +// --------------------------------------------------------------------------- +// +// Disposes of LIFO stack object <stack>. Returns NIL. *) + +PROCEDURE dispose ( VAR stack : Stack ) : Stack; + +VAR + thisEntry : ListPtr; + +BEGIN + + (* bail out if stack is NIL *) + IF stack = NIL THEN + RETURN NIL; + END; (* IF *) + + (* deallocate any entries in stack's overflow list *) + WHILE stack^.overflow # NIL DO + + (* isolate first entry in overflow list *) + thisEntry := stack^.overflow; + stack^.overflow := stack^.overflow^.next; + + (* deallocate the entry *) + DISPOSE(thisEntry); + + END; (* WHILE *) + + (* deallocate stack object and pass NIL to caller *) + DEALLOCATE(stack, TSIZE(Stack) + TSIZE(DataPtr) * (stack^.arraySize - 1)); + RETURN NIL + +END dispose; + + +END LIFO. + +---tokens--- +'(* LIFO Storage Library\n *\n * @file LIFO.mod\n * LIFO implementation\n *\n * Universal Dynamic Stack\n *\n * Author: Benjamin Kowarsch\n *\n * Copyright (C) 2009 Benjamin Kowarsch. All rights reserved.\n *\n * License:\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met\n *\n * 1) NO FEES may be charged for the provision of the software. The software\n * may NOT be published on websites that contain advertising, unless\n * specific prior written permission has been obtained.\n *\n * 2) Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * 3) Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and other materials provided with the distribution.\n *\n * 4) Neither the author\'s name nor the names of any contributors may be used\n * to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * 5) Where this list of conditions or the following disclaimer, in part or\n * as a whole is overruled or nullified by applicable law, no permission\n * is granted to use the software.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n * \n *)' Comment.Multiline +'\n\n\n' Text + +'IMPLEMENTATION' Keyword.Reserved +' ' Text +'(* OF *)' Comment.Multiline +' ' Text +'MODULE' Keyword.Reserved +' ' Text +'LIFO' Name +';' Punctuation +'\n\n' Text + +'FROM' Keyword.Reserved +' ' Text +'SYSTEM' Name.Builtin.Pseudo +' ' Text +'IMPORT' Keyword.Reserved +' ' Text +'ADDRESS' Name.Builtin.Pseudo +',' Punctuation +' ' Text +'ADR' Name.Builtin.Pseudo +',' Punctuation +' ' Text +'TSIZE' Name.Builtin +';' Punctuation +'\n' Text + +'FROM' Keyword.Reserved +' ' Text +'Storage' Name +' ' Text +'IMPORT' Keyword.Reserved +' ' Text +'ALLOCATE' Name +',' Punctuation +' ' Text +'DEALLOCATE' Name +';' Punctuation +'\n\n\n' Text + +'(* ---------------------------------------------------------------------------\n// Private type : ListEntry\n// ---------------------------------------------------------------------------\n*)' Comment.Multiline +'\n' Text + +'TYPE' Keyword.Reserved +' ' Text +'ListPtr' Name +' ' Text +'=' Operator +' ' Text +'POINTER' Keyword.Reserved +' ' Text +'TO' Keyword.Reserved +' ' Text +'ListEntry' Name +';' Punctuation +'\n\n' Text + +'TYPE' Keyword.Reserved +' ' Text +'ListEntry' Name +' ' Text +'=' Operator +' ' Text +'RECORD' Keyword.Reserved +'\n' Text + +' ' Text +'value' Name +' ' Text +':' Punctuation +' ' Text +'DataPtr' Name +';' Punctuation +'\n' Text + +' ' Text +'next' Name +' ' Text +':' Punctuation +' ' Text +'ListPtr' Name +'\n' Text + +'END' Keyword.Reserved +';' Punctuation +' ' Text +'(* ListEntry *)' Comment.Multiline +'\n\n\n' Text + +'(* ---------------------------------------------------------------------------\n// Opaque type : LIFO.Stack\n// ---------------------------------------------------------------------------\n// CAUTION: Modula-2 does not support the use of variable length array fields\n// in records. VLAs can only be implemented using pointer arithmetic which\n// means there is no type checking and no boundary checking on the array.\n// It also means that array notation cannot be used on the array which makes\n// the code difficult to read and maintain. As a result, Modula-2 is less\n// safe and less readable than C when it comes to using VLAs. Great care must\n// be taken to make sure that the code accessing VLA fields is safe. Boundary\n// checks must be inserted manually. Size checks must be inserted manually to\n// compensate for the absence of type checks. *)' Comment.Multiline +'\n\n' Text + +'TYPE' Keyword.Reserved +' ' Text +'Stack' Name +' ' Text +'=' Operator +' ' Text +'POINTER' Keyword.Reserved +' ' Text +'TO' Keyword.Reserved +' ' Text +'StackDescriptor' Name +';' Punctuation +'\n\n' Text + +'TYPE' Keyword.Reserved +' ' Text +'StackDescriptor' Name +' ' Text +'=' Operator +' ' Text +'RECORD' Keyword.Reserved +'\n' Text + +' ' Text +'overflow' Name +' ' Text +':' Punctuation +' ' Text +'ListPtr' Name +';' Punctuation +'\n' Text + +' ' Text +'entryCount' Name +' ' Text +':' Punctuation +' ' Text +'StackSize' Name +';' Punctuation +'\n' Text + +' ' Text +'arraySize' Name +' ' Text +':' Punctuation +' ' Text +'StackSize' Name +';' Punctuation +'\n' Text + +' ' Text +'array' Name +' ' Text +':' Punctuation +' ' Text +'ADDRESS' Name.Builtin.Pseudo +' ' Text +'(* ARRAY OF DataPtr *)' Comment.Multiline +'\n' Text + +'END' Keyword.Reserved +';' Punctuation +' ' Text +'(* StackDescriptor *)' Comment.Multiline +'\n\n\n' Text + +'(* ---------------------------------------------------------------------------\n// function: LIFO.new( initial_size, status )\n// ---------------------------------------------------------------------------\n//\n// Creates and returns a new LIFO stack object with an initial capacity of\n// <initialSize>. If zero is passed in for <initialSize>, then the stack\n// will be created with an initial capacity of LIFO.defaultStackSize. The\n// function fails if a value greater than LIFO.maximumStackSize is passed\n// in for <initialSize> or if memory could not be allocated.\n//\n// The initial capacity of a stack is the number of entries that can be stored\n// in the stack without enlargement.\n//\n// The status of the operation is passed back in <status>. *)' Comment.Multiline +'\n\n' Text + +'PROCEDURE' Keyword.Reserved +' ' Text +'new' Name +' ' Text +'(' Punctuation +' ' Text +'initialSize' Name +' ' Text +':' Punctuation +' ' Text +'StackSize' Name +';' Punctuation +' ' Text +'VAR' Keyword.Reserved +' ' Text +'status' Name +' ' Text +':' Punctuation +' ' Text +'Status' Name +' ' Text +')' Punctuation +' ' Text +':' Punctuation +' ' Text +'Stack' Name +';' Punctuation +'\n\n' Text + +'VAR' Keyword.Reserved +'\n' Text + +' ' Text +'newStack' Name +' ' Text +':' Punctuation +' ' Text +'Stack' Name +';' Punctuation +'\n' Text + +' \n' Text + +'BEGIN' Keyword.Reserved +'\n\n' Text + +' ' Text +'(* zero size means default *)' Comment.Multiline +'\n' Text + +' ' Text +'IF' Keyword.Reserved +' ' Text +'initialSize' Name +' ' Text +'=' Operator +' ' Text +'0' Literal.Number.Integer +' ' Text +'THEN' Keyword.Reserved +'\n' Text + +' ' Text +'initialSize' Name +' ' Text +':=' Operator +' ' Text +'defaultStackSize' Name +';' Punctuation +'\n' Text + +' ' Text +'END' Keyword.Reserved +';' Punctuation +' ' Text +'(* IF *)' Comment.Multiline +'\n' Text + +' \n ' Text +'(* bail out if initial size is too high *)' Comment.Multiline +'\n' Text + +' ' Text +'IF' Keyword.Reserved +' ' Text +'initialSize' Name +' ' Text +'>' Operator +' ' Text +'maximumStackSize' Name +' ' Text +'THEN' Keyword.Reserved +'\n' Text + +' ' Text +'status' Name +' ' Text +':=' Operator +' ' Text +'invalidSize' Name +';' Punctuation +'\n' Text + +' ' Text +'RETURN' Keyword.Reserved +' ' Text +'NIL' Name.Builtin +';' Punctuation +'\n' Text + +' ' Text +'END' Keyword.Reserved +';' Punctuation +' ' Text +'(* IF *)' Comment.Multiline +'\n' Text + +' \n ' Text +'(* allocate new stack object *)' Comment.Multiline +'\n' Text + +' ' Text +'ALLOCATE' Name +'(' Punctuation +'newStack' Name +',' Punctuation +' ' Text +'TSIZE' Name.Builtin +'(' Punctuation +'Stack' Name +')' Punctuation +' ' Text +'+' Operator +' ' Text +'TSIZE' Name.Builtin +'(' Punctuation +'DataPtr' Name +')' Punctuation +' ' Text +'*' Operator +' ' Text +'(' Punctuation +'initialSize' Name +' ' Text +'-' Operator +' ' Text +'1' Literal.Number.Integer +')' Punctuation +')' Punctuation +';' Punctuation +'\n' Text + +' \n ' Text +'(* bail out if allocation failed *)' Comment.Multiline +'\n' Text + +' ' Text +'IF' Keyword.Reserved +' ' Text +'newStack' Name +' ' Text +'=' Operator +' ' Text +'NIL' Name.Builtin +' ' Text +'THEN' Keyword.Reserved +'\n' Text + +' ' Text +'status' Name +' ' Text +':=' Operator +' ' Text +'allocationFailed' Name +';' Punctuation +'\n' Text + +' ' Text +'RETURN' Keyword.Reserved +' ' Text +'NIL' Name.Builtin +';' Punctuation +'\n' Text + +' ' Text +'END' Keyword.Reserved +';' Punctuation +' ' Text +'(* IF *)' Comment.Multiline +'\n' Text + +' \n ' Text +'(* initialise meta data *)' Comment.Multiline +'\n' Text + +' ' Text +'newStack' Name +'^' Operator +'.' Punctuation +'arraySize' Name +' ' Text +':=' Operator +' ' Text +'initialSize' Name +';' Punctuation +'\n' Text + +' ' Text +'newStack' Name +'^' Operator +'.' Punctuation +'entryCount' Name +' ' Text +':=' Operator +' ' Text +'0' Literal.Number.Integer +';' Punctuation +'\n' Text + +' ' Text +'newStack' Name +'^' Operator +'.' Punctuation +'overflow' Name +' ' Text +':=' Operator +' ' Text +'NIL' Name.Builtin +';' Punctuation +'\n' Text + +' \n ' Text +'(* pass status and new stack to caller *)' Comment.Multiline +'\n' Text + +' ' Text +'status' Name +' ' Text +':=' Operator +' ' Text +'success' Name +';' Punctuation +'\n' Text + +' ' Text +'RETURN' Keyword.Reserved +' ' Text +'newStack' Name +'\n' Text + +' \n' Text + +'END' Keyword.Reserved +' ' Text +'new' Name +';' Punctuation +'\n\n\n' Text + +'(* ---------------------------------------------------------------------------\n// function: LIFO.push( stack, value, status )\n// ---------------------------------------------------------------------------\n//\n// Adds a new entry <value> to the top of stack <stack>. The new entry is\n// added by reference, no data is copied. However, no entry is added if the\n// the stack is full, that is when the number of entries stored in the stack\n// has reached LIFO.maximumStackSize. The function fails if NIL is passed in\n// for <stack> or <value>, or if memory could not be allocated.\n//\n// New entries are allocated dynamically if the number of entries exceeds the\n// initial capacity of the stack.\n//\n// The status of the operation is passed back in <status>. *)' Comment.Multiline +'\n\n' Text + +'PROCEDURE' Keyword.Reserved +' ' Text +'push' Name +' ' Text +'(' Punctuation +' ' Text +'VAR' Keyword.Reserved +' ' Text +'stack' Name +' ' Text +':' Punctuation +' ' Text +'Stack' Name +';' Punctuation +' ' Text +'value' Name +' ' Text +':' Punctuation +' ' Text +'DataPtr' Name +';' Punctuation +' ' Text +'VAR' Keyword.Reserved +' ' Text +'status' Name +' ' Text +':' Punctuation +' ' Text +'Status' Name +' ' Text +')' Punctuation +';' Punctuation +'\n' Text + +'VAR' Keyword.Reserved +'\n' Text + +' ' Text +'newEntry' Name +' ' Text +':' Punctuation +' ' Text +'ListPtr' Name +';' Punctuation +'\n' Text + +' ' Text +'valuePtr' Name +' ' Text +':' Punctuation +' ' Text +'POINTER' Keyword.Reserved +' ' Text +'TO' Keyword.Reserved +' ' Text +'DataPtr' Name +';' Punctuation +'\n\n' Text + +'BEGIN' Keyword.Reserved +'\n\n' Text + +' ' Text +'(* bail out if stack is NIL *)' Comment.Multiline +'\n' Text + +' ' Text +'IF' Keyword.Reserved +' ' Text +'stack' Name +' ' Text +'=' Operator +' ' Text +'NIL' Name.Builtin +' ' Text +'THEN' Keyword.Reserved +'\n' Text + +' ' Text +'status' Name +' ' Text +':=' Operator +' ' Text +'invalidStack' Name +';' Punctuation +'\n' Text + +' ' Text +'RETURN' Keyword.Reserved +';' Punctuation +'\n' Text + +' ' Text +'END' Keyword.Reserved +';' Punctuation +' ' Text +'(* IF *)' Comment.Multiline +'\n' Text + +' \n ' Text +'(* bail out if value is NIL *)' Comment.Multiline +'\n' Text + +' ' Text +'IF' Keyword.Reserved +' ' Text +'value' Name +' ' Text +'=' Operator +' ' Text +'NIL' Name.Builtin +' ' Text +'THEN' Keyword.Reserved +'\n' Text + +' ' Text +'status' Name +' ' Text +':=' Operator +' ' Text +'invalidData' Name +';' Punctuation +'\n' Text + +' ' Text +'RETURN' Keyword.Reserved +';' Punctuation +'\n' Text + +' ' Text +'END' Keyword.Reserved +';' Punctuation +' ' Text +'(* IF *)' Comment.Multiline +'\n\n' Text + +' ' Text +'(* bail out if stack is full *)' Comment.Multiline +'\n' Text + +' ' Text +'IF' Keyword.Reserved +' ' Text +'stack' Name +'^' Operator +'.' Punctuation +'entryCount' Name +' ' Text +'>=' Operator +' ' Text +'maximumStackSize' Name +' ' Text +'THEN' Keyword.Reserved +'\n' Text + +' ' Text +'status' Name +' ' Text +':=' Operator +' ' Text +'stackFull' Name +';' Punctuation +'\n' Text + +' ' Text +'RETURN' Keyword.Reserved +';' Punctuation +'\n' Text + +' ' Text +'END' Keyword.Reserved +';' Punctuation +' ' Text +'(* IF *)' Comment.Multiline +'\n\n' Text + +' ' Text +'(* check if index falls within array segment *)' Comment.Multiline +'\n' Text + +' ' Text +'IF' Keyword.Reserved +' ' Text +'stack' Name +'^' Operator +'.' Punctuation +'entryCount' Name +' ' Text +'<' Operator +' ' Text +'stack' Name +'^' Operator +'.' Punctuation +'arraySize' Name +' ' Text +'THEN' Keyword.Reserved +'\n' Text + +' \n ' Text +'(* store value in array segment *)' Comment.Multiline +'\n' Text + +' \n ' Text +'(* stack^.array^[stack^.entryCount] := value; *)' Comment.Multiline +'\n' Text + +' ' Text +'valuePtr' Name +' ' Text +':=' Operator +' ' Text +'ADR' Name.Builtin.Pseudo +'(' Punctuation +'stack' Name +'^' Operator +'.' Punctuation +'array' Name +')' Punctuation +' ' Text +'+' Operator +' ' Text +'TSIZE' Name.Builtin +'(' Punctuation +'DataPtr' Name +')' Punctuation +' ' Text +'*' Operator +' ' Text +'stack' Name +'^' Operator +'.' Punctuation +'entryCount' Name +';' Punctuation +'\n' Text + +' ' Text +'valuePtr' Name +'^' Operator +' ' Text +':=' Operator +' ' Text +'value' Name +';' Punctuation +'\n' Text + +' \n ' Text +'ELSE' Keyword.Reserved +' ' Text +'(* index falls within overflow segment *)' Comment.Multiline +'\n' Text + +' \n ' Text +'(* allocate new entry slot *)' Comment.Multiline +'\n' Text + +' ' Text +'NEW' Keyword.Reserved +'(' Punctuation +'newEntry' Name +')' Punctuation +';' Punctuation +'\n' Text + +' \n ' Text +'(* bail out if allocation failed *)' Comment.Multiline +'\n' Text + +' ' Text +'IF' Keyword.Reserved +' ' Text +'newEntry' Name +' ' Text +'=' Operator +' ' Text +'NIL' Name.Builtin +' ' Text +'THEN' Keyword.Reserved +'\n' Text + +' ' Text +'status' Name +' ' Text +':=' Operator +' ' Text +'allocationFailed' Name +';' Punctuation +'\n' Text + +' ' Text +'RETURN' Keyword.Reserved +';' Punctuation +'\n' Text + +' ' Text +'END' Keyword.Reserved +';' Punctuation +' ' Text +'(* IF *)' Comment.Multiline +'\n' Text + +' \n ' Text +'(* initialise new entry *)' Comment.Multiline +'\n' Text + +' ' Text +'newEntry' Name +'^' Operator +'.' Punctuation +'value' Name +' ' Text +':=' Operator +' ' Text +'value' Name +';' Punctuation +'\n' Text + +' \n ' Text +'(* link new entry into overflow list *)' Comment.Multiline +'\n' Text + +' ' Text +'newEntry' Name +'^' Operator +'.' Punctuation +'next' Name +' ' Text +':=' Operator +' ' Text +'stack' Name +'^' Operator +'.' Punctuation +'overflow' Name +';' Punctuation +'\n' Text + +' ' Text +'stack' Name +'^' Operator +'.' Punctuation +'overflow' Name +' ' Text +':=' Operator +' ' Text +'newEntry' Name +';' Punctuation +'\n' Text + +' \n ' Text +'END' Keyword.Reserved +';' Punctuation +' ' Text +'(* IF *)' Comment.Multiline +'\n' Text + +' \n ' Text +'(* update entry counter *)' Comment.Multiline +'\n' Text + +' ' Text +'INC' Name.Builtin +'(' Punctuation +'stack' Name +'^' Operator +'.' Punctuation +'entryCount' Name +')' Punctuation +';' Punctuation +'\n' Text + +' \n ' Text +'(* pass status to caller *)' Comment.Multiline +'\n' Text + +' ' Text +'status' Name +' ' Text +':=' Operator +' ' Text +'success' Name +';' Punctuation +'\n' Text + +' ' Text +'RETURN' Keyword.Reserved +'\n\n' Text + +'END' Keyword.Reserved +' ' Text +'push' Name +';' Punctuation +'\n\n\n' Text + +'(* ---------------------------------------------------------------------------\n// function: LIFO.pop( stack, status )\n// ---------------------------------------------------------------------------\n//\n// Removes the top most value from stack <stack> and returns it. If the stack\n// is empty, that is when the number of entries stored in the stack has\n// reached zero, then NIL is returned.\n//\n// Entries which were allocated dynamically (above the initial capacity) are\n// deallocated when their values are popped.\n//\n// The status of the operation is passed back in <status>. *)' Comment.Multiline +'\n\n' Text + +'PROCEDURE' Keyword.Reserved +' ' Text +'pop' Name +' ' Text +'(' Punctuation +' ' Text +'VAR' Keyword.Reserved +' ' Text +'stack' Name +' ' Text +':' Punctuation +' ' Text +'Stack' Name +';' Punctuation +' ' Text +'VAR' Keyword.Reserved +' ' Text +'status' Name +' ' Text +':' Punctuation +' ' Text +'Status' Name +' ' Text +')' Punctuation +' ' Text +':' Punctuation +' ' Text +'DataPtr' Name +';' Punctuation +'\n\n' Text + +'VAR' Keyword.Reserved +'\n' Text + +' ' Text +'thisValue' Name +' ' Text +':' Punctuation +' ' Text +'DataPtr' Name +';' Punctuation +'\n' Text + +' ' Text +'thisEntry' Name +' ' Text +':' Punctuation +' ' Text +'ListPtr' Name +';' Punctuation +'\n' Text + +' ' Text +'valuePtr' Name +' ' Text +':' Punctuation +' ' Text +'POINTER' Keyword.Reserved +' ' Text +'TO' Keyword.Reserved +' ' Text +'DataPtr' Name +';' Punctuation +'\n\n' Text + +'BEGIN' Keyword.Reserved +'\n\n' Text + +' ' Text +'(* bail out if stack is NIL *)' Comment.Multiline +'\n' Text + +' ' Text +'IF' Keyword.Reserved +' ' Text +'stack' Name +' ' Text +'=' Operator +' ' Text +'NIL' Name.Builtin +' ' Text +'THEN' Keyword.Reserved +'\n' Text + +' ' Text +'status' Name +' ' Text +':=' Operator +' ' Text +'invalidStack' Name +';' Punctuation +'\n' Text + +' ' Text +'RETURN' Keyword.Reserved +' ' Text +'NIL' Name.Builtin +';' Punctuation +'\n' Text + +' ' Text +'END' Keyword.Reserved +';' Punctuation +' ' Text +'(* IF *)' Comment.Multiline +'\n' Text + +' \n ' Text +'(* bail out if stack is empty *)' Comment.Multiline +'\n' Text + +' ' Text +'IF' Keyword.Reserved +' ' Text +'stack' Name +'^' Operator +'.' Punctuation +'entryCount' Name +' ' Text +'=' Operator +' ' Text +'0' Literal.Number.Integer +' ' Text +'THEN' Keyword.Reserved +'\n' Text + +' ' Text +'status' Name +' ' Text +':=' Operator +' ' Text +'stackEmpty' Name +';' Punctuation +'\n' Text + +' ' Text +'RETURN' Keyword.Reserved +' ' Text +'NIL' Name.Builtin +';' Punctuation +'\n' Text + +' ' Text +'END' Keyword.Reserved +';' Punctuation +' ' Text +'(* IF *)' Comment.Multiline +'\n\n' Text + +' ' Text +'DEC' Name.Builtin +'(' Punctuation +'stack' Name +'^' Operator +'.' Punctuation +'entryCount' Name +')' Punctuation +';' Punctuation +'\n' Text + +' \n ' Text +'(* check if index falls within array segment *)' Comment.Multiline +'\n' Text + +' ' Text +'IF' Keyword.Reserved +' ' Text +'stack' Name +'^' Operator +'.' Punctuation +'entryCount' Name +' ' Text +'<' Operator +' ' Text +'stack' Name +'^' Operator +'.' Punctuation +'arraySize' Name +' ' Text +'THEN' Keyword.Reserved +'\n' Text + +' \n ' Text +'(* obtain value at index entryCount in array segment *)' Comment.Multiline +'\n' Text + +' \n ' Text +'(* thisValue := stack^.array^[stack^.entryCount]; *)' Comment.Multiline +'\n' Text + +' ' Text +'valuePtr' Name +' ' Text +':=' Operator +' ' Text +'ADR' Name.Builtin.Pseudo +'(' Punctuation +'stack' Name +'^' Operator +'.' Punctuation +'array' Name +')' Punctuation +' ' Text +'+' Operator +' ' Text +'TSIZE' Name.Builtin +'(' Punctuation +'DataPtr' Name +')' Punctuation +' ' Text +'*' Operator +' ' Text +'stack' Name +'^' Operator +'.' Punctuation +'entryCount' Name +';' Punctuation +'\n' Text + +' ' Text +'thisValue' Name +' ' Text +':=' Operator +' ' Text +'valuePtr' Name +'^' Operator +';' Punctuation +'\n' Text + +' \n ' Text +'ELSE' Keyword.Reserved +' ' Text +'(* index falls within overflow segment *)' Comment.Multiline +'\n' Text + +' \n ' Text +'(* obtain value of first entry in overflow list *)' Comment.Multiline +'\n' Text + +' ' Text +'thisValue' Name +' ' Text +':=' Operator +' ' Text +'stack' Name +'^' Operator +'.' Punctuation +'overflow' Name +'^' Operator +'.' Punctuation +'value' Name +';' Punctuation +'\n' Text + +' \n ' Text +'(* isolate first entry in overflow list *)' Comment.Multiline +'\n' Text + +' ' Text +'thisEntry' Name +' ' Text +':=' Operator +' ' Text +'stack' Name +'^' Operator +'.' Punctuation +'overflow' Name +';' Punctuation +'\n' Text + +' ' Text +'stack' Name +'^' Operator +'.' Punctuation +'overflow' Name +' ' Text +':=' Operator +' ' Text +'stack' Name +'^' Operator +'.' Punctuation +'overflow' Name +'^' Operator +'.' Punctuation +'next' Name +';' Punctuation +'\n' Text + +' \n ' Text +'(* remove the entry from overflow list *)' Comment.Multiline +'\n' Text + +' ' Text +'DISPOSE' Name.Builtin +'(' Punctuation +'thisEntry' Name +')' Punctuation +';' Punctuation +'\n' Text + +' \n ' Text +'END' Keyword.Reserved +';' Punctuation +' ' Text +'(* IF *)' Comment.Multiline +'\n\n' Text + +' ' Text +'(* return value and status to caller *)' Comment.Multiline +'\n' Text + +' ' Text +'status' Name +' ' Text +':=' Operator +' ' Text +'success' Name +';' Punctuation +'\n' Text + +' ' Text +'RETURN' Keyword.Reserved +' ' Text +'thisValue' Name +'\n\n' Text + +'END' Keyword.Reserved +' ' Text +'pop' Name +';' Punctuation +'\n\n\n' Text + +'(* ---------------------------------------------------------------------------\n// function: LIFO.stackSize( stack )\n// ---------------------------------------------------------------------------\n//\n// Returns the current capacity of <stack>. The current capacity is the total\n// number of allocated entries. Returns zero if NIL is passed in for <stack>.\n*)' Comment.Multiline +'\n' Text + +'PROCEDURE' Keyword.Reserved +' ' Text +'stackSize' Name +'(' Punctuation +' ' Text +'VAR' Keyword.Reserved +' ' Text +'stack' Name +' ' Text +':' Punctuation +' ' Text +'Stack' Name +' ' Text +')' Punctuation +' ' Text +':' Punctuation +' ' Text +'StackSize' Name +';' Punctuation +'\n\n' Text + +'BEGIN' Keyword.Reserved +'\n\n' Text + +' ' Text +'(* bail out if stack is NIL *)' Comment.Multiline +'\n' Text + +' ' Text +'IF' Keyword.Reserved +' ' Text +'stack' Name +' ' Text +'=' Operator +' ' Text +'NIL' Name.Builtin +' ' Text +'THEN' Keyword.Reserved +'\n' Text + +' ' Text +'RETURN' Keyword.Reserved +' ' Text +'0' Literal.Number.Integer +';' Punctuation +'\n' Text + +' ' Text +'END' Keyword.Reserved +';' Punctuation +' ' Text +'(* IF *)' Comment.Multiline +'\n\n' Text + +' ' Text +'IF' Keyword.Reserved +' ' Text +'stack' Name +'^' Operator +'.' Punctuation +'entryCount' Name +' ' Text +'<' Operator +' ' Text +'stack' Name +'^' Operator +'.' Punctuation +'arraySize' Name +' ' Text +'THEN' Keyword.Reserved +'\n' Text + +' ' Text +'RETURN' Keyword.Reserved +' ' Text +'stack' Name +'^' Operator +'.' Punctuation +'arraySize' Name +';' Punctuation +'\n' Text + +' ' Text +'ELSE' Keyword.Reserved +'\n' Text + +' ' Text +'RETURN' Keyword.Reserved +' ' Text +'stack' Name +'^' Operator +'.' Punctuation +'entryCount' Name +';' Punctuation +'\n' Text + +' ' Text +'END' Keyword.Reserved +';' Punctuation +' ' Text +'(* IF *)' Comment.Multiline +'\n' Text + +' \n' Text + +'END' Keyword.Reserved +' ' Text +'stackSize' Name +';' Punctuation +'\n\n\n' Text + +'(* ---------------------------------------------------------------------------\n// function: LIFO.stackEntries( stack )\n// ---------------------------------------------------------------------------\n//\n// Returns the number of entries stored in stack <stack>, returns zero if\n// NIL is passed in for <stack>. *)' Comment.Multiline +'\n\n' Text + +'PROCEDURE' Keyword.Reserved +' ' Text +'stackEntries' Name +'(' Punctuation +' ' Text +'VAR' Keyword.Reserved +' ' Text +'stack' Name +' ' Text +':' Punctuation +' ' Text +'Stack' Name +' ' Text +')' Punctuation +' ' Text +':' Punctuation +' ' Text +'StackSize' Name +';' Punctuation +'\n\n' Text + +'BEGIN' Keyword.Reserved +'\n\n' Text + +' ' Text +'(* bail out if stack is NIL *)' Comment.Multiline +'\n' Text + +' ' Text +'IF' Keyword.Reserved +' ' Text +'stack' Name +' ' Text +'=' Operator +' ' Text +'NIL' Name.Builtin +' ' Text +'THEN' Keyword.Reserved +'\n' Text + +' ' Text +'RETURN' Keyword.Reserved +' ' Text +'0' Literal.Number.Integer +';' Punctuation +'\n' Text + +' ' Text +'END' Keyword.Reserved +';' Punctuation +' ' Text +'(* IF *)' Comment.Multiline +'\n\n' Text + +' ' Text +'RETURN' Keyword.Reserved +' ' Text +'stack' Name +'^' Operator +'.' Punctuation +'entryCount' Name +'\n' Text + +' \n' Text + +'END' Keyword.Reserved +' ' Text +'stackEntries' Name +';' Punctuation +'\n\n\n' Text + +'(* ---------------------------------------------------------------------------\n// function: LIFO.dispose( stack )\n// ---------------------------------------------------------------------------\n//\n// Disposes of LIFO stack object <stack>. Returns NIL. *)' Comment.Multiline +'\n\n' Text + +'PROCEDURE' Keyword.Reserved +' ' Text +'dispose' Name +' ' Text +'(' Punctuation +' ' Text +'VAR' Keyword.Reserved +' ' Text +'stack' Name +' ' Text +':' Punctuation +' ' Text +'Stack' Name +' ' Text +')' Punctuation +' ' Text +':' Punctuation +' ' Text +'Stack' Name +';' Punctuation +'\n\n' Text + +'VAR' Keyword.Reserved +'\n' Text + +' ' Text +'thisEntry' Name +' ' Text +':' Punctuation +' ' Text +'ListPtr' Name +';' Punctuation +'\n\n' Text + +'BEGIN' Keyword.Reserved +'\n\n' Text + +' ' Text +'(* bail out if stack is NIL *)' Comment.Multiline +'\n' Text + +' ' Text +'IF' Keyword.Reserved +' ' Text +'stack' Name +' ' Text +'=' Operator +' ' Text +'NIL' Name.Builtin +' ' Text +'THEN' Keyword.Reserved +'\n' Text + +' ' Text +'RETURN' Keyword.Reserved +' ' Text +'NIL' Name.Builtin +';' Punctuation +'\n' Text + +' ' Text +'END' Keyword.Reserved +';' Punctuation +' ' Text +'(* IF *)' Comment.Multiline +'\n' Text + +' \n ' Text +"(* deallocate any entries in stack's overflow list *)" Comment.Multiline +'\n' Text + +' ' Text +'WHILE' Keyword.Reserved +' ' Text +'stack' Name +'^' Operator +'.' Punctuation +'overflow' Name +' ' Text +'#' Operator +' ' Text +'NIL' Name.Builtin +' ' Text +'DO' Keyword.Reserved +'\n' Text + +' \n ' Text +'(* isolate first entry in overflow list *)' Comment.Multiline +'\n' Text + +' ' Text +'thisEntry' Name +' ' Text +':=' Operator +' ' Text +'stack' Name +'^' Operator +'.' Punctuation +'overflow' Name +';' Punctuation +'\n' Text + +' ' Text +'stack' Name +'^' Operator +'.' Punctuation +'overflow' Name +' ' Text +':=' Operator +' ' Text +'stack' Name +'^' Operator +'.' Punctuation +'overflow' Name +'^' Operator +'.' Punctuation +'next' Name +';' Punctuation +'\n' Text + +' \n ' Text +'(* deallocate the entry *)' Comment.Multiline +'\n' Text + +' ' Text +'DISPOSE' Name.Builtin +'(' Punctuation +'thisEntry' Name +')' Punctuation +';' Punctuation +'\n' Text + +' \n ' Text +'END' Keyword.Reserved +';' Punctuation +' ' Text +'(* WHILE *)' Comment.Multiline +'\n' Text + +' \n ' Text +'(* deallocate stack object and pass NIL to caller *)' Comment.Multiline +'\n' Text + +' ' Text +'DEALLOCATE' Name +'(' Punctuation +'stack' Name +',' Punctuation +' ' Text +'TSIZE' Name.Builtin +'(' Punctuation +'Stack' Name +')' Punctuation +' ' Text +'+' Operator +' ' Text +'TSIZE' Name.Builtin +'(' Punctuation +'DataPtr' Name +')' Punctuation +' ' Text +'*' Operator +' ' Text +'(' Punctuation +'stack' Name +'^' Operator +'.' Punctuation +'arraySize' Name +' ' Text +'-' Operator +' ' Text +'1' Literal.Number.Integer +')' Punctuation +')' Punctuation +';' Punctuation +'\n' Text + +' ' Text +'RETURN' Keyword.Reserved +' ' Text +'NIL' Name.Builtin +'\n\n' Text + +'END' Keyword.Reserved +' ' Text +'dispose' Name +';' Punctuation +'\n\n\n' Text + +'END' Keyword.Reserved +' ' Text +'LIFO' Name +'.' Punctuation +'\n' Text |
