1. 程式人生 > >語義分析(輸出四元式)

語義分析(輸出四元式)

《編譯原理》課程實驗報告

               實驗名稱:語義分析

姓名:

學號:

地點:      四教302       

教師:

院系:

專業: 電腦科學與技術15-1

一.  實驗目的

通過上機實習,加深對語法制導翻譯原理的理解,掌握將語法分析所識別的語法成分變換為中間程式碼的語義翻譯方法。

二.  實驗內容

採用遞迴下降語法制導翻譯法,對算術表示式、賦值語句進行語義分析並生成四元式序列。

輸入:begin a:=2+3*4;x:=(a+b)/c  end #

輸出:(1)t1=3*4   (2)t2=2+t1  (3)a=t2

      (4)t3=a+b  (5)t4=t3/c     (6) x=t4

三.實驗步驟

語義分析主程式示意圖

 

程式碼如下:

#include "stdio.h"

#include "string.h"

#include "stdlib.h"

char prog[100],token[8],ch;

char*rwtab[6]={"begin","if","then","while","do","end"};

int syn,p,m,n,sum,q;

int kk;

struct { char result1[8];

    char ag11[8];

    char op1[8];

    char ag21[8];

} quad[20];

char *factor();

char *expression();

int yucu();

char *term();

int statement();

int lrparser();

char *newtemp();

scaner();

emit(char *result,char *ag1,char *op,char *ag2);

main()

{ int j;

q=p=kk=0;

 printf("院系:計算機與通訊工程學院\n");

    printf("班級:電腦科學與技術15-01\n");

    printf("姓名:汪笛\n");

    printf("學號:541507010139\n");

printf("\nplease input a string (end with '#'): ");

do

   {scanf("%c",&ch);

     prog[p++]=ch;

   }while(ch!='#');

p=0;

scaner();

lrparser();

if(q>19)printf(" to long sentense!\n");

else for (j=0;j<q;j++)printf("   %s = %s %s %s\n\n",quad[j].result1,quad[j].ag11,quad[j].op1,quad[j].ag21);

//getch();

}

int lrparser()

{ int schain=0;

    kk=0;

    if (syn==1)

      { scaner();

schain=yucu();/*呼叫語句串分析函式進行分析*/

if(syn==6)

{ scaner();

   if((syn==0)&&(kk==0)) printf("Success!\n");

}

else { if(kk!=1)printf("short of 'end' !\n");

        kk=1;

//        getch();

        exit(0);

      }

      }

    else { printf("shortof 'begin' !\n");

    kk=1;

//    getch();

    exit(0);

}

    return (schain);

}

int yucu()

{ int schain=0;

schain=statement();/*呼叫語句分析函式進行分析*/

while(syn==26)

   { scaner();

     schain=statement();/*呼叫語句分析函式進行分析*/

   }

return (schain);

}

int statement()

{ char tt[8],eplace[8];

int schain=0;

if (syn==10)

   { strcpy(tt,token);

     scaner();

     if(syn==18)

       { scaner();

strcpy(eplace,expression());

emit(tt,eplace,"","");

schain=0;

}

     else { printf("shortof sign ':=' !\n");

     kk=1;

//   getch();

     exit(0);

    }

    return (schain);

   }

}

char *expression()

{ char *tp,*ep2,*eplace,*tt;

tp=(char *)malloc(12);/*分配空間*/

ep2=(char *)malloc(12);

eplace=(char *)malloc(12);

tt=(char *)malloc(12);

strcpy(eplace,term());/*呼叫term分析產生表示式計算的第一項eplace*/

while((syn==13)||(syn==14))

   { if(syn==13)strcpy(tt,"+");

     elsestrcpy(tt,"-");

     scaner();

     strcpy(ep2,term());/*呼叫term分析產生表示式計算的第二項ep2*/

     strcpy(tp,newtemp());/*呼叫newtemp產生臨時變數tp儲存計算結果*/

     emit(tp,eplace,tt,ep2);/*生成四元式送入四元式表*/

     strcpy(eplace,tp);

   }

return (eplace);

}

char *term()/*仿照函式expression編寫*/

{ char *tp,*ep2,*eplace,*tt;

tp=(char *)malloc(12);

ep2=(char *)malloc(12);

eplace=(char *)malloc(12);

tt=(char *)malloc(12);

strcpy(eplace,factor());

while((syn==15)||(syn==16))

   { if(syn==15)strcpy(tt,"*");

     elsestrcpy(tt,"/");

     scaner();

     strcpy(ep2,factor());

     strcpy(tp,newtemp());

     emit(tp,eplace,tt,ep2);

     strcpy(eplace,tp);

   }

return (eplace);

}

char *factor()

{ char *fplace;

fplace=(char *)malloc(12);

strcpy(fplace,"");

if(syn==10)

   { strcpy(fplace,token);/*將識別符號token的值賦給fplace*/

     scaner();

   }

else if(syn==11)

   { itoa(sum,fplace,10);

     scaner();

   }

else if(syn==27)

   { scaner();

     fplace=expression();/*呼叫expression分析返回表示式的值*/

     if(syn==28) scaner();

     else { printf("erroron ')' !\n");

     kk=1;

//   getch();

     exit(0);

   }

   }

else { printf("error on '(' !\n");

kk=1;

// getch();

exit(0);

       }

return (fplace);

}

