/*
* This file is part of Unicorn Sparkle Basic and is released under
* CC0 1.0 Universal License. See LICENSE.txt file or
* https://creativecommons.org/publicdomain/zero/1.0/ for full license
* text.
*/
#include "usbasic.tab.h"
#include <stdio.h>
#include <stdlib.h>
#include <readline/history.h>
#include <readline/readline.h>
enum NODE_TYPE {
NODE_COMMAND_RUN,
NODE_NUMBERED_LINE,
NODE_PRINT,
NODE_IF,
NODE_ADD,
NODE_SUBTRACT,
NODE_MULTIPLY,
NODE_DIVIDE,
NODE_LT,
NODE_LTE,
NODE_GT,
NODE_GTE,
NODE_EQ,
NODE_NUMBER,
NODE_STRING,
NODE_ID
};
struct node_line_data {
double linum;
struct node_tag *stmt;
};
struct node_command_data {
/* arguments, if any */
};
struct node_string_data {
char *str;
};
struct node_print_data {
struct node_tag *expr;
};
struct node_iff_data {
struct node_tag *pred;
struct node_tag *stmt;
};
struct node_id_data {
char *name;
};
struct node_number_data {
double val;
};
struct node_tag {
enum NODE_TYPE type;
union {
struct node_line_data line;
struct node_command_data command;
struct node_string_data string;
struct node_print_data print;
struct node_iff_data iff;
struct node_id_data id;
struct node_number_data number;
} data;
};
struct node_tag *ast_make_string(char *s);
struct node_tag *ast_make_numbered_line(double linum, struct node_tag *stmt);
struct node_tag *ast_make_command_run();
struct node_tag *ast_make_print(struct node_tag *expr);
struct node_tag *ast_make_if(struct node_tag *pred, struct node_tag *stmt);
struct node_tag *ast_make_id(char *name);
struct node_tag *ast_make_number(double val);
extern int yyparse();
extern void yy_scan_string(char *);
extern void yylex_destroy();
struct node_tag *read_line(char *line);
struct node_tag *read_line_stdin(char *prompt);