📄 cmmyacc.c
字号:
/****************************************************************************
* U N R E G I S T E R E D C O P Y
*
* You are on day 105 of your 30 day trial period.
*
* This file was produced by an UNREGISTERED COPY of Parser Generator. It is
* for evaluation purposes only. If you continue to use Parser Generator 30
* days after installation then you are required to purchase a license. For
* more information see the online help or go to the Bumble-Bee Software
* homepage at:
*
* http://www.bumblebeesoftware.com
*
* This notice must remain present in the file. It cannot be removed.
****************************************************************************/
/****************************************************************************
* cmmyacc.c
* C source file generated from cmmyacc.y.
*
* Date: 06/26/06
* Time: 19:14:11
*
* AYACC Version: 2.07
****************************************************************************/
#include <yypars.h>
/* namespaces */
#if defined(__cplusplus) && defined(YYSTDCPPLIB)
using namespace std;
#endif
#if defined(__cplusplus) && defined(YYNAMESPACE)
using namespace yl;
#endif
#define YYFASTPARSER
/* repeated because of possible precompiled header */
#include <yypars.h>
/* namespaces */
#if defined(__cplusplus) && defined(YYSTDCPPLIB)
using namespace std;
#endif
#if defined(__cplusplus) && defined(YYNAMESPACE)
using namespace yl;
#endif
#define YYFASTPARSER
#include ".\cmmyacc.h"
#line 5 ".\\cmmyacc.y"
/****************************************************************************
cmmyacc.y
ParserWizard generated YACC file.
Author: Jinde Wang
Date: 2006年6月26日
****************************************************************************/
#include "code.h"
#include "cmmlex.h"
#include "types.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define YYSTYPE TreeNode*
int nError = 0; /* 记录错误号 */
static int hasReturn = 0; /* 标志程序中有无return语句 */
static TableNode* tableHead = NULL; /* 符号表头结点 */
static TreeNode* treeHead = NULL; /* 语法树头结点 */
static indentno = 0; /* 打印语法树时的缩进 */
static char* tempToken[64]; /* 保存临时Token名 */
static int tempno[64]; /* 保存对应的Token对应的行号 */
static int top = -1; /* 上面两个数组中的当前下标,实现堆栈功能 */
char tokenString[255]; /* 当前Token名 */
int lineno = 1; /* 当前行号 */
/* 查询符号表,返回数据类型,查不到,返加VoidT */
int lookup(char* name)
{
TableNode* p = tableHead;
while (p != NULL)
{
if (strcmp(p->name, name) == 0)
{
return p->eType;
}
p = p->next;
}
return VoidT;
}
/* 插入到符号表,成功返回1,否则返回0 */
int insert(char* name, int a)
{
TableNode* p;
if (lookup(name) != VoidT)
{
return 0;
}
p = (TableNode*)malloc(sizeof(TableNode));
if (p == NULL)
{
printf("ERROR %d: Malloc--Out of memory.\n", ++nError);
exit(-1);
}
strcpy(p->name, name);
p->eType = a;
p->next = tableHead;
tableHead = p;
return 1;
}
/* 打印出符号表到文件 */
void printTable(TableNode* table, FILE* pf)
{
while (table != NULL)
{
fprintf(pf, " %s ", table->name);
switch (table->eType)
{
case IntT:
fprintf(pf, "IntT\n");
break;
case VoidT:
fprintf(pf, "VoidT\n");
break;
default:
fprintf(pf, "Not identified type\n");
break;
}
table = table->next;
}
}
/* 创建新的表达式结点,返回指向结点的指针 */
TreeNode* newExpNode(ExpKind kind)
{
TreeNode* t = (TreeNode*)malloc(sizeof(TreeNode));
int i;
if (t == NULL)
{
printf("Error %d: Malloc--Out of memory.\n", ++nError);
return NULL;
}
for (i=0; i<MAXCHILDREN; i++)
{
t->child[i] = NULL;
}
t->sibling = NULL;
t->nodekind = ExpK;
t->kind.stmt = kind;
t->lineno = lineno;
t->type = VoidT;
return t;
}
/* 创建新的语句结点,返回指向结点的指针 */
TreeNode* newStmtNode(StmtKind kind)
{
TreeNode* t = (TreeNode*)malloc(sizeof(TreeNode));
int i;
if (t == NULL)
{
printf("ERROR %d: Malloc--Out of memory.\n", ++nError);
return NULL;
}
for (i=0; i<MAXCHILDREN; i++)
{
t->child[i] = NULL;
}
t->sibling = NULL;
t->nodekind = StmtK;
t->kind.stmt = kind;
t->lineno = lineno;
return t;
}
/* 拷备字符串,返回新创建的字符串的指针 */
char* copyString(char* s)
{
int n;
char * t;
if (s == NULL)
{
return NULL;
}
n = strlen(s)+1;
t = (char*)malloc(n);
if (t == NULL)
{
printf("ERROR %d: Malloc--Out of memory.\n", ++nError);
return NULL;
}
strcpy(t, s);
return t;
}
/* 打印一个语法树结点到文件中 */
void printToken(TokenType token, const char* tokenString, FILE* pf)
{
switch (token)
{
case RETURN:
case INPUT:
case OUTPUT:
fprintf(pf, "reserved word: %s\n", tokenString);
break;
case ASSIGN: fprintf(pf, "=\n"); break;
case SLB: fprintf(pf, "(\n"); break;
case SRB: fprintf(pf, ")\n"); break;
case SEMI: fprintf(pf, ";\n"); break;
case PLUS: fprintf(pf, "+\n"); break;
case MINUS: fprintf(pf, "-\n"); break;
case MULT: fprintf(pf, "*\n"); break;
case DIV: fprintf(pf, "/\n"); break;
case NUM:
fprintf(pf, "NUM, val= %s\n",tokenString);
break;
case ID:
fprintf(pf, "ID, name= %s\n",tokenString);
break;
case ERROR:
fprintf(pf, "ERROR: %s\n",tokenString);
break;
default: /* should never happen */
fprintf(pf, "Unknown token: %d\n", token);
}
}
/* 打印空格到文件中 */
static void printSpaces(FILE* pf)
{
int i;
for (i=0; i<indentno; i++)
{
fprintf(pf, " ");
}
}
/* 打印语法树到文件中,前序遍历,子结点比父结点缩进两格 */
void printTree(TreeNode* tree, FILE* pf)
{
int i;
indentno += 2; /* 缩进加2 */
while (tree != NULL)
{
printSpaces(pf); /* 打印空格 */
if (tree->nodekind == StmtK)
{
switch (tree->kind.stmt)
{
case ReturnK: /* 返回语句 */
fprintf(pf, "ReturnK\n");
break;
case AssignK: /* 赋值语句 */
fprintf(pf, "Assign to: %s\n",tree->attr.name);
break;
case InputK: /* 输入语句 */
fprintf(pf, "Input\n");
break;
case OutputK: /* 输出语句 */
fprintf(pf, "Output\n");
break;
default:
fprintf(pf, "Unknown ExpNode kind\n");
break;
}
}
else if (tree->nodekind == ExpK)
{
switch (tree->kind.exp)
{
case OpK: /* 动算结点,包括加减乘除 */
fprintf(pf, "Op: ");
printToken(tree->attr.op,"\0", pf);
break;
case ConstK: /* 常数结点 */
fprintf(pf, "Const: %d\n",tree->attr.val);
break;
case IdK: /* 变量结点 */
fprintf(pf, "Id: %s\n",tree->attr.name);
break;
default:
fprintf(pf, "Unknown ExpNode kind\n");
break;
}
}
else
{
fprintf(pf, "Unknown node kind\n");
}
for (i=0; i<MAXCHILDREN; i++) /* 遍历子树 */
{
printTree(tree->child[i], pf); /* 递归 */
}
tree = tree->sibling; /* 转移到其兄弟树,即对应的下一条C语句 */
}
indentno -= 2; /* 缩进减2 */
}
#line 322 "cmmyacc.c"
#ifndef YYSTYPE
#define YYSTYPE int
#endif
#ifndef YYSTACK_SIZE
#define YYSTACK_SIZE 100
#endif
#ifndef YYSTACK_MAX
#define YYSTACK_MAX 0
#endif
/* (state) stack */
#if (YYSTACK_SIZE) != 0
static yystack_t YYNEAR yystack[(YYSTACK_SIZE)];
yystack_t YYFAR *YYNEAR YYDCDECL yysstackptr = yystack;
yystack_t YYFAR *YYNEAR YYDCDECL yystackptr = yystack;
#else
yystack_t YYFAR *YYNEAR YYDCDECL yysstackptr = NULL;
yystack_t YYFAR *YYNEAR YYDCDECL yystackptr = NULL;
#endif
/* attribute stack */
#if (YYSTACK_SIZE) != 0
static YYSTYPE YYNEAR yyattributestack[(YYSTACK_SIZE)];
#ifdef YYPROTOTYPE
void YYFAR *YYNEAR YYDCDECL yysattributestackptr = yyattributestack;
void YYFAR *YYNEAR YYDCDECL yyattributestackptr = yyattributestack;
#else
char YYFAR *YYNEAR YYDCDECL yysattributestackptr = (char YYFAR *) yyattributestack;
char YYFAR *YYNEAR YYDCDECL yyattributestackptr = (char YYFAR *) yyattributestack;
#endif
#else
#ifdef YYPROTOTYPE
void YYFAR *YYNEAR YYDCDECL yysattributestackptr = NULL;
void YYFAR *YYNEAR YYDCDECL yyattributestackptr = NULL;
#else
char YYFAR *YYNEAR YYDCDECL yysattributestackptr = NULL;
char YYFAR *YYNEAR YYDCDECL yyattributestackptr = NULL;
#endif
#endif
int YYNEAR YYDCDECL yysstack_size = (YYSTACK_SIZE);
int YYNEAR YYDCDECL yystack_size = (YYSTACK_SIZE);
int YYNEAR YYDCDECL yystack_max = (YYSTACK_MAX);
/* attributes */
YYSTYPE YYNEAR yyval;
YYSTYPE YYNEAR yylval;
#ifdef YYPROTOTYPE
void YYFAR *YYNEAR YYDCDECL yyvalptr = &yyval;
void YYFAR *YYNEAR YYDCDECL yylvalptr = &yylval;
#else
char YYFAR *YYNEAR YYDCDECL yyvalptr = (char *) &yyval;
char YYFAR *YYNEAR YYDCDECL yylvalptr = (char *) &yylval;
#endif
size_t YYNEAR YYDCDECL yyattribute_size = sizeof(YYSTYPE);
/* yyattribute */
#ifdef YYDEBUG
#ifdef YYPROTOTYPE
static YYSTYPE YYFAR *yyattribute1(int index)
#else
static YYSTYPE YYFAR *yyattribute1(index)
int index;
#endif
{
YYSTYPE YYFAR *p = &((YYSTYPE YYFAR *) yyattributestackptr)[yytop + index];
return p;
}
#define yyattribute(index) (*yyattribute1(index))
#else
#define yyattribute(index) (((YYSTYPE YYFAR *) yyattributestackptr)[yytop + (index)])
#endif
#ifdef YYDEBUG
#ifdef YYPROTOTYPE
static void yyinitdebug(YYSTYPE YYFAR **p, int count)
#else
static void yyinitdebug(p, count)
YYSTYPE YYFAR **p;
int count;
#endif
{
int i;
yyassert(p != NULL);
yyassert(count >= 1);
for (i = 0; i < count; i++) {
p[i] = &((YYSTYPE YYFAR *) yyattributestackptr)[yytop + i - (count - 1)];
}
}
#endif
#ifdef YYPROTOTYPE
void YYCDECL yyparseraction(int action)
#else
void YYCDECL yyparseraction(action)
int action;
#endif
{
switch (action) {
case 0:
{
#ifdef YYDEBUG
YYSTYPE YYFAR *yya[5];
yyinitdebug(yya, 5);
#endif
{
#line 291 ".\\cmmyacc.y"
treeHead = yyattribute(3 - 4);
#line 435 "cmmyacc.c"
}
}
break;
case 1:
{
#ifdef YYDEBUG
YYSTYPE YYFAR *yya[3];
yyinitdebug(yya, 3);
#endif
{
#line 301 ".\\cmmyacc.y"
if (insert(tokenString, IntT) == 0)
{
printf("ERROR %d: Line %d Duplicated definition.\n", ++nError, lineno);
}
#line 453 "cmmyacc.c"
}
}
break;
case 2:
{
#ifdef YYDEBUG
YYSTYPE YYFAR *yya[3];
yyinitdebug(yya, 3);
#endif
{
#line 311 ".\\cmmyacc.y"
YYSTYPE t = yyattribute(1 - 2);
if (t != NULL)
{
while (t->sibling != NULL)
{
t = t->sibling;
}
t->sibling = yyattribute(2 - 2);
yyval = yyattribute(1 - 2);
}
else
{
yyval = yyattribute(2 - 2);
}
#line 481 "cmmyacc.c"
}
}
break;
case 3:
{
#line 327 ".\\cmmyacc.y"
yyval = NULL;
#line 489 "cmmyacc.c"
}
break;
case 4:
{
#ifdef YYDEBUG
YYSTYPE YYFAR *yya[2];
yyinitdebug(yya, 2);
#endif
{
#line 330 ".\\cmmyacc.y"
yyval = yyattribute(1 - 1);
#line 501 "cmmyacc.c"
}
}
break;
case 5:
{
#ifdef YYDEBUG
YYSTYPE YYFAR *yya[2];
yyinitdebug(yya, 2);
#endif
{
#line 331 ".\\cmmyacc.y"
yyval = yyattribute(1 - 1);
#line 514 "cmmyacc.c"
}
}
break;
case 6:
{
#ifdef YYDEBUG
YYSTYPE YYFAR *yya[2];
yyinitdebug(yya, 2);
#endif
{
#line 332 ".\\cmmyacc.y"
yyval = yyattribute(1 - 1);
#line 527 "cmmyacc.c"
}
}
break;
case 7:
{
#ifdef YYDEBUG
YYSTYPE YYFAR *yya[2];
yyinitdebug(yya, 2);
#endif
{
#line 333 ".\\cmmyacc.y"
yyval = yyattribute(1 - 1);
#line 540 "cmmyacc.c"
}
}
break;
case 8:
{
#ifdef YYDEBUG
YYSTYPE YYFAR *yya[3];
yyinitdebug(yya, 3);
#endif
{
#line 336 ".\\cmmyacc.y"
yyval = yyattribute(1 - 2);
#line 553 "cmmyacc.c"
}
}
break;
case 9:
{
#ifdef YYDEBUG
YYSTYPE YYFAR *yya[2];
yyinitdebug(yya, 2);
#endif
{
#line 337 ".\\cmmyacc.y"
yyval = NULL;
#line 566 "cmmyacc.c"
}
}
break;
case 10:
{
#ifdef YYDEBUG
YYSTYPE YYFAR *yya[4];
yyinitdebug(yya, 4);
#endif
{
#line 341 ".\\cmmyacc.y"
yyval = newStmtNode(ReturnK);
yyval->child[0] = yyattribute(2 - 3);
hasReturn = 1;
#line 583 "cmmyacc.c"
}
}
break;
case 11:
{
#ifdef YYDEBUG
YYSTYPE YYFAR *yya[3];
yyinitdebug(yya, 3);
#endif
{
#line 348 ".\\cmmyacc.y"
yyval = yyattribute(1 - 2);
#line 596 "cmmyacc.c"
}
}
break;
case 12:
{
#ifdef YYDEBUG
YYSTYPE YYFAR *yya[4];
yyinitdebug(yya, 4);
#endif
{
#line 352 ".\\cmmyacc.y"
yyval = newStmtNode(InputK);
#line 611 "cmmyacc.c"
}
}
break;
case 13:
{
#ifdef YYDEBUG
YYSTYPE YYFAR *yya[6];
yyinitdebug(yya, 6);
#endif
{
#line 358 ".\\cmmyacc.y"
yyval = newStmtNode(OutputK);
yyval->child[0] = yyattribute(3 - 5);
#line 627 "cmmyacc.c"
}
}
break;
case 14:
{
#ifdef YYDEBUG
YYSTYPE YYFAR *yya[2];
yyinitdebug(yya, 2);
#endif
{
#line 364 ".\\cmmyacc.y"
yyval = yyattribute(1 - 1);
#line 640 "cmmyacc.c"
}
}
break;
case 15:
{
#ifdef YYDEBUG
YYSTYPE YYFAR *yya[2];
yyinitdebug(yya, 2);
#endif
{
#line 365 ".\\cmmyacc.y"
yyval = yyattribute(1 - 1);
#line 653 "cmmyacc.c"
}
}
break;
case 16:
{
#ifdef YYDEBUG
YYSTYPE YYFAR *yya[2];
yyinitdebug(yya, 2);
#endif
{
#line 369 ".\\cmmyacc.y"
tempToken[++top] = copyString(tokenString);
tempno[top] = lineno;
if (lookup(tokenString) == VoidT)
{
printf("ERROR %d: Line %d: ID %s is not defined.\n", ++nError, lineno, tokenString);
}
#line 673 "cmmyacc.c"
}
}
break;
case 17:
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -