forked from KolibriOS/kolibrios
Added new port TinyBasic
(An improved version in conjunction with ktcc can generate executable files.) git-svn-id: svn://kolibrios.org@8733 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
233
programs/develop/tinybasic-1.0.4/inc/statement.h
Normal file
233
programs/develop/tinybasic-1.0.4/inc/statement.h
Normal file
@@ -0,0 +1,233 @@
|
||||
/*
|
||||
* Tiny BASIC
|
||||
* Statement Handling Header
|
||||
*
|
||||
* Released as Public Domain by Damian Gareth Walker 2019
|
||||
* Created: 15-Aug-2019
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __STATEMENT_H__
|
||||
#define __STATEMENT_H__
|
||||
|
||||
|
||||
/* Pre-requisite headers */
|
||||
#include "expression.h"
|
||||
|
||||
/* Forward Declarations */
|
||||
typedef struct program_line_node ProgramLineNode;
|
||||
typedef struct statement_node StatementNode;
|
||||
typedef struct output_node OutputNode;
|
||||
typedef struct variable_list_node VariableListNode;
|
||||
|
||||
|
||||
/*
|
||||
* Data Definitions
|
||||
*/
|
||||
|
||||
|
||||
/* The types of output allowed in a PRINT statement */
|
||||
typedef enum {
|
||||
OUTPUT_STRING, /* a literal string */
|
||||
OUTPUT_EXPRESSION /* an expression */
|
||||
} OutputClass;
|
||||
|
||||
/* The relational operators */
|
||||
typedef enum {
|
||||
RELOP_EQUAL, /* = */
|
||||
RELOP_UNEQUAL, /* <> or >< */
|
||||
RELOP_LESSTHAN, /* < */
|
||||
RELOP_LESSOREQUAL, /* <= */
|
||||
RELOP_GREATERTHAN, /* > */
|
||||
RELOP_GREATEROREQUAL /* >= */
|
||||
} RelationalOperator;
|
||||
|
||||
/* Expressions or strings to output */
|
||||
typedef struct output_node {
|
||||
OutputClass class; /* string or expression */
|
||||
union {
|
||||
char *string; /* a literal string to output */
|
||||
ExpressionNode *expression; /* an expression to output */
|
||||
} output;
|
||||
OutputNode *next; /* the next output node, if any */
|
||||
} OutputNode;
|
||||
|
||||
/* List of variables to input */
|
||||
typedef struct variable_list_node {
|
||||
int variable; /* the variable */
|
||||
VariableListNode *next; /* next variable, if any */
|
||||
} VariableListNode;
|
||||
|
||||
/*
|
||||
* Structures for statements in general
|
||||
*/
|
||||
|
||||
/* Let Statement Node */
|
||||
typedef struct {
|
||||
int variable; /* the variable to assign, 1..26 for A..Z */
|
||||
ExpressionNode *expression; /* the expression to assign to it */
|
||||
} LetStatementNode;
|
||||
|
||||
/* If Statement Node */
|
||||
typedef struct {
|
||||
ExpressionNode *left; /* the left-hand expression */
|
||||
RelationalOperator op; /* the comparison operator used */
|
||||
ExpressionNode *right; /* the right-hand expression */
|
||||
StatementNode *statement; /* statement to execute if condition is true */
|
||||
} IfStatementNode;
|
||||
|
||||
/* Print Statement Node */
|
||||
typedef struct {
|
||||
OutputNode *first; /* the first expression to print */
|
||||
} PrintStatementNode;
|
||||
|
||||
/* Input Statement Node */
|
||||
typedef struct {
|
||||
VariableListNode *first; /* the first variable to input */
|
||||
} InputStatementNode;
|
||||
|
||||
/* Goto Statement Node */
|
||||
typedef struct {
|
||||
ExpressionNode *label; /* an expression that computes the label */
|
||||
} GotoStatementNode;
|
||||
|
||||
/* Gosub Statement Node */
|
||||
typedef struct {
|
||||
ExpressionNode *label; /* an expression that computes the label */
|
||||
} GosubStatementNode;
|
||||
|
||||
/* Statement classes */
|
||||
typedef enum {
|
||||
STATEMENT_NONE, /* unknown statement */
|
||||
STATEMENT_LET, /* LET variable=expression */
|
||||
STATEMENT_IF, /* IF condition THEN statement */
|
||||
STATEMENT_GOTO, /* GOTO expression */
|
||||
STATEMENT_GOSUB, /* GOSUB expression */
|
||||
STATEMENT_RETURN, /* RETURN */
|
||||
STATEMENT_END, /* END */
|
||||
STATEMENT_PRINT, /* PRINT print-list */
|
||||
STATEMENT_INPUT /* INPUT var-list */
|
||||
} StatementClass;
|
||||
|
||||
/* Common Statement Node */
|
||||
typedef struct statement_node {
|
||||
StatementClass class; /* which type of statement this is */
|
||||
union {
|
||||
LetStatementNode *letn; /* a LET statement */
|
||||
IfStatementNode *ifn; /* an IF statement */
|
||||
GotoStatementNode *goton; /* a GOTO statement */
|
||||
GosubStatementNode *gosubn; /* a GOSUB statement */
|
||||
/* a RETURN statement requires no extra data */
|
||||
/* an END statement requires no extra data */
|
||||
PrintStatementNode *printn; /* a PRINT statement */
|
||||
InputStatementNode *inputn; /* an INPUT statement */
|
||||
} statement;
|
||||
} StatementNode;
|
||||
|
||||
/* a program line */
|
||||
typedef struct program_line_node {
|
||||
int label; /* line label */
|
||||
StatementNode *statement; /* the current statement */
|
||||
ProgramLineNode *next; /* the next statement */
|
||||
} ProgramLineNode;
|
||||
|
||||
|
||||
/* the program */
|
||||
typedef struct {
|
||||
ProgramLineNode *first; /* first program statement */
|
||||
} ProgramNode;
|
||||
|
||||
|
||||
/*
|
||||
* Function Declarations
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* LET statement constructor
|
||||
* returns:
|
||||
* LetStatementNode* the created LET statement
|
||||
*/
|
||||
LetStatementNode *statement_create_let (void);
|
||||
|
||||
/*
|
||||
* IF statement constructor
|
||||
* returns:
|
||||
* IfStatementNode* the created IF statement
|
||||
*/
|
||||
IfStatementNode *statement_create_if (void);
|
||||
|
||||
/*
|
||||
* GOTO Statement Constructor
|
||||
* returns:
|
||||
* GotoStatementNode* the new GOTO statement
|
||||
*/
|
||||
GotoStatementNode *statement_create_goto (void);
|
||||
|
||||
/*
|
||||
* GOSUB Statement Constructor
|
||||
* returns:
|
||||
* GosubStatementNode* the new GOSUB statement
|
||||
*/
|
||||
GosubStatementNode *statement_create_gosub (void);
|
||||
|
||||
/*
|
||||
* PRINT statement constructor
|
||||
* returns:
|
||||
* PrintStatementNode* the created PRINT statement
|
||||
*/
|
||||
PrintStatementNode *statement_create_print (void);
|
||||
|
||||
/*
|
||||
* INPUT statement constructor
|
||||
* returns:
|
||||
* InputStatementNode* initialised INPUT statement data
|
||||
*/
|
||||
InputStatementNode *statement_create_input (void);
|
||||
|
||||
/*
|
||||
* Statement constructor
|
||||
* returns:
|
||||
* StatementNode* the newly-created blank statement
|
||||
*/
|
||||
StatementNode *statement_create (void);
|
||||
|
||||
/*
|
||||
* Statement destructor
|
||||
* params:
|
||||
* StatementNode* statement the doomed statement
|
||||
*/
|
||||
void statement_destroy (StatementNode *statement);
|
||||
|
||||
/*
|
||||
* Program Line Constructor
|
||||
* returns:
|
||||
* ProgramLineNode* the new program line
|
||||
*/
|
||||
ProgramLineNode *program_line_create (void);
|
||||
|
||||
/*
|
||||
* Program Line Destructor
|
||||
* params:
|
||||
* ProgramLineNode* program_line the doomed program line
|
||||
* params:
|
||||
* ProgramLineNode* the next program line
|
||||
*/
|
||||
ProgramLineNode *program_line_destroy (ProgramLineNode *program_line);
|
||||
|
||||
/*
|
||||
* Program Constructor
|
||||
* returns:
|
||||
* ProgramNode* the constructed program
|
||||
*/
|
||||
ProgramNode *program_create (void);
|
||||
|
||||
/*
|
||||
* Program Destructor
|
||||
* params:
|
||||
* ProgramNode* program the doomed program
|
||||
*/
|
||||
void program_destroy (ProgramNode *program);
|
||||
|
||||
|
||||
#endif
|
Reference in New Issue
Block a user