aboutsummaryrefslogtreecommitdiffstats
path: root/src/mds-kbdc
diff options
context:
space:
mode:
authorMattias Andrée <maandree@operamail.com>2014-11-16 05:06:01 +0100
committerMattias Andrée <maandree@operamail.com>2014-11-16 05:06:01 +0100
commit9940529e836131cfcb4c60984a73cdceb660636e (patch)
tree36d4fbd6f118c8fa9d7e71d43fbb76db35ec350e /src/mds-kbdc
parentm (diff)
downloadmds-9940529e836131cfcb4c60984a73cdceb660636e.tar.gz
mds-9940529e836131cfcb4c60984a73cdceb660636e.tar.bz2
mds-9940529e836131cfcb4c60984a73cdceb660636e.tar.xz
mds-kbdc: annotate tree with source code locations and report where unpopped scopes were pushed
Signed-off-by: Mattias Andrée <maandree@operamail.com>
Diffstat (limited to 'src/mds-kbdc')
-rw-r--r--src/mds-kbdc/make-tree.c34
-rw-r--r--src/mds-kbdc/tree.h12
2 files changed, 31 insertions, 15 deletions
diff --git a/src/mds-kbdc/make-tree.c b/src/mds-kbdc/make-tree.c
index 311afdc..e749a7f 100644
--- a/src/mds-kbdc/make-tree.c
+++ b/src/mds-kbdc/make-tree.c
@@ -101,10 +101,13 @@
* @param LOWERCASE:identifier The keyword, for the node type, in lower case
* @param UPPERCASE:identifier The keyword, for the node type, in upper case
*/
-#define NEW_NODE(LOWERCASE, UPPERCASE) \
- mds_kbdc_tree_##LOWERCASE##_t* node; \
- fail_if (xcalloc(node, 1, mds_kbdc_tree_##LOWERCASE##_t)); \
- node->type = MDS_KBDC_TREE_TYPE_##UPPERCASE
+#define NEW_NODE(LOWERCASE, UPPERCASE) \
+ mds_kbdc_tree_##LOWERCASE##_t* node; \
+ fail_if (xcalloc(node, 1, mds_kbdc_tree_##LOWERCASE##_t)); \
+ node->type = MDS_KBDC_TREE_TYPE_##UPPERCASE; \
+ node->loc_line = line_i; \
+ node->loc_start = (size_t)(line - source_code.lines[line_i]); \
+ node->loc_end = (size_t)(end - source_code.lines[line_i])
/**
@@ -696,6 +699,7 @@ int parse_to_tree(const char* restrict filename, mds_kbdc_tree_t** restrict resu
NEW_NODE(array, ARRAY);
#define inner elements
BRANCH("}");
+ node->loc_end = node->loc_start + 1;
#undef inner
#undef node
in_array = 1;
@@ -765,15 +769,19 @@ int parse_to_tree(const char* restrict filename, mds_kbdc_tree_t** restrict resu
char* end = NULL;
NEW_ERROR(0, ERROR, "premature end of file");
while (stack_ptr--)
- /* TODO from where? */
- if (!strcmp(keyword_stack[stack_ptr], "}"))
- {
- NEW_ERROR(0, NOTE, "missing ‘%s’", keyword_stack[stack_ptr]);
- }
- else
- {
- NEW_ERROR(0, NOTE, "missing ‘end %s’", keyword_stack[stack_ptr]);
- }
+ {
+ line_i = tree_stack[stack_ptr][0]->loc_line;
+ line = source_code.lines[line_i] + tree_stack[stack_ptr][0]->loc_start;
+ end = source_code.lines[line_i] + tree_stack[stack_ptr][0]->loc_end;
+ if (!strcmp(keyword_stack[stack_ptr], "}"))
+ {
+ NEW_ERROR(1, NOTE, "missing associated ‘%s’", keyword_stack[stack_ptr]);
+ }
+ else
+ {
+ NEW_ERROR(1, NOTE, "missing associated ‘end %s’", keyword_stack[stack_ptr]);
+ }
+ }
}
free(pathname);
diff --git a/src/mds-kbdc/tree.h b/src/mds-kbdc/tree.h
index 1f31e34..7bdbf3d 100644
--- a/src/mds-kbdc/tree.h
+++ b/src/mds-kbdc/tree.h
@@ -170,8 +170,16 @@ typedef union mds_kbdc_tree mds_kbdc_tree_t;
* It defines:
* - int type; -- Integer that specifies which structure is used
* - mds_kbdc_tree_t*; -- The next node in the tree, at the same level; a sibling
- */
-#define MDS_KBDC_TREE_COMMON int type; mds_kbdc_tree_t* next
+ * - loc_line; -- The line in the source code where this is found
+ * - loc_start; -- The first byte in the source code where this is found, inclusive
+ * - loc_end; -- The last byte in the source code where this is found, exclusive
+ */
+#define MDS_KBDC_TREE_COMMON \
+ int type; \
+ mds_kbdc_tree_t* next; \
+ size_t loc_line; \
+ size_t loc_start; \
+ size_t loc_end
/**
* This macro is used in this header file, and is then