From: Matthias Kruk Date: Sun, 5 Jul 2020 08:30:18 +0000 (+0900) Subject: parser: Implement parsing of logical-or-expression grammar constructs; add prototypes... X-Git-Url: https://git.corax.cc/?a=commitdiff_plain;h=017d7825019094f5aa152a8336acb4118c0c0b0c;p=ccc parser: Implement parsing of logical-or-expression grammar constructs; add prototypes for parser functions --- diff --git a/src/parser.c b/src/parser.c index 18a9ea2..a8d0bc4 100644 --- a/src/parser.c +++ b/src/parser.c @@ -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 index 0000000..8a72a6e --- /dev/null +++ b/src/parser.h @@ -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 */