This is pspans.c in view mode; [Download] [Up]
/*
* Copyright (C) 1985-1992 New York University
*
* This file is part of the Ada/Ed-C system. See the Ada/Ed README file for
* warranty (none) and distribution info and also the GNU General Public
* License for more details.
*/
#include "ada.h"
#include "miscprots.h"
#include "adalexprots.h"
#include "pspansprots.h"
extern char *emalloc();
int is_terminal_node(short node_kind) /*;is_terminal_node*/
{
return (
node_kind == AS_STRING ||
node_kind == AS_STRING_LITERAL ||
node_kind == AS_CHARACTER_LITERAL ||
node_kind == AS_INT_LITERAL ||
node_kind == AS_REAL_LITERAL ||
node_kind == AS_SIMPLE_NAME ||
node_kind == AS_OPERATOR ||
node_kind == AS_MODE ||
node_kind == AS_PACKAGE_STUB ||
node_kind == AS_TASK_STUB ||
node_kind == AS_NULL ||
node_kind == AS_NULL_S ||
node_kind == AS_OTHERS ||
node_kind == AS_GENERIC ||
node_kind == AS_LINE_NO
);
}
struct tok_loc *get_left_span(struct ast *node) /*;get_left_span*/
{
short nkind,first;
struct two_pool *firstelem;
struct ast **astptr;
nkind = node->kind;
if (is_terminal_node(nkind))
return (&node->span);
else if (nkind == AS_OPT)
return (&node->span);
else if (nkind == AS_EXIT) {
return get_left_span(node->links.subast[3]);
}
else if (nkind == AS_RETURN) {
return get_left_span(node->links.subast[3]);
}
else if (nkind == AS_RAISE) {
return get_left_span(node->links.subast[1]);
}
else if (nkind == AS_OTHERS_CHOICE) {
return get_left_span(node->links.subast[2]);
}
else if (islist_node[nkind]) {
if (node->links.list==NULL) /* only for parser */
return (&node->span);
else {
firstelem = node->links.list->link;/* first list element */
if (firstelem->val.node == opt_node)
chaos("get_left_span: list element opt_node");
return get_left_span(firstelem->val.node);
}
}
else if (isast_node[nkind]) {
astptr = node->links.subast;
first = -1;
if (astptr[0] != opt_node && astptr[0] != (struct ast *)0)
first = 0;
else if (N_AST2_DEFINED(nkind)) {
if (astptr[1] != opt_node && astptr[1] != (struct ast *)0)
first = 1;
else if (N_AST3_DEFINED(nkind)) {
if (astptr[2] != opt_node && astptr[2] != (struct ast *)0)
first = 2;
else if (N_AST4_DEFINED(nkind)) {
if (astptr[3] != opt_node && astptr[3] != (struct ast *)0)
first = 3;
}
}
}
if (first >= 0)
return get_left_span(astptr[first]);
else {
printf("node kind %d\n",nkind);
chaos("get_left_span: all ast's are opt_node");
}
}
else printf("get_left_span: bad node kind %d\n",nkind);
chaos("get_left_span");
return (struct tok_loc *)0;
}
struct tok_loc *get_right_span(struct ast *node) /*;get_right_span*/
{
short nkind,last,length=1;
struct ast **astptr;
struct two_pool *lastelem;
nkind = node->kind;
if (is_terminal_node(nkind)) {
if (isval_node[nkind])
/* as_null, as_null_s, as_others, as_others_choice
* have no N_VAL field defined
*/
length = strlen(namelist(node->links.val));
return (make_span(node->span.line, node->span.col+length-1));
}
else if (nkind == AS_OPT)
return (&node->span);
else if (nkind == AS_EXIT) {
if (node->links.subast[1] != opt_node)
return get_right_span(node->links.subast[1]);
else if (node->links.subast[0] != opt_node)
return get_right_span(node->links.subast[0]);
else return get_right_span(node->links.subast[3]);
}
else if (nkind == AS_RETURN) {
if (node->links.subast[0] != opt_node)
return get_right_span(node->links.subast[0]);
else return get_right_span(node->links.subast[3]);
}
else if (nkind == AS_RAISE) {
if (node->links.subast[0] != opt_node)
return get_right_span(node->links.subast[0]);
else return get_right_span(node->links.subast[1]);
}
else if (nkind == AS_OTHERS_CHOICE) {
if (node->links.subast[1] != opt_node)
return get_right_span(node->links.subast[1]);
else if (node->links.subast[0] != opt_node)
return get_right_span(node->links.subast[0]);
else return get_right_span(node->links.subast[2]);
}
else if (islist_node[nkind]) {
if (node->links.list==NULL) /* only for parser */
return (&node->span);
else {
lastelem = node->links.list;
#ifdef TODO
-- this finds next element in list. we need to search backwards !!!
while ((lastelem)->val.node == opt_node) {
lastelem = lastelem->link; /* last list element */
if (lastelem == node->links.list)
chaos("get_right_span: all list elements opt_node");
}
#endif
if (lastelem->val.node == opt_node)
chaos("get_right_span: list element opt_node");
return get_right_span((lastelem)->val.node);
}
}
else if (isast_node[nkind]) {
astptr = node->links.subast;
if (N_AST4_DEFINED(nkind) && astptr[3] != opt_node
&& astptr[3] != (struct ast *)0)
last = 3;
else if (N_AST3_DEFINED(nkind) &&
astptr[2] != opt_node && astptr[2] != (struct ast *)0)
last = 2;
else if (N_AST2_DEFINED(nkind) &&
astptr[1] != opt_node && astptr[1] != (struct ast *)0)
last = 1;
else if (astptr[0] == opt_node && astptr[0] == (struct ast *)0)
chaos("get_right_span: all ast's are opt_node");
else last = 0;
return get_right_span(astptr[last]);
}
else printf("get_right_span: bad node kind %d\n",nkind);
chaos("get_right_span");
return (struct tok_loc *)0;
}
struct tok_loc *make_span(short line, short col) /*;make_span*/
{
struct tok_loc *tok;
tok = (struct tok_loc *) emalloc(sizeof(struct tok_loc));
tok->line = line;
tok->col = col;
return (tok);
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.