📄 mod_yacc.y
字号:
%{ /* $Id: mod_yacc.y,v 1.21 91/12/19 13:37:37 bill Exp $ *//*============================================================================FILE mod_yacc.yMEMBER OF process cmppCopyright 1991Georgia Tech Research CorporationAtlanta, Georgia 30332All Rights ReservedPROJECT A-8503AUTHORS 9/12/91 Steve TynorMODIFICATIONS <date> <person name> <nature of modifications>SUMMARY This file contains a BNF specification of the translation of cfunc.mod files to cfunc.c files, together with various support functions.INTERFACES mod_yyparse() - Function 'yyparse()' is generated automatically by UNIX 'yacc' utility and then converted to 'mod_yyparse()' by UNIX 'sed' utility under direction of Makefile.REFERENCED FILES mod_lex.lNON-STANDARD FEATURES Names of functions generated by 'yacc' are translated by 'sed' under direction of the Makefile to prevent collisions with functions generated from ifs_yacc.y.============================================================================*/#include <assert.h>#include <stdio.h>#include "mod_yacc.h"Ifs_Table_t *mod_ifs_table;extern char yytext[];extern FILE* yyout;extern char *strdup(char*);extern int strlen(char*);extern char *strcat(char*, char*);int mod_num_errors;#define BUFFER_SIZE 3000static char buffer [BUFFER_SIZE];static int buf_len; typedef enum {CONN, PARAM, STATIC_VAR} Id_Kind_t;/*--------------------------------------------------------------------------*/static char *subscript (Sub_Id_t sub_id){ if (sub_id.has_subscript) { return sub_id.subscript; } else { return "0"; }}/*--------------------------------------------------------------------------*/int strcmpi(s, t) char *s; char *t; /* string compare - case insensitive */{ for (; *s && t && tolower(*s) == tolower(*t); s++, t++); if (*s && !*t) { return 1; } if (!*s && *t) { return -1; } if (! (*s || *t)) { return 0; } return (tolower(*s) - tolower(*t));}/*---------------------------------------------------------------------------*/static void put_type (FILE *fp, Data_Type_t type){ char ch; switch (type) { case INTEGER: ch = 'i'; break; case REAL: ch = 'r'; break; case COMPLEX: ch = 'c'; break; case BOOLEAN: ch = 'b'; break; case STRING: ch = 's'; break; case POINTER: ch = 'p'; break; } fprintf (fp, ".%cvalue", ch);}/*---------------------------------------------------------------------------*/static void put_conn_type (FILE *fp, Port_Type_t type){ char ch; switch (type) { case USER_DEFINED: ch = 'p'; break; case DIGITAL: ch = 'p'; break; default: ch = 'r'; break; } fprintf (fp, ".%cvalue", ch);}/*---------------------------------------------------------------------------*/static void check_dir (int conn_number, Dir_t dir, char *context){ Dir_t conn_dir; if (conn_number >= 0) { /* * If negative, this is an invalid port ID and we've already issued * an error. */ conn_dir = mod_ifs_table->conn[conn_number].direction; if ((conn_dir != dir) && (conn_dir != INOUT)) { char error_str[200]; sprintf (error_str, "Direction of port `%s' in %s() is not %s or INOUT", mod_ifs_table->conn[conn_number].name, context, (dir == IN) ? "IN" : "OUT"); yyerror (error_str); mod_num_errors++; } }}/*---------------------------------------------------------------------------*/static void check_subscript (Boolean_t formal, Boolean_t actual, Boolean_t missing_actual_ok, char *context, char *id){ char error_str[200]; if ((formal && !actual) && !missing_actual_ok) { sprintf (error_str, "%s `%s' is an array - subscript required", context, id); yyerror (error_str); mod_num_errors++; return; } else if (!formal && actual) { sprintf (error_str, "%s `%s' is not an array - subscript prohibited", context, id); yyerror (error_str); mod_num_errors++; return; }}/*---------------------------------------------------------------------------*/static int check_id (Sub_Id_t sub_id, Id_Kind_t kind, Boolean_t do_subscript){ int i; char error_str[200]; switch (kind) { case CONN: for (i = 0; i < mod_ifs_table->num_conn; i++) { if (0 == strcmpi (sub_id.id, mod_ifs_table->conn[i].name)) { if (do_subscript) { check_subscript (mod_ifs_table->conn[i].is_array, sub_id.has_subscript, FALSE, "Port", sub_id.id); } return i; } } break; case PARAM: for (i = 0; i < mod_ifs_table->num_param; i++) { if (0 == strcmpi (sub_id.id, mod_ifs_table->param[i].name)) { if (do_subscript) { check_subscript (mod_ifs_table->param[i].is_array, sub_id.has_subscript, FALSE, "Parameter", sub_id.id); } return i; } } break; case STATIC_VAR: for (i = 0; i < mod_ifs_table->num_inst_var; i++) { if (0 == strcmpi (sub_id.id, mod_ifs_table->inst_var[i].name)) { if (do_subscript) { check_subscript (mod_ifs_table->inst_var[i].is_array, sub_id.has_subscript, TRUE, "Static Variable", sub_id.id); } return i; } } break; } sprintf (error_str, "No %s named `%s'", ((kind==CONN) ? "port" : ((kind==PARAM) ? "parameter" :"static variable")), sub_id.id); yyerror (error_str); mod_num_errors++; return -1;}/*---------------------------------------------------------------------------*/static int valid_id (Sub_Id_t sub_id, Id_Kind_t kind){ return check_id (sub_id, kind, FALSE);}/*---------------------------------------------------------------------------*/static int valid_subid (Sub_Id_t sub_id, Id_Kind_t kind){ return check_id (sub_id, kind, TRUE);}/*---------------------------------------------------------------------------*/static init_buffer (){ buf_len = 0; buffer[0] = '\0';}/*---------------------------------------------------------------------------*/static append (char *str){ int len = strlen (str); if (len + buf_len > BUFFER_SIZE) { yyerror ("Buffer overflow - try reducing the complexity of CM-macro array subscripts"); exit (1); } (void)strcat (buffer,str);}%}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -