Compare commits
3 Commits
dd5f43fd7f
...
1d8df2c22a
Author | SHA1 | Date |
---|---|---|
Eric-Paul Ickhorn | 1d8df2c22a | |
Eric-Paul Ickhorn | c5e21b4dc8 | |
Eric-Paul Ickhorn | e70e9c5cef |
|
@ -1,4 +1,4 @@
|
|||
#include <parcel.h>
|
||||
#include <grammar.h>
|
||||
#include <ast.h>
|
||||
|
||||
#include <stdio.h>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#include <parcel.h>
|
||||
#include <grammar.h>
|
||||
#include <tokenizer.h>
|
||||
#include <ast.h>
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
|
||||
#ifndef PARCEL_H
|
||||
#define PARCEL_H
|
||||
#ifndef PARCEL_GRAMMAR_H
|
||||
#define PARCEL_GRAMMAR_H
|
||||
|
||||
#include <parcel/utility/utility.h>
|
||||
#include <logger.h>
|
||||
|
@ -85,4 +85,7 @@ void pac_delete_grammar (pac_grammar_s grammar);
|
|||
void pac_display_log (pac_logger_s *logger);
|
||||
void pac_display_grammar (pac_grammar_s grammar);
|
||||
|
||||
#endif // PARCEL_H
|
||||
pac_rule_s * pac_find_rule (pac_grammar_s *grammar, char *name);
|
||||
bool_t pac_grammar_has_rule_name_duplications (pac_grammar_s *grammar);
|
||||
|
||||
#endif // PARCEL_GRAMMAR_H
|
|
@ -21,15 +21,23 @@ typedef enum
|
|||
PAC_TOKEN_LIT_RUNE, // TODO
|
||||
PAC_TOKEN_LIT_INTEGER, // TODO
|
||||
|
||||
PAC_TOKEN_SIGN_OPEN_TAG,
|
||||
PAC_TOKEN_SIGN_CLOSE_TAG,
|
||||
PAC_TOKEN_SIGN_OPENING_TAG,
|
||||
PAC_TOKEN_SIGN_CLOSING_TAG,
|
||||
PAC_TOKEN_SIGN_OPENING_BRACKET,
|
||||
PAC_TOKEN_SIGN_CLOSING_BRACKET,
|
||||
PAC_TOKEN_SIGN_EQUALS,
|
||||
PAC_TOKEN_SIGN_SEMICOLON,
|
||||
PAC_TOKEN_SIGN_COLON,
|
||||
PAC_TOKEN_SIGN_COMMA,
|
||||
PAC_TOKEN_SIGN_HYPHEN,
|
||||
PAC_TOKEN_SIGN_UNDERSCORE,
|
||||
PAC_TOKEN_SIGN_VERTICAL_BAR,
|
||||
PAC_TOKEN_SIGN_SEMICOLON
|
||||
PAC_TOKEN_SIGN_AMPERSAND,
|
||||
PAC_TOKEN_SIGN_DOLLAR,
|
||||
PAC_TOKEN_SIGN_SLASH,
|
||||
PAC_TOKEN_SIGN_HASH,
|
||||
PAC_TOKEN_SIGN_AT,
|
||||
PAC_TOKEN_SIGN_PLUS,
|
||||
PAC_TOKEN_SIGN_MINUS,
|
||||
|
||||
} pac_token_e;
|
||||
|
||||
|
|
|
@ -17,7 +17,7 @@ pac_ast_status_e pac_build_ast_reference(pac_ast_builder_s *builder, pac_ast_ref
|
|||
{
|
||||
usz_t start_cursor = TOKEN_CURSOR;
|
||||
|
||||
if(CURRENT_TOKEN.type != PAC_TOKEN_SIGN_OPEN_TAG)
|
||||
if(CURRENT_TOKEN.type != PAC_TOKEN_SIGN_OPENING_TAG)
|
||||
{
|
||||
pac_internal_error_s error;
|
||||
error.type = PAC_INTERNAL_ERROR_INVALID_RETURNED_STATUS;
|
||||
|
@ -35,7 +35,7 @@ pac_ast_status_e pac_build_ast_reference(pac_ast_builder_s *builder, pac_ast_ref
|
|||
}
|
||||
SKIP_TOKEN;
|
||||
|
||||
if(CURRENT_TOKEN.type != PAC_TOKEN_SIGN_CLOSE_TAG)
|
||||
if(CURRENT_TOKEN.type != PAC_TOKEN_SIGN_CLOSING_TAG)
|
||||
{
|
||||
return pac_ast_handle_missing_reference_close_tag(builder);
|
||||
}
|
||||
|
@ -78,7 +78,7 @@ pac_ast_status_e pac_build_ast_item(pac_ast_builder_s *builder, pac_ast_item_s *
|
|||
return pac_build_ast_string_literal(builder, &item->data.string_literal);
|
||||
}
|
||||
|
||||
if(CURRENT_TOKEN.type == PAC_TOKEN_SIGN_OPEN_TAG)
|
||||
if(CURRENT_TOKEN.type == PAC_TOKEN_SIGN_OPENING_TAG)
|
||||
{
|
||||
item->type = PAC_AST_ITEM_REFERENCE;
|
||||
return pac_build_ast_reference(builder, &item->data.reference);
|
||||
|
@ -137,7 +137,7 @@ pac_ast_status_e pac_build_ast_variant(pac_ast_builder_s *builder, pac_ast_varia
|
|||
// Test if there is no separator and, if there is none, handle the error.
|
||||
if(
|
||||
(CURRENT_TOKEN.type != PAC_TOKEN_SIGN_COMMA)
|
||||
&& (CURRENT_TOKEN.type != PAC_TOKEN_SIGN_HYPHEN)
|
||||
&& (CURRENT_TOKEN.type != PAC_TOKEN_SIGN_MINUS)
|
||||
) {
|
||||
status = pac_ast_handle_missing_item_separator(builder, rule_name, variant_index, variant->num_items);
|
||||
if(status != PAC_AST_STATUS_ERROR_HANDLED) return status;
|
||||
|
@ -152,7 +152,7 @@ pac_ast_status_e pac_build_ast_variant(pac_ast_builder_s *builder, pac_ast_varia
|
|||
|
||||
pac_ast_status_e pac_skip_ast_rule_header(pac_ast_builder_s *builder)
|
||||
{
|
||||
if(CURRENT_TOKEN.type != PAC_TOKEN_SIGN_OPEN_TAG)
|
||||
if(CURRENT_TOKEN.type != PAC_TOKEN_SIGN_OPENING_TAG)
|
||||
{
|
||||
pac_internal_error_s error;
|
||||
error.type = PAC_INTERNAL_ERROR_INVALID_RETURNED_STATUS;
|
||||
|
@ -174,7 +174,7 @@ pac_ast_status_e pac_skip_ast_rule_header(pac_ast_builder_s *builder)
|
|||
}
|
||||
SKIP_TOKEN;
|
||||
|
||||
if(CURRENT_TOKEN.type != PAC_TOKEN_SIGN_CLOSE_TAG)
|
||||
if(CURRENT_TOKEN.type != PAC_TOKEN_SIGN_CLOSING_TAG)
|
||||
{
|
||||
if((status = pac_ast_handle_missing_rule_header_closing_sign(builder) != PAC_AST_STATUS_ERROR_HANDLED))
|
||||
return status;
|
||||
|
|
|
@ -16,7 +16,7 @@ char * pac_identify_present_construct(pac_ast_builder_s *builder)
|
|||
{
|
||||
switch(CURRENT_TOKEN.type)
|
||||
{
|
||||
case PAC_TOKEN_SIGN_OPEN_TAG: return "RULE_IDENTIFIER";
|
||||
case PAC_TOKEN_SIGN_OPENING_TAG: return "RULE_IDENTIFIER";
|
||||
default: return "UNKNOWN";
|
||||
}
|
||||
}
|
||||
|
@ -42,7 +42,7 @@ bool_t pac_ast_builder_is_at_item_start(pac_ast_builder_s *builder)
|
|||
switch(CURRENT_TOKEN.type)
|
||||
{
|
||||
case PAC_TOKEN_LIT_STRING:
|
||||
case PAC_TOKEN_SIGN_OPEN_TAG:
|
||||
case PAC_TOKEN_SIGN_OPENING_TAG:
|
||||
case PAC_TOKEN_KEYWORD_WORD:
|
||||
case PAC_TOKEN_KEYWORD_INTEGER:
|
||||
return TRUE;
|
||||
|
@ -78,7 +78,7 @@ pac_ast_status_e pac_ast_handle_invalid_reference_name_token(pac_ast_builder_s *
|
|||
usz_t tried_tokens = 0;
|
||||
while(tried_tokens < 3)
|
||||
{
|
||||
if(TOKEN_AT(TOKEN_CURSOR + tried_tokens).type == PAC_TOKEN_SIGN_CLOSE_TAG)
|
||||
if(TOKEN_AT(TOKEN_CURSOR + tried_tokens).type == PAC_TOKEN_SIGN_CLOSING_TAG)
|
||||
{
|
||||
len_reference_name = TOKEN_AT(TOKEN_CURSOR + tried_tokens).offset - open_tag_src_offset;
|
||||
++len_reference_name; // Take the closing tag into the name
|
||||
|
@ -152,7 +152,7 @@ pac_ast_status_e pac_ast_handle_missing_item_separator(pac_ast_builder_s *builde
|
|||
error.specifics.odd_token.present_token = pac_stringify_token_type(CURRENT_TOKEN.type);
|
||||
error.specifics.odd_token.num_valid_options = 2;
|
||||
error.specifics.odd_token.valid_options[0] = pac_stringify_token_type(PAC_TOKEN_SIGN_COMMA);
|
||||
error.specifics.odd_token.valid_options[1] = pac_stringify_token_type(PAC_TOKEN_SIGN_HYPHEN);
|
||||
error.specifics.odd_token.valid_options[1] = pac_stringify_token_type(PAC_TOKEN_SIGN_MINUS);
|
||||
pac_log_syntax_error(builder->logger, error);
|
||||
|
||||
return PAC_AST_STATUS_ERROR_HANDLED;
|
||||
|
@ -219,7 +219,7 @@ pac_ast_status_e pac_ast_handle_missing_rule_header_closing_sign(pac_ast_builder
|
|||
error.location.column = CURRENT_TOKEN.column;
|
||||
error.specifics.odd_token.present_token = pac_stringify_token_type(CURRENT_TOKEN.type);
|
||||
error.specifics.odd_token.num_valid_options = 1;
|
||||
error.specifics.odd_token.valid_options[0] = pac_stringify_token_type(PAC_TOKEN_SIGN_CLOSE_TAG);
|
||||
error.specifics.odd_token.valid_options[0] = pac_stringify_token_type(PAC_TOKEN_SIGN_CLOSING_TAG);
|
||||
|
||||
// Continue at equals sign (if possible)
|
||||
if(!pac_ast_builder_forward_seek_token_type(builder, PAC_TOKEN_SIGN_EQUALS, 3))
|
||||
|
@ -244,7 +244,7 @@ pac_ast_status_e pac_ast_handle_unknown_item_type(pac_ast_builder_s *builder, ch
|
|||
error.location.column = CURRENT_TOKEN.column;
|
||||
error.specifics.odd_token.present_token = pac_stringify_token_type(CURRENT_TOKEN.type);
|
||||
error.specifics.odd_token.num_valid_options = 1;
|
||||
error.specifics.odd_token.valid_options[0] = pac_stringify_token_type(PAC_TOKEN_SIGN_CLOSE_TAG);
|
||||
error.specifics.odd_token.valid_options[0] = pac_stringify_token_type(PAC_TOKEN_SIGN_CLOSING_TAG);
|
||||
|
||||
if(!pac_ast_builder_forward_seek_item_start(builder, 5))
|
||||
{
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#include <parcel.h>
|
||||
#include <grammar.h>
|
||||
#include <ast.h>
|
||||
#include <tokenizer.h>
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#include <parcel.h>
|
||||
#include <grammar.h>
|
||||
#include <ast.h>
|
||||
|
||||
#include <stdio.h>
|
||||
|
@ -32,17 +32,6 @@ pac_set_e pac_convert_ast_set_to_grammar_set(pac_ast_set_e set)
|
|||
return PAC_SET_INVALID;
|
||||
}
|
||||
|
||||
pac_rule_s * pac_find_rule(pac_grammar_s *grammar, char *name)
|
||||
{
|
||||
for(usz_t index = 0; index < grammar->num_rules; ++index)
|
||||
{
|
||||
if(!strcmp(grammar->rules[index].name, name))
|
||||
return &grammar->rules[index];
|
||||
}
|
||||
printf("Couldn't find refernced rule: %s\n", name);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void pac_copy_single_variant(pac_grammar_s *grammar, pac_variant_s *variant, pac_ast_variant_s *ast_variant)
|
||||
{
|
||||
variant->num_items = ast_variant->num_items;
|
||||
|
|
|
@ -30,15 +30,23 @@ pac_token_e pac_convert_sign_to_token_type(rune_t sign)
|
|||
{
|
||||
switch(sign)
|
||||
{
|
||||
case '<': return PAC_TOKEN_SIGN_OPEN_TAG;
|
||||
case '>': return PAC_TOKEN_SIGN_CLOSE_TAG;
|
||||
case '<': return PAC_TOKEN_SIGN_OPENING_TAG;
|
||||
case '>': return PAC_TOKEN_SIGN_CLOSING_TAG;
|
||||
case '[': return PAC_TOKEN_SIGN_OPENING_BRACKET;
|
||||
case ']': return PAC_TOKEN_SIGN_CLOSING_BRACKET;
|
||||
case '=': return PAC_TOKEN_SIGN_EQUALS;
|
||||
case ';': return PAC_TOKEN_SIGN_SEMICOLON;
|
||||
case ':': return PAC_TOKEN_SIGN_COLON;
|
||||
case ',': return PAC_TOKEN_SIGN_COMMA;
|
||||
case '-': return PAC_TOKEN_SIGN_HYPHEN;
|
||||
case '_': return PAC_TOKEN_SIGN_UNDERSCORE;
|
||||
case '|': return PAC_TOKEN_SIGN_VERTICAL_BAR;
|
||||
case ';': return PAC_TOKEN_SIGN_SEMICOLON;
|
||||
case '&': return PAC_TOKEN_SIGN_AMPERSAND;
|
||||
case '$': return PAC_TOKEN_SIGN_DOLLAR;
|
||||
case '/': return PAC_TOKEN_SIGN_SLASH;
|
||||
case '#': return PAC_TOKEN_SIGN_HASH;
|
||||
case '@': return PAC_TOKEN_SIGN_AT;
|
||||
case '+': return PAC_TOKEN_SIGN_PLUS;
|
||||
case '-': return PAC_TOKEN_SIGN_MINUS;
|
||||
}
|
||||
return PAC_TOKEN_STRAY;
|
||||
}
|
||||
|
@ -204,28 +212,36 @@ char * pac_stringify_token_type(pac_token_e type)
|
|||
{
|
||||
switch(type)
|
||||
{
|
||||
case PAC_TOKEN_STRAY: return " - ";
|
||||
case PAC_TOKEN_STRAY: return "STRAY";
|
||||
|
||||
case PAC_TOKEN_WORD: return "Word";
|
||||
case PAC_TOKEN_KEYWORD_TRUE: return "Keyword: \"true\"";
|
||||
case PAC_TOKEN_KEYWORD_FALSE: return "Keyword: \"false\"";
|
||||
case PAC_TOKEN_KEYWORD_ALPHA: return "Keyword: \"alpha\"";
|
||||
case PAC_TOKEN_KEYWORD_WORD: return "Keyword: \"word\"";
|
||||
case PAC_TOKEN_KEYWORD_INTEGER: return "Keyword: \"integer\"";
|
||||
case PAC_TOKEN_WORD: return "Word";
|
||||
case PAC_TOKEN_KEYWORD_TRUE: return "Keyword: \"true\"";
|
||||
case PAC_TOKEN_KEYWORD_FALSE: return "Keyword: \"false\"";
|
||||
case PAC_TOKEN_KEYWORD_ALPHA: return "Keyword: \"alpha\"";
|
||||
case PAC_TOKEN_KEYWORD_WORD: return "Keyword: \"word\"";
|
||||
case PAC_TOKEN_KEYWORD_INTEGER: return "Keyword: \"integer\"";
|
||||
|
||||
case PAC_TOKEN_SIGN_OPEN_TAG: return "Sign: <";
|
||||
case PAC_TOKEN_SIGN_CLOSE_TAG: return "Sign: >";
|
||||
case PAC_TOKEN_SIGN_EQUALS: return "Sign: =";
|
||||
case PAC_TOKEN_SIGN_COLON: return "Sign: :";
|
||||
case PAC_TOKEN_SIGN_COMMA: return "Sign: ,";
|
||||
case PAC_TOKEN_SIGN_HYPHEN: return "Sign: -";
|
||||
case PAC_TOKEN_SIGN_UNDERSCORE: return "Sign: _";
|
||||
case PAC_TOKEN_SIGN_VERTICAL_BAR: return "Sign: |";
|
||||
case PAC_TOKEN_SIGN_SEMICOLON: return "Sign: ;";
|
||||
|
||||
case PAC_TOKEN_LIT_STRING: return "String";
|
||||
case PAC_TOKEN_LIT_RUNE: return "Rune";
|
||||
case PAC_TOKEN_LIT_INTEGER: return "Integer";
|
||||
case PAC_TOKEN_SIGN_OPENING_TAG: return "Sign: <";
|
||||
case PAC_TOKEN_SIGN_CLOSING_TAG: return "Sign: >";
|
||||
case PAC_TOKEN_SIGN_OPENING_BRACKET: return "Sign: [";
|
||||
case PAC_TOKEN_SIGN_CLOSING_BRACKET: return "Sign: ]";
|
||||
case PAC_TOKEN_SIGN_EQUALS: return "Sign: =";
|
||||
case PAC_TOKEN_SIGN_SEMICOLON: return "Sign: ;";
|
||||
case PAC_TOKEN_SIGN_COLON: return "Sign: :";
|
||||
case PAC_TOKEN_SIGN_COMMA: return "Sign: ,";
|
||||
case PAC_TOKEN_SIGN_UNDERSCORE: return "Sign: _";
|
||||
case PAC_TOKEN_SIGN_VERTICAL_BAR: return "Sign: |";
|
||||
case PAC_TOKEN_SIGN_AMPERSAND: return "Sign: &";
|
||||
case PAC_TOKEN_SIGN_DOLLAR: return "Sign: $";
|
||||
case PAC_TOKEN_SIGN_SLASH: return "Sign: /";
|
||||
case PAC_TOKEN_SIGN_HASH: return "Sign: #";
|
||||
case PAC_TOKEN_SIGN_AT: return "Sign: @";
|
||||
case PAC_TOKEN_SIGN_PLUS: return "Sign: +";
|
||||
case PAC_TOKEN_SIGN_MINUS: return "Sign: -";
|
||||
|
||||
case PAC_TOKEN_LIT_STRING: return "String";
|
||||
case PAC_TOKEN_LIT_RUNE: return "Rune";
|
||||
case PAC_TOKEN_LIT_INTEGER: return "Integer";
|
||||
}
|
||||
return "Invalid";
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue