freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

[工學(xué)]編譯原理實(shí)驗(yàn)指導(dǎo)書(參考版)

2024-08-28 01:31本頁面
  

【正文】 39。當(dāng) Yacc 編譯一個(gè)帶有 _d 標(biāo)記的 .y文件時(shí),會生成一個(gè)頭文件,它對每個(gè)標(biāo)記都有 define 的定義。 因此 Lex 中匹配模式時(shí)的動作一般格式為: {pattern} { /* do smthg*/ return TOKEN_NAME。 yylex() 可以由 Lex 來生成或完全由自己來編寫。只有在文件結(jié)束或者出現(xiàn)錯誤標(biāo)記時(shí)才會終止。二、實(shí)驗(yàn)要求、內(nèi)容及學(xué)時(shí)1.通過對語法分析程序YACC的實(shí)驗(yàn),能夠編寫并生成編譯程序,學(xué)會正確運(yùn)用語法規(guī)則,實(shí)驗(yàn)報(bào)告要求給出測試程序的源程序、目標(biāo)程序和運(yùn)行結(jié)果。這些段以%%來分界。一個(gè) Lex 程序分為三個(gè)段:第一段是 C 和 Lex 的全局聲明,第二段包括模式(C 代碼),第三段是補(bǔ)充的 C 函數(shù)。我們的第一個(gè)任務(wù)就是說明如何聲明標(biāo)記。(下表中給出了標(biāo)記和表達(dá)式的例子。 Lex 中的標(biāo)記聲明類似 C 中的變量名。 A{1,2}shis+ 匹配 AAshis, Ashis, AAshi, Ashi。 ( ) 將一系列常規(guī)表達(dá)式分組。如果在匹配的模版中的“/”后跟有后續(xù)表達(dá)式,只匹配模版中“/”前面的部分。元字符具有。 | 表達(dá)式間的邏輯或。同樣用來覆蓋字符在此表中定義的特殊意義,只取字符的本意。 例如: A{1,3} 表示 A 可能出現(xiàn)1次或3次。 $ 作為模式的最后一個(gè)字符匹配一行的結(jié)尾。 + 匹配 1個(gè)或者多個(gè)上述模式。例如: [abC] 匹配 a, b, 和 C中的任何一個(gè)。匹配括號內(nèi)的 任意 字符。例如:AZ 指從 A 到 Z 之間的所有字符。 . 匹配任意字符,除了 \n。 下面給出定義了 Lex 中使用的一些標(biāo)記。表達(dá)式由符號組成。關(guān)于這一特殊問題的幫助請閱讀 Yacc和 將 Lex 和 Yacc 結(jié)合起來部分。 3、編譯和鏈接 C 代碼,生成可執(zhí)行的掃描器。下面補(bǔ)充一點(diǎn)資料:Lex 編程可以分為三步:1、以 Lex 可以理解的格式指定模式相關(guān)的動作。二、實(shí)驗(yàn)要求、內(nèi)容及學(xué)時(shí)通過對詞法分析程序LEX的實(shí)驗(yàn),能夠編寫并生成編譯程序,學(xué)會正確運(yùn)用語法規(guī)則,實(shí)驗(yàn)報(bào)告要求給出EBNF形式的語法表示、測試程序的源程序、目標(biāo)程序和運(yùn)行結(jié)果。 lrparse()。 strFileName=filename。 strSource=str。 gnLocate=gnLocateStart=0。 //注:上行為待編譯源程序 char filename[200]。}while (j0) {k=1。}void main(){ char str[]=main(){i=2*3+4。 Parse()。 nfc=ntc=nNXQ=1。}void lrparse(void)//語法語義分析函數(shù),主要是先處理準(zhǔn)備和收尾工作,//中間調(diào)用parse()進(jìn)行語法語義工作{ pQuad=(QUATERNION *)malloc(strlen(strSource)*sizeof(QUATERNION))。 if(!=_SYN_END) fprintf(fw,源程序非正常結(jié)束)。 Statement_Block(amp。 Match(_SYN_LPAREN,()。 Scaner()。 //上行分析語句塊中語句序列,即花括號中的部分 Match(_SYN_RIGHTBRACKET2,})。}void Statement_Block(int *nChain)//分析語句塊函數(shù),語名塊是{……}語句{ Match(_SYN_LEFTBRACKET2,{)。 } bp(*nChain,nNXQ)。 while(==_SYN_ID ||==_SYN_IF ||==_SYN_WHILE) { bp(*nChain,nNXQ)。 } return。 *nChain=nfc。 sprintf(strTemp,%d,nWQUAD)。nChainTemp)。 Match(_SYN_RPAREN,))。nfc)。 Condition(amp。 nWQUAD=nNXQ。 break。nChainTemp)。 Match(_SYN_RPAREN,))。nfc)。 Condition(amp。 //處理if語句 case _SYN_IF: Match(_SYN_IF,if)。 *nChain=0。)。 strcpy(eplace,Expression())。 Scaner()。 int nChainTemp,nWQUAD。//條件表達(dá)式對應(yīng)的四元組第一項(xiàng)加標(biāo)志j } else error(關(guān)系運(yùn)算符)。 gen(strTemp,eplace1,eplace2,0)。 *efc=nNXQ+1。 eplace2=Expression()。 break。 break。 eplace1=Expression()。}void Condition(int *etc,int *efc)//處理?xiàng)l件表達(dá)式{ char opp[3],*eplace1,*eplace2。 Match(_SYN_RPAREN,))。 } else { Match(_SYN_LPAREN,()。 } else sprintf(eplace,%d,)。}char *Factor(void)//處理表達(dá)式中的因子,如a1*12中的a1和12,即可以為數(shù)或標(biāo)識符.{ char *eplace=(char *)malloc(MAXLENGTH)。 eplace1=eplace。 eplace=Newtemp()。 Scaner()。 strcpy(eplace,eplace1)。 eplace=(char *)malloc(MAXLENGTH)。 } return eplace。 gen(opp,eplace1,eplace2,eplace)。 strcpy(eplace2,Term())。 while(==_SYN_PLUS||==_SYN_MINUS) { sprintf(opp,%c,)。 strcpy(eplace1,Term())。}char *Expression(void)//處理表達(dá)式{ char opp[MAXLENGTH],*eplace, eplace1[MAXLENGTH],eplace2[MAXLENGTH]。 q=w。 while(q) { w=atoi(pQuad[q].result)。 } } return nResult。 while(atoi(pQuad[p].result)) { p=atoi(pQuad[p].result)。 if(p2==0) nResult=p1。 return strTempID。 }}char *Newtemp(void)//自動產(chǎn)生中間結(jié)果標(biāo)識“T1”,“T2”等字符串,以備輸出四元組用{ char *strTempID=(char *)malloc(MAXLENGTH)。nLoopnNXQ。}void PrintQuaternion(void)//輸出四元組{ int nLoop。 nNXQ++。 sprintf(pQuad[nNXQ].argv2,argv2)。}void gen(char *op,char *argv1,char *argv2,char *result)//隨著進(jìn)程生成四元組,將其保存在pQuad結(jié)構(gòu)體數(shù)組中,為輸出作準(zhǔn)備{ sprintf(pQuad[nNXQ].op,op)。 else error(strError)。 return。{ LocateError(gnColumn,gnRow)。}*///只要做詞法分析,則下面代碼不要.void LocateError(int nColumn,int nRow)//輸出錯誤所在的行、列提示信息{ fprintf(fw,\nCol:%d\tRow:%d,nColumn+1,nRow)。 fw=stdout。while(i) i=i1。 return。}void Scaner(void)//詞法分析框架函數(shù){ Do_Start(strSource)。}void PrintError(int nColumn,int nRow,char chInput){ fprintf(fw,\n無法識別的單詞Col:%d\tRow:%d\tChar:%c, nColumn,nRow,chInput)。 while(strSource[gnLocate]) { Scaner()。{ gnColumn=gnRow=1。 } return。 } else if(==_SYN_NUM) { fprintf(fw,\n(%d,\t%d),)。 return。 gnLocate++。}void Do_EndOfEnd(char *strSource){ =_SYN_END。 gnRow++。 strcpy(,=)。 gnRow++。 =strSource[gnLocate]。=39。 return。 } gnLocate++。 =_SYN_ME。 }
點(diǎn)擊復(fù)制文檔內(nèi)容
教學(xué)課件相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1