char *newtemp()

{ char *p;

char m[8];

p=(char *)malloc(8);

kk++;

itoa(kk,m,10);

strcpy(p+1,m);

p[0]='t';

return(p);

}

scaner()

{ sum=0;

   for(m=0;m<8;m++)token[m++]=NULL;

    m=0;

    ch=prog[p++];

    while(ch=='')ch=prog[p++];

   if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A')))

      {while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9')))

   {token[m++]=ch;

    ch=prog[p++];

   }

      p--;

      syn=10;

      token[m++]='\0';

      for(n=0;n<6;n++)

if(strcmp(token,rwtab[n])==0)

    { syn=n+1;

      break;

    }

      }

    elseif((ch>='0')&&(ch<='9'))

      { while((ch>='0')&&(ch<='9'))

{ sum=sum*10+ch-'0';

   ch=prog[p++];

}

p--;

syn=11;

      }

    else switch(ch)

       { case '<':m=0;

    ch=prog[p++];

    if(ch=='>')

      { syn=21;

      }

    else if(ch=='=')

      { syn=22;

      }

    else

      { syn=20;

         p--;

      }

    break;

case '>':m=0;

    ch=prog[p++];

    if(ch=='=')

      { syn=24;

      }

    else

      { syn=23;

        p--;

      }

    break;

case ':':m=0;

    ch=prog[p++];

    if(ch=='=')

      { syn=18; }

    else

      { syn=17;

        p--;

      }

    break;

case '+': syn=13; break;

case '-': syn=14; break;

case '*': syn=15;break;

case '/': syn=16;break;

case '(': syn=27;break;

case ')': syn=28;break;

case '=': syn=25;break;

case ';': syn=26;break;

case '#': syn=0;break;

default: syn=-1;break;

       }

    }

emit(char *result,char *ag1,char *op,char *ag2)

{

strcpy(quad[q].result1,result);

strcpy(quad[q].ag11,ag1);

strcpy(quad[q].op1,op);

strcpy(quad[q].ag21,ag2);

q++;

}

輸出結果為:

四.總結與回顧

本次實驗做的是語法分析子程式,採用遞迴下降語法制導翻譯法,對算術表示式、賦值語句進行語義分析並生成四元式序列。實現的過程也是不斷的在網上查詢資料,並將合適的下載下來進行參考。實現的過程也是理解的過程,不斷完善才可以不斷加強理解。

實驗報告成績評定表

評定專案

內           容

滿 分

評  分

總  分

實驗態度

態度端正、遵守紀律、出勤情況

20

實驗過程

按要求完成演算法設計、程式碼書寫、註釋清晰、執行結果正確

40

報告撰寫

報告書寫規範、內容條理清楚、表達準確規範、上交及時。

40

評語:

 指導老師簽字:                     年    月   日


相關推薦

語義分析輸出

《編譯原理》課程實驗報告               實驗名稱:語義分析姓名:學號:地點:      四教302        教師:院系:專業: 電腦科學與技術15-1一.  實驗目的通過上機實習,加深對語法制導翻譯原理的理解,掌握將語法分析所識別的語法成分變換為中間程式碼

文字主題模型之潛在語義分析LDA:Latent Dirichlet Allocation

1、LDA作用 傳統判斷兩個文件相似性的方法是通過檢視兩個文件共同出現的單詞的多少,如TF-IDF等,這種方法沒有考慮到文字背後的語義關聯,可能在兩個文件共同出現的單詞很少甚至沒有,但兩個文件是相似的。 舉個例子,有兩個

的翻譯拉鍊回填

