git » unicorn-sparkle-basic.git » master » tree

[master] / parse.h

/*
 * 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);