summaryrefslogtreecommitdiff
path: root/src/parser.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/parser.h')
-rw-r--r--src/parser.h79
1 files changed, 79 insertions, 0 deletions
diff --git a/src/parser.h b/src/parser.h
new file mode 100644
index 0000000..3efaa03
--- /dev/null
+++ b/src/parser.h
@@ -0,0 +1,79 @@
+#ifndef PARSER_H
+#define PARSER_H
+
+#include <lexer.h>
+
+#include "mp-equation.h"
+#include "mp.h"
+
+/* Operator Associativity. */
+typedef enum
+{
+ LEFT_ASSOCIATIVE,
+ RIGHT_ASSOCIATIVE
+} Associativity;
+
+/* Operator Precedence. */
+typedef enum
+{
+ P_Unknown = 0,
+ P_AddSubtract=1,
+ P_Multiply=2,
+ P_Mod=3,
+ P_Divide=4,
+ P_Not=5,
+ P_Root=6,
+ P_Function=7,
+ P_Boolean=8,
+ P_Percentage=9,
+ /* UnaryMinus and Power must have same precedence. */
+ P_UnaryMinus=10,
+ P_Power=10,
+ P_Factorial=11,
+ P_NumberVariable=12,
+ /* P_Depth should be always at the bottom. It stops node jumping off the current depth level. */
+ P_Depth
+} Precedence;
+
+/* ParseNode structure for parse tree. */
+typedef struct parse_node
+{
+ struct parse_node *parent;
+ struct parse_node *left, *right;
+ LexerToken *token;
+ guint precedence;
+ Associativity associativity;
+ void* value;
+ struct parser_state* state;
+ void* (*evaluate) (struct parse_node* self);
+} ParseNode;
+
+/* ParserState structure. Stores parser state. */
+typedef struct parser_state
+{
+ ParseNode *root;
+ ParseNode *right_most;
+ LexerState *lexer;
+ guint depth_level;
+ MPEquationOptions *options;
+ int error;
+ char *error_token;
+ MPNumber ret;
+ int (*variable_is_defined)(struct parser_state *state, const char *name);
+ int (*get_variable)(struct parser_state *state, const char *name, MPNumber *z);
+ void (*set_variable)(struct parser_state *state, const char *name, const MPNumber *x);
+ int (*function_is_defined)(struct parser_state *state, const char *name);
+ int (*get_function)(struct parser_state *state, const char *name, const MPNumber *x, MPNumber *z);
+ int (*convert)(struct parser_state *state, const MPNumber *x, const char *x_units, const char *z_units, MPNumber *z);
+} ParserState;
+
+/* Create ParserState object. */
+ParserState* p_create_parser(const gchar*, MPEquationOptions*);
+
+/* Destroy ParserState object. */
+void p_destroy_parser(ParserState*);
+
+/* Parse string from ParserState. */
+guint p_parse(ParserState*);
+
+#endif /* PARSER_H */