编译原理 - 实验三 - 递归下降语法分析器的调试及扩展
一.?語(yǔ)法分析介紹
語(yǔ)法分析是編譯過(guò)程的核心部分,它的主要任務(wù)是按照程序語(yǔ)言的語(yǔ)法規(guī)則,從由詞法分析輸出的源程序符號(hào)串中識(shí)別出各類語(yǔ)法成分,同時(shí)進(jìn)行語(yǔ)法檢查,為語(yǔ)義分析和代碼生成做準(zhǔn)備。執(zhí)行語(yǔ)法分析任務(wù)的程序叫語(yǔ)法分析程序或語(yǔ)法分析器。
二.?所實(shí)現(xiàn)的語(yǔ)義分析和代碼生成程序能處理什么語(yǔ)句
(1)簡(jiǎn)單變量的聲明語(yǔ)句
(2)表達(dá)式語(yǔ)句
(3)if語(yǔ)句.
(4)while語(yǔ)句
(5)for語(yǔ)句
(6)write語(yǔ)句
(7)read語(yǔ)句
(8)do語(yǔ)句.
(9)處理過(guò)程調(diào)用和返回
三.實(shí)驗(yàn)過(guò)程
①用VC6.0建立一個(gè)Win32 Console Application得空項(xiàng)目,然后輸入附錄C 語(yǔ)法分析程序的代碼(TESTparse)及主程序代碼(main)
②在建立一個(gè)文件將附錄B中的TESTscan()函數(shù)加到項(xiàng)目分析中
③編譯運(yùn)行
?
④對(duì)do的修改:
int do_stat()
??? {
???? int es=0;
???? fscanf(fp,"%s%s/n",&token,&token1);
???? printf("%s%s/n",token,token1);
???? if(strcmp(token,"(")) return(es=5);
???? fscanf(fp,"%s%s/n",&token,&token1);
???? printf("%s%s/n",token,token1);
???? es=expression();
???? if(es>0) return(es);
???? if(strcmp(token,")")) return(es=6);
???? fscanf(fp,"%s%s/n",&token,&token1);
???? printf("%s%s/n",token,token1);
???? es=statement();
???? if(es>0)return(es);
??????? if(strcmp(token,"while")==0)
??????? {
??????? fscanf(fp,"%s%s/n",&token,&token1);
??????? printf("%s%s/n",token,token1);
???????? es=statement();
??????? if(es>0)return(es);
???????? }
? ???return(es);
????
???? }
⑤log_expr修改
char singleword[50]="+-*(){};,:!";???
?
char doubleword[10]="><=&&||";???
?
int log_expr(){
?????? int es=0;
?????? es=bool_expr();
?????? if(es>0) return(es);
?????? if(strcmp(token,"&&")==0 || strcmp(token,"||")==0
?????? )
?????? {
????????????? fscanf(fp,"%s%s\n",&token,&token1);
????????????? printf("%s%s\n",token,token1);
????????????? es=bool_expr();
????????????? if(es>0) return(es);
?????? }
?????? return(es);
}
四.遇到問(wèn)題:
Link出錯(cuò)
Linking...
LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16
Debug/test.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.
?
test.exe - 2 error(s), 0 warning(s)
?
這個(gè)文件中使用了WinMian而不是main作為入口函數(shù)。vc這時(shí)的默認(rèn)設(shè)置是針對(duì)控制臺(tái)程序的。
解決方法:
1.進(jìn)入project->setting->c/c++, 在category(第一行)中選擇preprocessor,在processor definitions中刪除_WINDOWS, 添加_CONSOLE
?
2.進(jìn)入project->setting->Link, 在Project options中將/subsystem:windows.改為/subsystem:console
3.保存設(shè)置,Rebuild All.
簡(jiǎn)單來(lái)說(shuō)就是在建立項(xiàng)目時(shí)創(chuàng)建成了Win32 Application的,所以建議直接建立Win32 Console Application項(xiàng)目
?
轉(zhuǎn)載于:https://www.cnblogs.com/zzhili/p/4490617.html
與50位技術(shù)專家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的编译原理 - 实验三 - 递归下降语法分析器的调试及扩展的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: websocket之一:websocke
- 下一篇: 比较全的 POM.xml