四元式的翻譯(拉鍊回填) 1.定義 四元式實際上是一種“三地址語句”的等價表示。它的一般形式為: (op,arg1,arg2,result); 布林式的四元式序列形式如下: (jnz, A, _ , p): 若A為真轉第p個四元式 (jez, A, _ ,

NLP+語義分析︱中文語義分析研究現狀CIPS2016、角色標註、篇章分析

任何對語言的理解都可以歸為語義分析的範疇。一段文字通常由詞、句子和段落來構成,根據理解物件的語言單位不同, 語義分析又可進一步分解為詞彙級語義分析、句子級語義分析以及篇章級語義分析。 語義分析的目標就是通過建立有效的模型和系統, 實現在各個語言單位

編譯原理4---語義分析未完成

導讀 1。逆波蘭表示式 (1)字尾表示式 (2)語法制導生成字尾式 2。三元式和樹 (1)三元式 (2)樹 3。四元式 (1)四元式 (2)算術表示式和賦值句翻譯為四元式 (3)布林表示式翻譯為四元式 4。控制語句的翻譯 (1)標號和轉移語句 (2)條件語句 (3)分叉語句

osgEarth的Rex引擎原理分析分頁瓦片載入器子節點的作用

目標:(十二)中的問題21 在rex引擎的setMap中建立了分頁瓦片載入器子節點 osgEarthDrivers/engine_rex/RexTerrainEngineNode.cpp void RexTerrainEngineNode::setMap(const Map* map, co

BosonNLP API 中文語義分析筆記

BosonNLP API 中文語義分析 from __future__ import print_function, unicode_literals from bosonnlp import BosonNLP import requests

u3d學習筆記:Quaternion類的備忘

概念 四元數是簡單的超複數。 複數是由實數加上虛數單位 i 組成,其中i^2 = -1。 相似地,四元數都是由實數加上三個虛數單位 i、j、k 組成,而且它們有如下的關係: i^2 = j^2 = k^2 = -1, i^0 = j^0 = k^0 = 1 ,

matlab練習程序求向量間的旋轉矩陣與

nor rep align lld stack 如果 nsh tails The 問題是這樣,如果我們知道兩個向量v1和v2,計算從v1轉到v2的旋轉矩陣和四元數,由於旋轉矩陣和四元數可以互轉,所以我們先計算四元數。 我們可以認為v1繞著向量u旋轉θ?角度到v

Java入門系列之集合HashMap原始碼分析

前言 我們知道在Java 8中對於HashMap引入了紅黑樹從而提高操作效能,由於在上一節我們已經通過圖解方式分析了紅黑樹原理,所以在接下來我們將更多精力投入到解析原理而不是演算法本身,HashMap在Java中是使用比較頻繁的鍵值對資料型別,所以我們非常有必要詳細去分析背後的具體實現原理,無論是C#還是J

shell腳本學習筆記 正則表達

時也 限定符 數量 介紹 是我 center sof 好的 fgrep 正則表達式一般有三個部分組成,他們各自是:字符類,數量限定符,位置限定符。規定一些特殊語法表示字符類、數 量限定符和位置關系,然後用這些特殊語法和普通字符一起表示一個模式,這

綜合案例分析sort,cut,正則

sbin ati bsp ima 如何 難點 一次 方法 當前 1、 找出ifconfig “網卡名” 命令結果中本機IPv4地址 分析: 解釋:要取出ip地址,首先我們可以先取出ip所在的行,即取行;可以結合head和tail,後面會有 更好的方法去取行,取列當然

struts2值棧存取數據小結使用ognl表達

color idt 直接 com ble per 小結 如果 ges 前言:使用ognl和struts2標簽庫的時候要在 jsp頁面 中 加入這麽一行 <%@ taglib uri="/struts-tags" prefix="s" %> struts(統

java基礎基礎總結----- 隨機數產生個隨機數

nbsp 總結 頁面 ring buffer image 2017年 遇見 ++ 前言:在開發的時候經常會遇見,一些驗證碼登錄,其實這些東西,很簡單。我曾經開發過一個驗證碼登錄的頁面,那時用的插件。但是作為一個合格的開發者,要了解其內部的核心知識,有些東西,可以不深入了解,

線性判別分析Linear Discriminant Analysis-LDA

png 數學 坐標軸 ima 特征 分析 技術 數據預處理 距離 Linear Discriminant Analysis(LDA線性判別分析)   用途:數據預處理中的降維,分類任務   目標:LDA關心的是能夠最大化類間區分度的坐標軸成分,將特征空間(數據集中的多維樣本

數據結構-堆 接口定義與實現分析詳細註釋與圖解

info 獲取 init ret targe 動態 函數 target 用戶自定義函數 如果想了解堆的概念,可以點擊此處查看前面關於堆的定義的隨筆。 堆的操作接口包括初始化堆、銷毀堆、向堆中插入元素、從堆頂移除元素、堆的結點個數。 我們用heap來命名一個堆。下面是對以上接

軟工網絡15個人作業3——案例分析葉城龍 201521123109

學歷 如何解決 為什麽 各種功能 知識 其他 背景 新手 可靠的 1.調研, 評測( 智慧集大平臺——集大通APP) (1)下載並使用,描述最簡單直觀的個人第一次上手體驗。 第一次使用時對裏面的各種功能都不熟,找一個班級加入都找了半天,後來還是從貼吧裏看的攻略,對集大通的各

小易喜歡的單詞正則表達

ati code 組成 長度 question 這樣的 () public 數字 題目描述 小易喜歡的單詞具有以下特性:1.單詞每個字母都是大寫字母2.單詞沒有連續相等的字母3.單詞沒有形如“xyxy”(這裏的x,y指的都是字母,並且可以相同)這樣的子序列,子序列可能不連

HashMap底層原理分析put、get方法

return sta rec oca ati 技術分享 AI TP load 1、HashMap底層原理分析(put、get方法) HashMap底層是通過數組加鏈表的結構來實現的。HashMap通過計算key的hashCode來計算hash值,只要hashCode一樣

集群搭建Hadoop搭建HDFS完全分布

意思 cati 臨時 等於 style www 比較 環境變量 AD Hadoop集群搭建(完全分布式) 前期準備(4臺linux服務器),具體搭建過程可以參考https://www.cnblogs.com/monco/p/9046614.html(克隆虛擬機比較方便)