]> git.ozlabs.org Git - ccan/blobdiff - ccan/graphql/graphql.h
GraphQL lexer and parser (without optional type system)
[ccan] / ccan / graphql / graphql.h
diff --git a/ccan/graphql/graphql.h b/ccan/graphql/graphql.h
new file mode 100644 (file)
index 0000000..94f7fa4
--- /dev/null
@@ -0,0 +1,229 @@
+#ifndef __GRAPHQL_H__
+#define __GRAPHQL_H__ 1
+
+#include <stdio.h>
+
+#include <ccan/list/list.h>
+#include <ccan/tal/tal.h>
+
+// Coding constants
+#define GRAPHQL_SUCCESS 0
+
+// The following structures constitute the AST returned by the parser.
+
+struct graphql_directive {
+       struct graphql_directive *next;
+       struct graphql_token *name;
+       struct graphql_arguments *args;
+};
+
+struct graphql_directives {
+       struct graphql_directive *first;
+};
+
+struct graphql_named_type {
+       struct graphql_token *name;
+};
+
+struct graphql_type {
+       struct graphql_named_type *named;
+//     struct graphql_list_type *list;
+//     struct graphql_non_null_type *non_null;
+};
+
+struct graphql_default_value {
+       struct graphql_value *val;
+};
+
+struct graphql_variable_definition {
+       struct graphql_variable_definition *next;
+       struct graphql_variable *var;
+       struct graphql_type *type;
+       struct graphql_default_value *default_val;
+       struct graphql_directives *directives;
+};
+
+struct graphql_variable_definitions {
+       struct graphql_variable_definition *first;
+};
+
+struct graphql_variable {
+       struct graphql_token *name;
+};
+
+struct graphql_object_field {
+       struct graphql_object_field *next;
+       struct graphql_token *name;
+       struct graphql_value *val;
+};
+
+struct graphql_object_value {
+       struct graphql_object_field *first;
+};
+
+struct graphql_list_value {
+       struct graphql_token *val;
+};
+
+struct graphql_enum_value {
+       struct graphql_token *val;
+};
+
+struct graphql_null_value {
+       struct graphql_token *val;
+};
+
+struct graphql_string_value {
+       struct graphql_token *val;
+};
+
+struct graphql_boolean_value {
+       struct graphql_token *val;
+};
+
+struct graphql_float_value {
+       struct graphql_token *val;
+};
+
+struct graphql_int_value {
+       struct graphql_token *val;
+};
+
+struct graphql_value {
+       struct graphql_variable *var;
+       struct graphql_int_value *int_val;
+       struct graphql_float_value *float_val;
+       struct graphql_boolean_value *bool_val;
+       struct graphql_string_value *str_val;
+       struct graphql_null_value *null_val;
+       struct graphql_enum_value *enum_val;
+       struct graphql_list_value *list_val;
+       struct graphql_object_value *obj_val;
+};
+
+struct graphql_inline_fragment {
+       struct graphql_type_condition *type_cond;
+       struct graphql_directives *directives;
+       struct graphql_selection_set *sel_set;
+};
+
+struct graphql_type_condition {
+       struct graphql_named_type *named_type;
+};
+
+struct graphql_fragment_name {
+       struct graphql_token *name;
+};
+
+struct graphql_fragment_definition {
+       struct graphql_fragment_name *name;
+       struct graphql_type_condition *type_cond;
+       struct graphql_directives *directives;
+       struct graphql_selection_set *sel_set;
+};
+
+struct graphql_fragment_spread {
+       struct graphql_fragment_name *name;
+       struct graphql_directives *directives;
+};
+
+struct graphql_alias {
+       struct graphql_token *name;
+};
+
+struct graphql_argument {
+       struct graphql_argument *next;
+       struct graphql_token *name;
+       struct graphql_value *val;
+};
+
+struct graphql_arguments {
+       struct graphql_argument *first;
+};
+
+struct graphql_field {
+       struct graphql_alias *alias;
+       struct graphql_token *name;
+       struct graphql_arguments *args;
+       struct graphql_directives *directives;
+       struct graphql_selection_set *sel_set;
+};
+
+struct graphql_selection {
+       struct graphql_selection *next;
+       struct graphql_field *field;
+       struct graphql_fragment_spread *frag_spread;
+       struct graphql_inline_fragment *inline_frag;
+};
+
+struct graphql_selection_set {
+       struct graphql_selection *first;
+};
+
+struct graphql_operation_type {
+       struct graphql_token *op_type;
+};
+
+struct graphql_operation_definition {
+       struct graphql_operation_type *op_type;
+       struct graphql_token *op_name;
+       struct graphql_variable_definitions *vars;
+       struct graphql_directives *directives;
+       struct graphql_selection_set *sel_set;
+};
+
+struct graphql_executable_definition {
+       struct graphql_executable_definition *next_def;
+       struct graphql_operation_definition *op_def;
+       struct graphql_fragment_definition *frag_def;
+};
+
+struct graphql_executable_document {
+       struct graphql_executable_definition *first_def;
+};
+
+struct graphql_definition {
+       struct graphql_definition *next_def;
+       struct graphql_executable_definition *executable_def;
+       struct graphql_type_system_definition_or_extension *type_system_def;
+};
+
+struct graphql_document {
+       struct graphql_definition *first_def;
+};
+
+
+struct graphql_token {
+       struct list_node list;
+       unsigned int token_type;
+       unsigned int token_specific;
+       char *token_string;
+       unsigned int source_line;
+       unsigned int source_column;
+       unsigned int source_len;
+};
+
+/* The lexer.
+ * INPUTS:
+ *     input - string to parse
+ *     ctx - parent tal context or NULL
+ *     tokens - a variable to receive the resulting token list
+ * RETURN:
+ *     GRAPHQL_SUCCESS or an error string.
+ */
+const char *graphql_lex(const char *input, const tal_t *ctx, struct list_head **tokens);
+
+/* The parser.
+ * INPUTS:
+ *     tokens - the list produced by the lexer
+ *     doc - a variable to receive the resulting abstract syntax tree (AST)
+ * RETURN:
+ *     GRAPHQL_SUCCESS or an error string.
+ */
+const char *graphql_parse(struct list_head *tokens, struct graphql_executable_document **doc);
+
+/* The lexer and parser in one function, for convenience. */
+const char *graphql_lexparse(const char *input, const tal_t *ctx, struct list_head **tokens, struct graphql_executable_document **doc);
+
+#endif
+