?? 語法分析.txt
字號:
在這里我是寫了一個小程序?qū)崿F(xiàn)的自動生成分析表和規(guī)約函數(shù)。
LPCSTR LableName[]={ "ID","IF","ELSE","SWITCH","GOTO","RETURN","NUMBER","STRING","MAIN",
"ADD_OP","MUL_OP","ASSIGN_OP","CMP_OP","LOGIC_OP1","LOGIC_OP2",
"LPAREN","RPAREN","LBRACE","RBRACE","COLON","COMMA","SEMI",
"PROG","CPD_SMT","SMT_SEQ","LABLE","LB_SMT","SMT","CASE","CASES",
"NUMBERS","STRINGS","PAM_LIST","PRI_EXPR","POST_EXPR","MUL_EXPR","ADD_EXPR","CMP_EXPR","LOGIC_EXPR","EXPR","$END"
};
#define CNT (sizeof(LableName)/sizeof(LableName[0]))
char* getToken(char* &p){
while(*p){
if((*p==' ')||(*p=='\t')){
++p;
}else{
char *r=p;
while(*p){
if(('\n'==*p)||('\t'==*p)|| (' '==*p)){
*p=0;
++p;
break;
}else{
++p;
}
}
return r;
}
};
return NULL;
}
bool sm(LPCSTR s,LPCSTR d){
if(s&&d){
return 0==strcmp(s,d);
}
return false;
}
#define m(x) (sm(getToken(p),x))
void yy2ini(){
FILE* fp=fopen("lalr分析表.txt","r");
FILE* fpo=fopen("lalr.ini","w");
FILE* fp1=fopen("Rfun.c","w");
char tmp[4096];
while(fgets(tmp,4096,fp)){
char* p=tmp;
char* r=getToken(p);
int i;
if(sm(r,"state")){
r=getToken(p);
if(r)
{
i=atoi(r);
fprintf(fpo,"[S%d]\n",i);
}
}else if(sm(r,"rule")){
char* r1=getToken(p);
if(r1){
int n=atoi(r1);
char* tmp[1024];
int i=0;
r=getToken(p);
if(r)if(m("->")){
while(tmp[i]=getToken(p))++i;
fprintf(fp1,"//Rule[%d] %s -> ",n,r);
for(int j=0;j<i;++j)
fprintf(fp1,"%s ",tmp[j]);
fprintf(fp1,
"\nvoid Reduce%d(){\n",n);
for(int j=0;j<i;++j)
fprintf(fp1,
" assert(TokenStack[%d]->tokenType==%s);\n",-j-1,tmp[i-j-1]);
if(i>1)
fprintf(fp1,
" TokenStack.pop(%d);\n",i-1);
fprintf(fp1,
" TokenStack[-1]->tokenType=%s;\n"
" StateStack.pop(%d);\n"
"}\n\n",r,i);
}
}
}else{
char* r1=getToken(p);
if(sm(r1,"shift,"))
{
if(m("and")&&m("go")&&m("to")&&m("state")){
r1=getToken(p);
if(r1){
i=atoi(r1);
fprintf(fpo,"%s=S%d\n",r,i);
}
}
}else if(sm(r1,"go")){
if(m("to")&&m("state")){
r1=getToken(p);
if(r1){
i=atoi(r1);
fprintf(fpo,"%s=G%d\n",r,i);
}
}
}else if(sm(r1,"reduce"))//reduce using rule
{
if(m("using")&&m("rule")){
r1=getToken(p);
if(r1){
i=atoi(r1);
fprintf(fpo,"%s=R%d\n",r,i);
}
}
}
}
}
fclose(fp);
fclose(fpo);
fprintf(fp1,"typedef void REDUCE();\n"
"REDUCE* Reduce[]={\n");
for(int i=1;i<44;++i)
fprintf(fp1,"\t&Reduce%d,\n",i);
fprintf(fp1,"};\n");
fclose(fp1);
}
主程序(lalr分析)
void main(){
SCCompiler sc;
sc.init();
sc.open("test.sc");
StateStack.push(0);
TokenStack.push(new Token(START,0));
while(1)
try{
Token*p=sc.getToken();
// printf("Get %s @%d\n",LableName[p->tokenType],p->line);
rescan:
if((StateStack[ST_TOP]==80)&&p->tokenType==ENDOFSTREAM)
break;
uint32_t r=LalrTab[StateStack[ST_TOP]][p->tokenType&0xffff];
switch(r&0xf0000){
case SMASK:
TokenStack.push(p);
StateStack.push(r&0xffff);
break;
case RMASK:{
uint32_t id=r;
do{
id&=0xffff;
Reduce[id-1]();
id=LalrTab[StateStack[ST_TOP]][TokenStack[ST_TOP]->tokenType&0xffff];
}while(ISR(id));
if(ISG(id)){
StateStack.push(id&0xffff);
//StateStack[0]=(id&0xffff);
goto rescan;
}else
assert(false);
}
default:
assert(false);
}
}catch(int err){ printf("EOF %d",err);break; }
printf("Accept\n");
printf("StateStack %d\n",StateStack[ST_TOP]);
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -