Merge branch 'main' of gitlab.cs.wallawalla.edu:lustje/language-interpreter-lab

This commit is contained in:
Jenessy Lustre 2024-10-24 11:41:55 -07:00
commit a9ff9cbebc
6 changed files with 144 additions and 22 deletions

View File

@ -1,6 +1,5 @@
typedef enum { typedef enum {
TOKEN_EOF = 0, TOKEN_EOF = 0,
// Identification Keywords
TOKEN_IDENTIFICATION, TOKEN_IDENTIFICATION,
TOKEN_KEYWORD_DIVISION, TOKEN_KEYWORD_DIVISION,
TOKEN_KEYWORD_DATA, TOKEN_KEYWORD_DATA,
@ -8,8 +7,6 @@ typedef enum {
TOKEN_PROGRAM_ID, TOKEN_PROGRAM_ID,
TOKEN_WORKING_STORAGE, TOKEN_WORKING_STORAGE,
TOKEN_PROCEDURE, TOKEN_PROCEDURE,
// Program Keywords
TOKEN_DISPLAY, TOKEN_DISPLAY,
TOKEN_STOP, TOKEN_STOP,
TOKEN_RUN, TOKEN_RUN,
@ -28,11 +25,7 @@ typedef enum {
TOKEN_KEYWORD_VALUE, TOKEN_KEYWORD_VALUE,
TOKEN_KEYWORD_COMPUTE, TOKEN_KEYWORD_COMPUTE,
TOKEN_KEYWORD_FUNCTION, TOKEN_KEYWORD_FUNCTION,
// Identifiers
TOKEN_IDENT, TOKEN_IDENT,
// Data types
TOKEN_STRING, TOKEN_STRING,
TOKEN_INTEGER, TOKEN_INTEGER,
TOKEN_PICTURE, TOKEN_PICTURE,
@ -40,19 +33,14 @@ typedef enum {
TOKEN_NUMERIC, TOKEN_NUMERIC,
TOKEN_SIGNED_NUMERIC, TOKEN_SIGNED_NUMERIC,
TOKEN_IMPLIED_DECIMAL, TOKEN_IMPLIED_DECIMAL,
// https://ibmmainframes.com/about393.html
TOKEN_COMPUTATION_LEVEL_0, TOKEN_COMPUTATION_LEVEL_0,
TOKEN_COMPUTATION_LEVEL_1, TOKEN_COMPUTATION_LEVEL_1,
TOKEN_COMPUTATION_LEVEL_2, TOKEN_COMPUTATION_LEVEL_2,
TOKEN_COMPUTATION_LEVEL_3, TOKEN_COMPUTATION_LEVEL_3,
// Grammar
TOKEN_LEFT_PARENTHESIS, TOKEN_LEFT_PARENTHESIS,
TOKEN_RIGHT_PARENTHESIS, TOKEN_RIGHT_PARENTHESIS,
TOKEN_DOT, TOKEN_DOT,
TOKEN_COMMENT, TOKEN_COMMENT,
// Operators
TOKEN_ADD, TOKEN_ADD,
TOKEN_SUB, TOKEN_SUB,
TOKEN_MULTIPLY, TOKEN_MULTIPLY,

View File

@ -9,15 +9,55 @@ int yylex();
%debug %debug
%define parse.error detailed %define parse.error detailed
%token TOKEN_INT %token TOKEN_EOF
%token TOKEN_PLUS %token TOKEN_IDENTIFICATION
%token TOKEN_MINUS %token TOKEN_KEYWORD_DIVISION
%token TOKEN_MUL %token TOKEN_KEYWORD_DATA
%token TOKEN_DIV %token TOKEN_KEYWORD_SECTION
%token TOKEN_LPAREN %token TOKEN_PROGRAM_ID
%token TOKEN_RPAREN %token TOKEN_WORKING_STORAGE
%token TOKEN_SEMI %token TOKEN_PROCEDURE
%token TOKEN_ERROR %token TOKEN_STOP
%token TOKEN_RUN
%token TOKEN_MOVE
%token TOKEN_KEYWORD_TO
%token TOKEN_PERFORM
%token TOKEN_VARYING
%token TOKEN_KEYWORD_FROM
%token TOKEN_KEYWORD_BY
%token TOKEN_UNTIL
%token TOKEN_END_PERFORM
%token TOKEN_IF
%token TOKEN_END_IF
%token TOKEN_SPACE
%token TOKEN_KEYWORD_OCCURS
%token TOKEN_KEYWORD_VALUE
%token TOKEN_KEYWORD_COMPUTE
%token TOKEN_KEYWORD_FUNCTION
%token TOKEN_IDENT
%token TOKEN_STRING
%token TOKEN_INTEGER
%token TOKEN_PICTURE
%token TOKEN_ALPHANUMERIC
%token TOKEN_NUMERIC
%token TOKEN_SIGNED_NUMERIC
%token TOKEN_IMPLIED_DECIMAL
%token TOKEN_COMPUTATION_LEVEL_0
%token TOKEN_COMPUTATION_LEVEL_1
%token TOKEN_COMPUTATION_LEVEL_2
%token TOKEN_COMPUTATION_LEVEL_3
%token TOKEN_LEFT_PARENTHESIS
%token TOKEN_RIGHT_PARENTHESIS
%token TOKEN_DOT
%token TOKEN_COMMENT
%token TOKEN_ADD
%token TOKEN_SUB
%token TOKEN_MULTIPLY
%token TOKEN_DIVIDE
%token TOKEN_EQUAL
%token TOKEN_GREATER_THAN
%token TOKEN_LESS_THAN
%token TOKEN_EXPONENTIAL
%% %%
program : expr TOKEN_SEMI; program : expr TOKEN_SEMI;

View File

@ -0,0 +1,5 @@
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO-WORLD.
PROCEDURE DIVISION.
DISPLAY 'Hello World!'
STOP RUN.

View File

@ -1 +0,0 @@
2020+4;

View File

@ -0,0 +1,35 @@
*> Code altered from https://www.quora.com/What-is-a-COBOL-program-that-will-solve-a-quadratic-equation
*> Program finds the roots to a simple quadratic equation
IDENTIFICATION DIVISION.
PROGRAM-ID. QuadraticSolver.
DATA DIVISION.
WORKING-STORAGE SECTION.
77 a PIC S9(5)V9(5) COMP-3 VALUE 1.
77 b PIC S9(5)V9(5) COMP-3 VALUE 5.
77 c PIC S9(5)V9(5) COMP-3 VALUE 6.
77 discriminant PIC S9(5)V9(5) COMP-3.
77 root1 PIC S9(5)V9(5) COMP-3.
77 root2 PIC S9(5)V9(5) COMP-3.
77 square-root-discriminant PIC S9(5)V9(5) COMP-3.
PROCEDURE DIVISION. *> program begins here
DISPLAY "EQUATION: (1x^2) + 5x + 6 = 0"
COMPUTE discriminant = (b ** 2) - (4 * a * c)
IF discriminant > 0
COMPUTE square-root-discriminant = FUNCTION SQRT(discriminant)
COMPUTE root1 = (-b + square-root-discriminant) / (2 * a)
COMPUTE root2 = (-b - square-root-discriminant) / (2 * a)
DISPLAY "The equation has two distinct real roots: "
DISPLAY "Root 1: " root1
DISPLAY "Root 2: " root2
ELSE IF discriminant = 0
COMPUTE root1 = -b / (2 * a)
DISPLAY "The equation has one real root: "
DISPLAY "Root: " root1
ELSE
DISPLAY "The equation has no real roots."
STOP RUN.

View File

@ -0,0 +1,55 @@
IDENTIFICATION DIVISION.
PROGRAM-ID. sorting.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-SORT-AREA.
05 WS-SORT-TABLE.
10 WS-SORT-ROW PIC X(10) OCCURS 100.
05 WS-TEMP-ROW PIC X(10).
05 WS-ROW-MAX PIC S9(4) COMP VALUE 100.
05 WS-SORT-MAX PIC S9(4) COMP.
05 WS-I PIC S9(4) COMP.
05 WS-J PIC S9(4) COMP.
05 WS-INDEX PIC S9(4) COMP.
PROCEDURE DIVISION.
*> Initialize test data
MOVE "30" TO WS-SORT-ROW(1)
MOVE "10" TO WS-SORT-ROW(2)
MOVE "50" TO WS-SORT-ROW(3)
MOVE "20" TO WS-SORT-ROW(4)
MOVE "40" TO WS-SORT-ROW(5)
MOVE 5 TO WS-SORT-MAX
*> * Display original array
DISPLAY "Original Array Contents:"
DISPLAY "---------------------"
PERFORM VARYING WS-INDEX FROM 1 BY 1
UNTIL WS-INDEX > WS-SORT-MAX
DISPLAY "Element " WS-INDEX ": " WS-SORT-ROW(WS-INDEX)
END-PERFORM
DISPLAY SPACE
*> * Simplified bubble sort
PERFORM VARYING WS-I FROM 1 BY 1
UNTIL WS-I > WS-SORT-MAX - 1
PERFORM VARYING WS-J FROM 1 BY 1
UNTIL WS-J > WS-SORT-MAX - WS-I
IF WS-SORT-ROW(WS-J) > WS-SORT-ROW(WS-J + 1)
MOVE WS-SORT-ROW(WS-J) TO WS-TEMP-ROW
MOVE WS-SORT-ROW(WS-J + 1) TO WS-SORT-ROW(WS-J)
MOVE WS-TEMP-ROW TO WS-SORT-ROW(WS-J + 1)
END-IF
END-PERFORM
END-PERFORM
*> * Display sorted array
DISPLAY "Sorted Array Contents:"
DISPLAY "--------------------"
PERFORM VARYING WS-INDEX FROM 1 BY 1
UNTIL WS-INDEX > WS-SORT-MAX
DISPLAY "Element " WS-INDEX ": " WS-SORT-ROW(WS-INDEX)
END-PERFORM.
STOP RUN.