diff options
Diffstat (limited to 'src/mds-kbdc/simplify-tree.c')
-rw-r--r-- | src/mds-kbdc/simplify-tree.c | 43 |
1 files changed, 35 insertions, 8 deletions
diff --git a/src/mds-kbdc/simplify-tree.c b/src/mds-kbdc/simplify-tree.c index 67c2b03..a6b4247 100644 --- a/src/mds-kbdc/simplify-tree.c +++ b/src/mds-kbdc/simplify-tree.c @@ -319,18 +319,14 @@ static int simplify_macro_call(mds_kbdc_tree_macro_call_t* restrict tree) /** - * Check for bad things in a value statement + * Check for bad things in a value statement for before the simplification process * * @param tree The value statement-tree * @return Zero on success, -1 on error */ -static int check_value_statement(mds_kbdc_tree_map_t* restrict tree) +static int check_value_statement_before_simplification(mds_kbdc_tree_map_t* restrict tree) { again: - /* Check that there is only one value. */ - if (tree->sequence->next) - NEW_ERROR(tree->sequence->next, ERROR, "more the one value in value statement"); - /* Check for alternation. */ if ((tree->sequence->type == C(ALTERNATION)) && (tree->processed != PROCESS_LEVEL)) NEW_ERROR(tree->sequence, WARNING, @@ -352,6 +348,28 @@ static int check_value_statement(mds_kbdc_tree_map_t* restrict tree) /** + * Check for bad things in a value statement for after the simplification process + * + * @param tree The value statement-tree + * @return Zero on success, -1 on error + */ +static int check_value_statement_after_simplification(mds_kbdc_tree_map_t* restrict tree) +{ + /* Check that there is only one value. */ + if (tree->sequence->next) + NEW_ERROR(tree->sequence->next, ERROR, "more the one value in value statement"); + + /* Check the type of the value */ + if (tree->sequence->type != C(STRING)) + NEW_ERROR(tree->sequence, ERROR, "bad value type"); + + return 0; + pfail: + return -1; +} + + +/** * Simplify a mapping-subtree * * @param tree The mapping-subtree @@ -373,7 +391,7 @@ static int simplify_map(mds_kbdc_tree_map_t* restrict tree) /* Valid value properties. */ if (tree->result == NULL) - fail_if(check_value_statement(tree)); + fail_if(check_value_statement_before_simplification(tree)); /* Simplify sequence. */ for (argument = tree->sequence; argument; argument = argument->next) @@ -384,7 +402,12 @@ static int simplify_map(mds_kbdc_tree_map_t* restrict tree) if (argument->type != C(NOTHING)) goto will_not_be_empty; if (tree->sequence->processed != PROCESS_LEVEL) - NEW_ERROR(tree->sequence, ERROR, "mapping of null sequence"); + { + if (tree->result) + NEW_ERROR(tree->sequence, ERROR, "mapping of null sequence"); + else + NEW_ERROR(tree->sequence, ERROR, "nothing in value statement"); + } /* The tree parsing process will not allow a mapping statement * to start with a ‘.’. Thus if we select to highlight it we * know that it is either an empty alternation, an empty @@ -421,6 +444,10 @@ static int simplify_map(mds_kbdc_tree_map_t* restrict tree) redo = 1; } + /* Valid value properties. */ + if (tree->result == NULL) + fail_if(check_value_statement_after_simplification(tree)); + /* Mapping statements are simplified in a manner similar * to how macro calls are simplified. However mapping * statements can also contain unordered subsequences, |