日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

编译原理|LL(1)语法分析实验

發布時間:2023/12/20 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 编译原理|LL(1)语法分析实验 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

LL(1)語法分析實驗

一、實驗目的

  • 了解 LL(1)語法分析是如何根據語法規則逐一分析詞法分析所得到的單詞,檢查語法錯誤,即掌握語法分析過程。
  • 掌握LL(1)語法分析器的設計與調試。
  • 二、實驗內容
    針對CP語言中簡單算術表達式文法G[E]:
    E→TE’
    E’→ATE’|ε
    T→FT’
    T’→MFT’ |ε
    F→(E) | i
    A → + | -
    M → * | /
    求解相應的FIRST、FOLLOW集,構造預測分析表,并編寫LL(1)語法分析程序,并給出測試句子的分析過程。
    (注:如果有選做專題7關于LL(1)文法判斷的同學,可以將專題7的部分整合到這個實驗的前面,自動產生預測分析表,相當于把這個程序做成一個通用的LL(1)分析器)

  • 輸入:是詞法分析輸出的二元組序列,即任意簡單算術表達式經過專題1程序輸出后得到的結果。【上述文法中i即對應詞法分析的標識符, ±*/分別對應詞法分析得到的運算符】
  • 處理:基于分析表進行 LL(1)語法分析,判斷其是否符合文法。
  • 輸出:串是否合法。
  • 三、實驗要求

  • 構建合適的數據結構來表示文法符號和文法規則。【參考遞歸下降分析?程序】
  • 設計恰當的數據結構存儲預測分析表。(ε可用特殊符號代替)
  • 任選 C/C++/Java 或其他高級語言中的一種作為編程語言,要求所編程序結構清晰。
  • 四、程序代碼

    #include <iostream> #include <cstdio> #include <cstring> #include <string> #include <stack>using namespace std;#define MAX 100 char c[8]={'i','(','+','-','*','/',')','#'}; char w[7]={'E','e','T','t','F','A','M'}; char mapp[7][8][5]= {"Te","Te","%","%","%","%","%","%","%","%","ATe","ATe","%","%","#","#","Ft","Ft","%","%","%","%","%","%","%","%","#","#","MFt","MFt","#","#","i","(E)","%","%","%","%","%","%","%","%","+","-","%","%","%","%","%","%","%","%","*","/","%","%"};int panduan(char ch) {for(int i=0;i<8;i++){if(ch==c[i])return 1;}return 0; } int findc(char ch) {if(ch>='0'&&ch<='9')return 0;for(int i=0;i<8;i++){if(ch==c[i])return i;}return 0; } int findw(char ch) {for(int i=0;i<7;i++){if(ch==w[i])return i;}return 0;}int main() {char str[MAX];int ip;stack <char> q;cout<<"輸入的格式為算數式后跟#號"<<endl;cout<<"比如:"<<" 9+8*2#"<<endl;cout<<"“e->#”此類產生式中的#號代表空集"<<endl;cout<<"請輸入你的表達式"<<endl;cin>>str;ip=0;q.push('#');q.push('E');while(!q.empty()){char ch=q.top();if(ch=='#')break;int i=findw(ch);int j=findc(str[ip]);if(ch==str[ip]){q.pop();cout<<"匹配"<<str[ip]<<endl;ip++;}else if(str[ip]>='0'&&str[ip]<='9'&&ch=='i'){q.pop();cout<<ch<<"->"<<str[ip]<<endl;cout<<"匹配"<<str[ip]<<endl;ip++;}else if(panduan(ch)){cout<<"不匹配"<<endl;return 0;}else if(mapp[i][j][0]=='%'){cout<<"不匹配"<<endl;return 0;}else if(mapp[i][j][0]=='#'){cout<<ch<<"->"<<"#"<<endl;q.pop();}else{int n=strlen(mapp[i][j]);q.pop();for(int k=n-1;k>=0;k--){q.push(mapp[i][j][k]);}cout<<ch<<"->"<<mapp[i][j]<<endl;}}return 0; }

    五、結果分析

    總結

    以上是生活随笔為你收集整理的编译原理|LL(1)语法分析实验的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。