]> git.corax.cc Git - ccc/commitdiff
parser: Implement parsing of logical-or-expression grammar constructs; add prototypes...
authorMatthias Kruk <m@m10k.eu>
Sun, 5 Jul 2020 08:30:18 +0000 (17:30 +0900)
committerMatthias Kruk <m@m10k.eu>
Sun, 5 Jul 2020 08:30:18 +0000 (17:30 +0900)
src/parser.c
src/parser.h [new file with mode: 0644]

index 18a9ea2d2914ef974f525cdbf05e569b27dc8ea4..a8d0bc4c3406960c42b48cf4f17710fc2404cb0b 100644 (file)
@@ -746,6 +746,49 @@ struct type_name *parse_type_name(void)
 }
 
 struct logical_or_expression *parse_logical_or_expression(void)
+{
+       struct logical_or_expression *expr;
+       int pos;
+
+       expr = logical_or_expression_new();
+
+       if(!expr) {
+               return(NULL);
+       }
+
+       pos = lex_getpos();
+
+       /* attempt to parse `logical-OR-expression ||' prefix */
+
+       expr->lorexpr = parse_logical_or_expression();
+       expr->op = lex_gettoken();
+
+       if(!expr->lorexpr || !expr->op || expr->op->type != TOKEN_LOR) {
+               /* doesn't look like a prefix... */
+
+               lex_setpos(pos);
+
+               if(expr->lorexpr) {
+                       free(expr->lorexpr);
+                       expr->lorexpr = NULL;
+               }
+               expr->op = NULL;
+       }
+
+       if(!(expr->landexpr = parse_logical_and_expression())) {
+               if(expr->lorexpr) {
+                       free(expr->lorexpr);
+                       expr->lorexpr = NULL;
+               }
+
+               free(expr);
+               expr = NULL;
+       }
+
+       return(expr);
+}
+
+struct logical_and_expression *parse_logical_and_expression(void)
 {
        return(NULL);
 }
diff --git a/src/parser.h b/src/parser.h
new file mode 100644 (file)
index 0000000..8a72a6e
--- /dev/null
@@ -0,0 +1,38 @@
+#ifndef PARSER_H
+#define PARSER_H
+
+#include "grammar.h"
+
+struct integer_constant *parse_integer_constant(void);
+struct character_constant *parse_character_constant(void);
+struct floating_constant *parse_floating_constant(void);
+struct enumeration_constant *parse_enumeration_constant(void);
+struct constant *parse_constant(void);
+struct string *parse_string(void);
+struct type_name *parse_type_name(void);
+
+struct logical_or_expression *parse_logical_or_expression(void);
+struct logical_and_expression *parse_logical_and_expression(void);
+
+struct unary_expression *parse_unary_expression(void);
+struct conditional_expression *parse_conditional_expression(void);
+struct identifier *parse_identifier(void);
+struct expression *parse_expression(void);
+struct primary_expression *parse_primary_expression(void);
+struct type_qualifier *parse_type_qualifier(void);
+struct storage_class_specifier *parse_storage_class_specifier(void);
+struct struct_specifier *parse_struct_specifier(void); /* TODO */
+struct union_specifier *parse_union_specifier(void); /* TODO */
+struct enum_specifier *parse_enum_specifier(void); /* TODO */
+struct typedef_name *parse_typedef_name(void); /* TODO */
+struct type_specifier *parse_type_specifier(void);
+struct declaration_list *parse_declaration_list(void);
+struct declaration_specifiers *parse_declaration_specifiers(void);
+struct function_definition *parse_function_definition(void);
+struct compound_statement *parse_compound_statement(void);
+struct declarator *parse_declarator(void);
+struct declaration *parse_declaration(void);
+struct external_declaration *parse_external_declaration(void);
+struct translation_unit *parse_translation_unit(struct translation_unit*);
+
+#endif /* PARSER_H */