?? main.c
字號(hào):
#include <stdio.h>
#include <string.h>
#include "yy.tab.h"
#define heapsize 100
#define linemax 1000
extern char * yytext;
extern FILE *yyin,*yyout;
extern int int_k_count;//當(dāng)前整型變量個(gè)數(shù)
extern int string_k_count;//當(dāng)前字符串變量個(gè)數(shù)
extern int int_k;//當(dāng)前整型變量深度
extern int string_k;//當(dāng)前字符串變量深度
extern int result_heap_k;//boolresult堆棧指針
extern int lineno;
extern int current_bool_result ;//當(dāng)前bool值
extern boolresultheap boolresult[heapsize];//bool堆棧
extern int outlineno;//
extern int strlines;//字符串常量總函數(shù)
extern int hangupprocline;//用戶掛機(jī)流程行
extern int onhookline ;//坐席掛機(jī)流程行
extern int offhookline ;//坐席摘機(jī)流程行
extern int usercallinline ;//用戶呼入流程行
extern int userhangupline ;//坐席掛機(jī)流程行
extern int agentdigitline;//坐席按鍵流程行
extern int agenteventprocline ;
extern int waiteventprocline ;
extern int interserviceline;
extern ststringheap vstringheap[heapsize];//存放字符串變量表
extern stintheap vintheap[heapsize];//存放整型變量表
extern stconstant constant[CONSTANTSIZE];//存放整型變量表
extern int sectioncount;
int ofiletype =2;
int flowtype = 0;//user flow
extern int errcount;
char nop[100]="10000";
char *filename;
FILE *dumpfile;
int gosssss =0;//行代號(hào)計(jì)數(shù)
char szgosssss[100];//行代號(hào)
char szgo1[100];//
char szgo2[100];
char szswitchend[100];
int newstmt = 1;
stlineinfo lineinfo[linemax];//堆棧,可以存放1000個(gè)行變量
stlinevar linevar[linemax];//堆棧
int lineinfopoint = 0;//堆棧指針
int linevarpoint = 0;//堆棧指針
int constantpoint = 0;
int yywrap()
{
return 1;
}
void yyerror(char *s)
{
printf("%s(%d): syntax error: symbol '%s' near \n",filename,lineno,yytext);
errcount ++;
}
void inittable(void)
{
int i=0;
//可以存放100個(gè)變量,似乎小了點(diǎn)
for(;i<heapsize;i++)
{
//初始化字符串變量表,k是指這個(gè)變量所在深度,流程級(jí)變量k=0,k越大,k作用范圍越小
vstringheap[i].string_k=-2;
sprintf(vstringheap[i].string_name,"%s","");
sprintf(vstringheap[i].string_value,"%s","");
sprintf(vintheap[i].int_name,"%s","");
vintheap[i].int_value=-1;//整型變量初始化-1
vintheap[i].int_k=-2;
}
for(i=0;i<linemax;i++)
{
lineinfo[i].lineno=-1;
sprintf(lineinfo[i].gooooo,"%s","");
}
addstringtable("$sys_dtmf");
addstringtable("$sys_caller");
addstringtable("$sys_callee");
addinttable("$sys_dialoutresult");
addinttable("$sys_channo");
addinttable("$sys_ipline");
addstringtable("$sysdb_callermobile");
addstringtable("$sysdb_calledmobile");
addinttable("$sysdb_ordertype");
addstringtable("$sysdb_songid");
addstringtable("$sysdb_datetime");
addstringtable("$sysdb_leaveword");
addstringtable("$sysdb_smsmsg");
addinttable("$sysdb_dialcount");
addinttable("$sysdb_flag");
addinttable("$sysdb_sex");
addstringtable("$sysdb_name");
addstringtable("$sysdb_smscode");
addinttable("$sysdb_feevalue");
addstringtable("$sysdb_smssender");
addinttable("$sysdb_exfeevalue");
addstringtable("$sysdb_linkid");
addstringtable("$sysdb_servicetype");
addstringtable("$sysdb_exservicetype");
addstringtable("$sysdb_companyid");
addstringtable("$sysdb_subflow");
addstringtable("$sysdb_accessno");
addstringtable("$sysdb_privatedata");
addstringtable("$sys_agentid");
addstringtable("$sys_usernum");
addinttable("$sys_lineno");
addinttable("$sys_agentlevel");
addinttable("$sys_confno");
addinttable("$sys_linestate");
addinttable("$sys_callintype");
addstringtable("$sysdb_displaymobile");
addstringtable("$sys_oricallee");
addinttable("$sys_sublevel");
addinttable("$sys_hangupcode");
}
void initconstanttable(void)
{
int i=0;
//可以存放100個(gè)變量,似乎小了點(diǎn)
//playfile
strcpy(constant[i].constant_name,"PF_INDEX");
constant[i++].constant_value=1;
strcpy(constant[i].constant_name,"PF_LIST");
constant[i++].constant_value=2;
strcpy(constant[i].constant_name,"PF_IDLE");
constant[i++].constant_value=3;
strcpy(constant[i].constant_name,"PF_NDTMF");
constant[i++].constant_value=4;
strcpy(constant[i].constant_name,"PF_TTS");
constant[i++].constant_value=5;
//agentplayring
strcpy(constant[i].constant_name,"APR_RING");
constant[i++].constant_value=1;
strcpy(constant[i].constant_name,"APR_BUSY");
constant[i++].constant_value=2;
//confplayfile
strcpy(constant[i].constant_name,"CPF_PLAYFILE");
constant[i++].constant_value=1;
strcpy(constant[i].constant_name,"CPF_ADJUSTVOLUME");
constant[i++].constant_value=2;
//sendanc
strcpy(constant[i].constant_name,"SA_CHARGEANC");
constant[i++].constant_value=1;
strcpy(constant[i].constant_name,"SA_UNCHARGEANC");
constant[i++].constant_value=2;
strcpy(constant[i].constant_name,"SA_UNCHARGEACM");
constant[i++].constant_value=3;
strcpy(constant[i].constant_name,"SA_CHARGEACM");
constant[i++].constant_value=4;
//joinconf
strcpy(constant[i].constant_name,"JC_SPEAKREQ");
constant[i++].constant_value=1;
strcpy(constant[i].constant_name,"JC_LISTENREQ");
constant[i++].constant_value=2;
//getnowtime
strcpy(constant[i].constant_name,"GNT_SHORTFORMAT");
constant[i++].constant_value=1;
strcpy(constant[i].constant_name,"GNT_LONGFORMAT");
constant[i++].constant_value=2;
//datediff
strcpy(constant[i].constant_name,"DD_YEAR");
constant[i++].constant_value=1;
strcpy(constant[i].constant_name,"DD_MONTH");
constant[i++].constant_value=2;
strcpy(constant[i].constant_name,"DD_DAY");
constant[i++].constant_value=3;
strcpy(constant[i].constant_name,"DD_HOUR");
constant[i++].constant_value=4;
strcpy(constant[i].constant_name,"DD_MINUTE");
constant[i++].constant_value=5;
strcpy(constant[i].constant_name,"DD_SECOND");
constant[i++].constant_value=6;
//dialout result
strcpy(constant[i].constant_name,"DIALOUT_SUCCESS");
constant[i++].constant_value=1;
strcpy(constant[i].constant_name,"DIALOUT_FAILED");
constant[i++].constant_value=0;
strcpy(constant[i].constant_name,"INFINITE");
constant[i++].constant_value=86400;
constantpoint = i;
}
void inboolresult(int i)
{
//bool值進(jìn)棧,szgo1是bool值真跳轉(zhuǎn)行,szgo2是bool值假挑戰(zhàn)行
//printf(yyout,"inboolresult %d,%s %s \n", i,szgo1,szgo2);
boolresult[result_heap_k].bool_result=i;
strcpy(boolresult[result_heap_k].szgo1,szgo1);
strcpy(boolresult[result_heap_k].szgo2,szgo2);
dump(i);
result_heap_k++;
}
int outboolresult()
{
//bool值出棧,szgo1是bool值真跳轉(zhuǎn)行,szgo2是bool值假挑戰(zhàn)行
result_heap_k--;
if(result_heap_k<0)
printf("result_heap error!\n");
strcpy(szgo1,boolresult[result_heap_k].szgo1);
strcpy(szgo2,boolresult[result_heap_k].szgo2);
//printf(yyout,"outboolresult %d %s %s \n", boolresult[result_heap_k].bool_result,szgo1,szgo2);
dumpout(boolresult[result_heap_k].bool_result);
return boolresult[result_heap_k].bool_result;
}
void setboolresult(int i)
{
current_bool_result = i;
if(i==0)
{
fprintf(dumpfile,"設(shè)置當(dāng)前boolresult值 0 name = state \n");
}
if(i==1)
{
fprintf(dumpfile,"設(shè)置當(dāng)前boolresult值 1 name = init \n");
}
if(i==2)
{
fprintf(dumpfile,"設(shè)置當(dāng)前boolresult值 2 name = proc \n");
}
if(i==3)
{
fprintf(dumpfile,"設(shè)置當(dāng)前boolresult值 3 name = if \n");
}
if(i==4)
{
fprintf(dumpfile,"設(shè)置當(dāng)前boolresult值 4 name = elseif\n ");
}
if(i==5)
{
fprintf(dumpfile,"設(shè)置當(dāng)前boolresult值 5 name = else\n ");
}
if(i==6)
{
fprintf(dumpfile,"設(shè)置當(dāng)前boolresult值 6 name = switch\n ");
}
if(i==8)
{
fprintf(dumpfile,"設(shè)置當(dāng)前boolresult值 8 name = case \n");
}
if(i==9)
{
fprintf(dumpfile,"設(shè)置當(dāng)前boolresult值 9 name = default \n");
}
}
void increasevarheap()
{
//增加字符串和整型變量深度,一般是遇到{符號(hào)時(shí)處理
string_k++;
int_k++;
}
void decreasevarheap()
{
//減小字符串和整型變量深度,一般是遇到}符號(hào)時(shí)處理,并且除去這個(gè)深度所定義的變量
dropinttable();
dropstringtable();
string_k--;
int_k--;
}
//return 0 no find return 1 find in inttable,return 2 find in stringtable
//這個(gè)函數(shù)不僅查找字符串變量,還查找整型變量
int lookstringtable(char *s)
{
int i=0;
for(;i<heapsize;i++)
{
if(vstringheap[i].string_k!=-2 && vstringheap[i].string_k<=string_k)
{
if(strcmp(vstringheap[i].string_name,s)==0)
{
return 2;
}
}
else
{ break;
}
}
i=0;
for(;i<heapsize;i++)
{
if(vintheap[i].int_k!=-2 && vintheap[i].int_k<=int_k)
{
if(strcmp(vintheap[i].int_name,s)==0)
{
return 1;
}
}
else
{ break;
}
}
return 0;
}
int lookinttable(char *iname)
{
return lookstringtable(iname);
}
int lookconstanttable(char *s)
{
int i=0;
for(;i<constantpoint;i++)
{
// printf("check %s \n",constant[i].constant_name);
if(strcmp(constant[i].constant_name,s)==0)
{
// printf("%s found \n",constant[i].constant_name);
return constant[i].constant_value;
}
}
return -100;
}
//增加一個(gè)字符串變量
int addstringtable(char*s)
{
if(string_k_count>=heapsize-1)
{
printf("heapsize over off \n");
return 0;
}
vstringheap[string_k_count].string_k=string_k;
sprintf(vstringheap[string_k_count].string_name,"%s",s);
string_k_count++;
return 1;
}
int addinttable(char *iname)
{
if(int_k_count>=heapsize-1)
{
printf("heapsize over off \n");
return 0;
}
vintheap[int_k_count].int_k=int_k;
sprintf(vintheap[int_k_count].int_name,"%s",iname);
int_k_count++;
return 1;
}
int updatestringtable(char*s,char*v)
{
int i=0;
for(;i<heapsize;i++)
{
if(vstringheap[i].string_k!=-1 && vstringheap[i].string_k<=string_k)
{
if(strcmp(vstringheap[i].string_name,s)==0)//found
{
sprintf(vstringheap[i].string_value,"%s",v);
return 1;
}
}
else
{
break;
}
}
return 0; //no define
}
int updateinttable(char*s,int ivalue)
{
int i=0;
for(;i<heapsize;i++)
{
if(vintheap[i].int_k!=-1 && vintheap[i].int_k<=int_k)
{
if(strcmp(vintheap[i].int_name,s)==0)//found
{
vintheap[i].int_value=ivalue;
return 1;
}
}
else
{
break;
}
}
return 0; //no define
}
void dropinttable()
{
int i=0;
for(;i<heapsize;i++)
{
if( vintheap[i].int_k==int_k)
{
int_k_count --;
vintheap[i].int_k = -1;
sprintf(vintheap[i].int_name,"%s","");
vintheap[i].int_value=-1;
}
}
}
//刪除string_k這個(gè)深度的字符串變量
void dropstringtable()
{
int i=0;
for(;i<heapsize;i++)
{
if( vstringheap[i].string_k==string_k)
{
string_k_count --;
vstringheap[i].string_k = -1;
sprintf(vstringheap[i].string_name,"%s","");
sprintf(vstringheap[i].string_value,"%s","");
}
}
}
//lineinfo行信息表
/*
dump lineinfo列表:大小69
lineno gooooo
80 go00007
83 m_menu
85 go00003
89 go00008
89 go00009
92 m_menu
*/
void addlineinfotable(char *s,int lineno)
{
lineinfo[lineinfopoint].lineno = lineno;
sprintf(lineinfo[lineinfopoint].gooooo,"%s",s);
lineinfopoint ++;
}
/*
dump linevar列表:大小50
gooooo line
m_mainproc 49
go00001 59
go00002 63
go00004 72
go00005 77
go00006 81
go00007 86
go00008 90
go00009 95
go00010 99
go00011 104
go00012 108
*/
void addlinevartable(char*s)
{
int i = 0;
for(i=0;i<linevarpoint;i++)
{
if(strcmp(linevar[i].gooooo,s)==0)
{
printf("%s(%d): syntax error: identifier '%s' \n",filename,lineno,s);
errcount ++;
}
}
sprintf(linevar[linevarpoint].gooooo,"%s",s);
linevar[linevarpoint].lineno = outlineno-1;
linevarpoint ++;
}
//生成行代號(hào)
void fgosssss(void)
{
gosssss++;
if(gosssss<10)
sprintf(szgosssss,"go0000%d",gosssss);
else if(gosssss<100)
sprintf(szgosssss,"go000%d",gosssss);
else if(gosssss<1000)
sprintf(szgosssss,"go00%d",gosssss);
else if(gosssss<10000)
sprintf(szgosssss,"go0%d",gosssss);
else if(gosssss<100000)
sprintf(szgosssss,"go%d",gosssss);
//addlineinfotable(szgosssss);
// fprintf(yyout," CREATE %s \n",szgosssss);
}
//if語句需要兩個(gè)行代號(hào)
void ifgo()
{
fgosssss();
sprintf(szgo1,"%s",szgosssss);
fgosssss();
sprintf(szgo2,"%s",szgosssss);
if(ofiletype==1)
{
fprintf(yyout,"%5d:%10s\t%s\t%s\n",outlineno++,looktokentable(RESULT),szgo1,szgo2);
fprintf(yyout,"%5d:%s\n",outlineno++,szgo1);
}
else
{
outlineno++,
fprintf(yyout,"%5d:\t%5d\t%s\t%s\n",outlineno,RESULT,szgo1,szgo2);
outlineno++;
fprintf(yyout,"%5d:\t%5s\n",outlineno,nop);
}
addlinevartable(szgo1);//現(xiàn)在可以確定szgo1行,就是下一行 szgo1是if語句真所執(zhí)行的行,szgo2假,現(xiàn)在還不知道,需要在rightkgo前才知道
addlineinfotable(szgo1,outlineno-2);//outlineno-2是szgo1行代號(hào)所在行
addlineinfotable(szgo2,outlineno-2);//outlineno-2是szgo2行代號(hào)所在行
}
//elseif語句需要兩個(gè)行代號(hào)
void elseifgo2()
{
fgosssss();
sprintf(szgo1,"%s",szgosssss);
fgosssss();
sprintf(szgo2,"%s",szgosssss);
if(ofiletype==1)
{
fprintf(yyout,"%5d:%10s\t%s\t%s\n",outlineno++,looktokentable(TESTIF),szgo1,szgo2);
fprintf(yyout,"%5d:%s\n",outlineno++,szgo1);
}
else
{
outlineno++;
fprintf(yyout,"%5d:\t%5d\t%s\t%s\n",outlineno,TESTIF,szgo1,szgo2);
outlineno++;
fprintf(yyout,"%5d:\t%5s\n",outlineno,nop);
}
addlinevartable(szgo1);
addlineinfotable(szgo1,outlineno-2);
addlineinfotable(szgo2,outlineno-2);
}
//elsesf語句需要兩個(gè)行代號(hào)
void elsesfgo2()
{
fgosssss();
sprintf(szgo1,"%s",szgosssss);
fgosssss();
sprintf(szgo2,"%s",szgosssss);
if(ofiletype==1)
{
fprintf(yyout,"%5d:%10s\t%s\t%s\n",outlineno++,looktokentable(TESTSF),szgo1,szgo2);
fprintf(yyout,"%5d:%s\n",outlineno++,szgo1);
}
else
{
outlineno++;
fprintf(yyout,"%5d:\t%5d\t%s\t%s\n",outlineno,TESTSF,szgo1,szgo2);
outlineno++;
fprintf(yyout,"%5d:\t%5s\n",outlineno,nop);
}
addlinevartable(szgo1);
addlineinfotable(szgo1,outlineno-2);
addlineinfotable(szgo2,outlineno-2);
}
//else語句需要一個(gè)行代號(hào)
void elsego()
{
fgosssss();
sprintf(szgo1,"%s",szgosssss);
if(ofiletype==1)
fprintf(yyout,"%5d:%10s\t%s\n",outlineno++,looktokentable(NELSE),szgo1);
else
{
outlineno++;
fprintf(yyout,"%5d:\t%5d\t%s\n",outlineno,NELSE,szgo1);
}
addlineinfotable(szgo1,outlineno-1);
}
void rightkgo()
{
if(ofiletype==1)
{
fprintf(yyout,"%5d:%s\n",outlineno++,szgo2);
}
else
{
outlineno++;
fprintf(yyout,"%5d:\t%5s\n",outlineno,nop);
}
addlinevartable(szgo2);
//addlineinfotable(szgo2);
}
void elserightkgo() //
{
if(ofiletype==1)
{
fprintf(yyout,"%5d:%10s\n",outlineno++,szgo1);
}
else
{
outlineno++;
fprintf(yyout,"%5d:\t%5s\n",outlineno,nop);
}
// fprintf(yyout,"%5d:%10s\n",outlineno++,szgo1);
sprintf(linevar[linevarpoint].gooooo,"%s",szgo1);
addlinevartable(szgo1);
// addlineinfotable(szgo1);
}
void elseleftkgo()
{
//else
//{
}
void leftkgo()
{
if(ofiletype==1)
{
fprintf(yyout,"%5d:%s\n",outlineno++,szgo1);
}
else
{
outlineno++;
fprintf(yyout,"%5d:\t%5s\n",outlineno,nop);
}
addlinevartable(szgo1);
// addlineinfotable(szgo1);
}
void icrmheap()
{
if(ofiletype==1)
fprintf(yyout,"%5d:%10s\n",outlineno++,looktokentable(ICHEAP));
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -