第一篇:編譯原理實驗二(設計一個詞法分析器)
編譯原理實驗二
1.實驗名稱:一個簡單語言詞法分析器設計
2.實驗內容
(1)閱讀并理解教材第三章詞法分析p42“簡單語言”詞法分析構造實例
(2)完善P45給出的“簡單語言”詞法分析程序,使得該程序能夠在計算機上運行,完
全達到詞法分析器的設計基本要求:
① 讀入“簡單語言”源程序
②濾掉“簡單語言”源程序中的“空白”字符
③濾掉“簡單語言”源程序中的“注釋”字符
④能夠識別出“簡單語言”源程序中的合法“單詞”并輸出識別出的一個個“單詞”符號序列。
⑤ 識別出的一個個“單詞”符號要求為二元組形式: 指出單詞類別屬性,標識符自身值,常數值.3.提交實驗報告
? “簡單語言”詞法分析程序“源程序”文件
? “簡單語言”詞法分析程序“源程序”可執行文件
? 對“簡單語言”詞法分析程序的測試實例:“簡單語言”源程序及其詞法分析結果。
第二篇:《編譯原理》課程設計報告--詞法分析器
201X-201X學年第x學期
《編譯原理》課程設計報告
院 系: 計算機科學與技術 班 級: XX級XX 班 學生姓名: XXXXXX 學 號: XXXXXXXX 指導老師: XXXXXX
計算機科學與技術學院監制
20XX年X月
目錄
1.課程設計的目的 2.課程設計的內容和要求 3.問題分析和相關知識介紹 4.設計思路和關鍵問題及其解決方案 5.測試和結果分析 6.總結和心得體會
附件1:參考文獻 附件2:核心源代碼
1.課程設計的目的(1)編寫詞法分析器
(2)加深對詞法分析器工作原理的了解和認識
2.課程設計的內容和要求
編寫詞法分析器,詞法分析器能夠識別關系算符,詞法分析器能夠識別標識符和關鍵字,詞法分析器能夠識別無符號數。
3.問題分析和相關知識介紹
構成詞法分析器的一種簡單方法是用狀態轉換圖來描述源語言詞法記號的結構,然后手工把這種狀態轉換圖翻譯成為識別詞法記號的程序。詞法分析器的任務是把構成源程序的字符流翻譯成詞法記號流。
4.設計思路和關鍵問題及其解決方案
把自然語言構造成正規式,把正規式構造成有限自動機NFA,然后根據子集構造法把有限自動機構造成無限自動機DFA,根據極小化DFA狀態數算法把DFA構造成最簡DFA,其次根據最簡DFA畫出轉換表,根據轉換表畫出裝換圖,最后根據裝換圖就可以編寫詞法分析器。
5.測試和結果分析
6.總結和心得體會
通過本次試驗,不僅僅是我學會了C#基礎知識,而且還是我對詞法分析器有了更深入的認識,雖然在編寫詞法分析器過程中遇到了很多困難,例如:C#語言不熟悉,對此法分析器的工作原理分析的不透徹,但在老師和同學的幫助下,我有了很大的提高,通過不斷的努力最終順利的完成了課程設計,很感謝幫助我的XX同學和XX老師。附件1:參考文獻
《編譯原理(第2版)》 高等教育出版社; 《C#程序設計及應用教程(第2版)》 人民教育出版社。附件2:
1.Code文檔截圖
2.程序源代碼
using System;using System.Collections.Generic;using System.Text;using System.IO;
namespace LexicalAnalysis { class Program { static string[] keys = { “static”, “true”, “return”, “string”, “Length”, “break”, “Console”, “WriteLine”, “bool”, “false”, “ture”, “void”, “if”, “else”, “while”, “int”, “float”, “for”, “enum”, “default”, “case”, “double”, “do” };
static List
static List
static List
static List
static List
//數字,標識符,空白,關系符,運算符
static void Main(string[] args){
string[] date = File.ReadAllLines(@“d:code.txt”);//路徑,并存入data
for(int i = 0;i < date.Length;i++){ Console.WriteLine(“第” +(i + 1)+ “行code: ” + date.GetValue(i));analysisByLine(date[i]);
} //分別輸出存儲在四個List中的String
Console.WriteLine(“關鍵字,輸入回車”);//輸出所有的關鍵字 Console.ReadLine();
foreach(string id in key){ Console.WriteLine(id);
}
Console.WriteLine(“標識符,輸入回車”);//輸出所有的標識符
Console.ReadLine();foreach(string id in bsf){ Console.WriteLine(id);
}
Console.WriteLine(“數字,輸入回車”);Console.ReadLine();foreach(string id in sz){ Console.WriteLine(id);
}
Console.WriteLine(“關系運算符,輸入回車”);Console.ReadLine();foreach(string id in gx){ Console.WriteLine(id);
}
Console.WriteLine(“算數運算符,輸入回車”);Console.ReadLine();foreach(string id in ys){ Console.WriteLine(id);
}
Console.WriteLine(“輸入回車退出”);
Console.ReadLine();
} static void analysisByLine(string code)
//輸出所有的數字 //輸出所有的關系運算符//輸出所有的算數運算符
{
char a = ' ';string temp = “";int j = 0;while(j < code.Length){ a = code[j];temp = ”“;if(Char.IsLetter(a)|| a == '_')//是否為標識符 { temp = temp + a.ToString();j++;a = code[j];while(Char.IsLetterOrDigit(a)){ temp = temp + a.ToString();j++;a = code[j];} if(isKey(temp)){
//Console.WriteLine(”保留字:“+temp);
if(!key.Contains(temp)){ // Console.WriteLine(”添加成功“);key.Add(temp);}
} else {
//Console.WriteLine(”標識符:“+temp);
if(!bsf.Contains(temp)){ //Console.WriteLine(”添加成功標識符==“);bsf.Add(temp);} }
} else if(Char.IsDigit(a)){ temp = temp + a.ToString();j++;a = code[j];while(Char.IsDigit(a)){ temp = temp + a.ToString();j++;a = code[j];
} //判斷是否是小數
if(a.Equals('.')){ temp = temp + a.ToString();j++;a = code[j];while(Char.IsDigit(a)){ temp = temp + a.ToString();j++;a = code[j];} //判讀是否是科學記數法
if(a.Equals('E')|| a.Equals('e')){ temp = temp + a.ToString();j++;a = code[j];while(Char.IsDigit(a)){
temp = temp + a.ToString();j++;a = code[j];} }
}
// Console.WriteLine(”數字:“+temp);if(!sz.Contains(temp)){ //Console.WriteLine(”添加成功標識符==“);sz.Add(temp);} } else if(a == '<'){ temp = temp + a.ToString();j++;a = code[j];if(a == '='){ temp = temp + a.ToString();j++;a = code[j];} else if(a == '>'){ temp = temp + a.ToString();j++;a = code[j];} //Console.WriteLine(”關系符“+temp);if(!gx.Contains(temp)){ //Console.WriteLine(”添加成功標識符==“);gx.Add(temp);} } else if(a == '='){ temp = temp + a.ToString();j++;
a = code[j];// Console.WriteLine(”關系符“+temp);if(!gx.Contains(temp)){ //Console.WriteLine(”添加成功關系==“);gx.Add(temp);} } else if(a == '>'){ temp = temp + a.ToString();j++;a = code[j];if(a == '='){ temp = temp + a.ToString();j++;a = code[j];}
// Console.WriteLine(”關系符“+temp);if(!gx.Contains(temp)){ //Console.WriteLine(”添加成功標識符==“);gx.Add(temp);}
} else { if(a == '+' || a == '-' || a == '/' || a == '*'){ temp = temp + a.ToString();j++;a = code[j];//Console.WriteLine(”運算符“+temp);if(!ys.Contains(temp)){ //Console.WriteLine(”添加成功標識符==“);ys.Add(temp);} } else
{ j++;}
} } }
//判斷是不是保留字的IsKey方法
static bool isKey(string key){
bool flag = false;for(int i = 0;i < keys.Length;i++)
if(keys[i] == key){ flag = true;//Console.WriteLine(key+”是不是key“+flag);break;} else { flag = false;
} //Console.WriteLine(key+”是不是key“);// Console.WriteLine(flag+”是不是key");return flag;
} } }
第三篇:實驗一詞法分析器的設計與實現
實驗一詞法分析器的設計與實現
一、實驗目的1.了解并掌握詞法分析器的原理及工作過程
2.理解詞法分析器的狀態圖表示方法
二、實驗內容
用適當的程序設計語言編制一個詞法分析程序,并完成相應的調試,要求該程序能夠從指定的文件中讀入源程序,并將此源程序變成語義等價的單詞序列,輸出單詞序列。
提示:
1.源程序可限定為某個語言的子語言,如C語言的子集,允許源程序中有注釋行,其中的關鍵字自行設定,可參見書66頁的編碼表,保留字表為詞法分析器已知的表格(可采用二維數組的形式存儲)
2.參考程序見書中104-105頁,程序中涉及的gettoken()和install_id()兩個過程的解釋見91頁上面3段的說明。
3.詞法分析器的輸入輸出示例:
輸入:if(i>10)then i=0
輸出:
(10, if)
(20,()
(50,i)
(21,>)
(51,10)
(22,))
(11,then)
(50,i)
(23,=)
(51,0)
其中:50代表標識符的編碼,51代表常量的編碼
第四篇:編譯原理課程設計 LL遞歸下降分析器
仲愷農業技術學院
編譯原理課程設計
課程設計題目 :LL(1)遞歸下降分析器
姓
名 : 院(系):
專業班級 : 學
號 :
指導教師 :
設計日期 :
目 錄
1、需求分析...................................................................................................1
2、概要設計...................................................................................................2
3、詳細設計...................................................................................................3
4、測試分析...................................................................................................8
5、用戶手冊...................................................................................................9
6、課程總結...................................................................................................9
7、參考文獻.................................................................................................10
題目:LL(1)遞歸下降分析器
1、需求分析
語法分析是編譯過程的核心部分。語法分析器的任務是識別和處理比單詞更大的語法單位。如:程序設計語言中的表達式,各種說明和語句乃至全部源程序,指出其中的語法錯誤;必要時,可生成內部形式,便于下一階段處理。
我們知道,語言的語法結構是用上下文無關文法描述的。按照語法分析樹的建立方法,我們可以粗略地把語法分析辦法分成兩類,一類是自上而下分析,另一類是自下而上分析法。而自上而下這種方法是帶“回溯”的,且存在許多困難和缺點。
首先,是文法的左遞歸性問題。一個文法是含有左遞歸的,如果存在非終結符P且?P?P?,含有左遞歸的文法使上述的自上而下的分析過程陷入無限循環。即,當試圖用P去匹配輸入串時,我們會發現,在沒有識別任何輸入符號的情況下,有得重新要求P去進行新的匹配。因此,使用自上而下分析法必須消除文法的左遞歸性。
其次,由于回溯,就碰到一大堆麻煩問題。如果我們走了一大段錯路,最后必須回頭,那么,就應把已經做的一大堆語義工作(指中間代碼產生工作和各種表格的簿記工作)推倒重來。這些事情既麻煩又費時間,所以,最好應設法消除回溯。
第三,在自上而下分析過程中,當一個非終結符用某一候選匹配成功時,這種成功可能僅是暫時的。
第四,當最終報告分析不成功時,我們難于知道輸入串中出錯的確切位置。
最后,由于帶回溯的自上而下分析實際上采用了一種窮盡一切可能的試探法,因此,效率很低,代價極高。嚴重的低效使得這種分析法只有理論意義,而在實踐上價值不大。
由于上述原因,我們需要把原算術表達式改寫為LL(1)文法,LL(1)文法的文法條件如下: 文法不含左遞歸。
對于文法中每一個非終結符A的各個產生式的候選首集符兩兩不相交。即,若A??1|?2|?|?n,則FIRST??i??FIRST??j??? ?i?j?
對文法中的每個非終結符A,若它存在某個候選首符集包含ε,則FIRS?TA??FOLLO?WA???
LL(1)中的第一個L表示從左到右掃描輸入串,第二個L表示最左推導,1表示分析時每 一步只需向前查看一個符號。當一個文法滿足LL(1)條件時,我們就可以為它構造一個不帶回溯的自上而下分析程序,這個分析程序是由一組遞歸過程組成的,每個過程對應文法的一個非終結符。這樣的一個分析程序稱為遞歸下降分析器。
2、概要設計
編程實現給定算術表達式的遞歸下降分析器。算術表達式文法如下: E-->E+T|E-T|T T-->T*F|T/F|F F-->(E)| i 首先改寫文法為LL(1)文法;然后為每一個非終結符,構造相應的遞歸過程,過程的名字表示規則左部的非終結符;過程體按規則右部符號串的順序編寫。
上述算法表達式文法屬于比較典型的遞歸下降語法分析。需要先將原算術表達式方法改寫為LL(1)文法為:
E-->TE’
E’-->+TE’|-TE’| ε T-->FT’
T’-->*FT’|/FT’| ε F-->(E)| i 然后再為每個非終結符設計一個對應的函數,通過各函數之間的遞歸調用從而實現遞歸下降語法分析的功能。
具體方法為:
(1)當遇到終結符a時,則編寫語句
If(當前讀到的輸入符號==a)讀入下一個輸入符號(2)當遇到非終結符A時,則編寫語句調用A()。(3)當遇到A-->ε規則時,則編寫語句
If(當前讀到的輸入符號不屬于Follow(A))error()(4)當某個非終結符的規則有多個候選式時,按LL(1)文法的條件能唯一地選擇一個候選式進行推導.遞歸下降子程序流程圖:
圖1遞歸下降子程序流程圖
3、詳細設計
#include
void main(){
}
void e(){
}
void e1()right=1;cout<<“--------------------”< } void t(){ } if(inputstream[temp]=='+'){ } else if(inputstream[temp]=='-'){ } else if(inputstream[temp]!='#'||inputstream[temp]!=')'){ } else right=0;cout<<“T'->^”< if(inputstream[temp]=='*'){ } else if(inputstream[temp]=='/'){ } else cout<<“T'->/FT'”< } void f(){ { } cout<<“T'->^”< } } else if(inputstream[temp]=='('){ cout<<“F->(E)”< } else } right=0;cout<<“F->(E)”< 4、測試分析 圖2 測試分析成功 圖3 測試分析失敗 5、用戶手冊 開發工具:visual c++ 6.0 開發環境:windows XP操作系統 運行環境:windows 9x,windows NT,Windows 2000,windows XP 注意:輸入時,程序最多只能接受50個字符,輸入完算術表達式后要以“#”號結束。 6、課程總結 通過一個星期的努力,終于把編譯原理課程設計給完成了。我覺得編譯原理這門課是一門非常難學的課程,它涉及文法、詞法分析、語法分析屬性文法和語義分析等等一系列內容,課本里的內容和定義也非常的抽象且枯燥。如果上課沒有好好的認真聽課,自己獨自學習就感到非常的吃力,而且效果也不好。本人因為上課無法做到打醒十二分專心聽課,經常會分神,所以學習的效果也不怎么好。這也給做編譯原理課程設計帶來了困難。本次課程設計,我選的課程設計題目是LL(1)遞歸下降分析器,這個題目涉及的內容有關課本第四章 語法分析——自上而下分析里面的內容。在開始動手對題目進行設計和編程之前,我重復的仔細認真的閱讀和理解課本第四章里面的內容,弄懂自上而下分析面臨的問題、何謂左遞歸,搞清楚如何消除左遞歸、如何消除回溯、提左因子,理解構造LL(1)文件需要什么條件。雖然這花費了一定的時間和精力,但那點付出也是值得的,通過復習讓我加深理解了有關自上而下語法分析的內容,而且也為用高級語言實現遞歸下降分析器帶來便利。 在用C++編程時,基本上沒有遇到什么困難,只需把所有遞歸過程都寫出就行了。但是要注意的是,在編寫代碼時,要根據LL(1)文法的工作原理去設計。通過本次課程設計清楚地了解到遞歸下降分析法的優缺點,其優點是簡單、直觀,易于構造分析程序。缺點是對文法要求高,必須是LL(1)文法,同時由于遞歸調用較多,影響分析器的效率。 課程設計雖然只有短短的一周,但讓我認識到學習好編譯原理,是對程序設計和編譯的一個很好的進化橋梁和奠基石。今后學習的日子還很長,希望通過這次編譯原理的課程設計,不僅對編程語言的進一步復習,還是對更深層次的學習作一個簡單的準備。編程的能力不是一朝一夕能鍛煉出來,堅持學習,堅持編程的學習,多看,多編是最好的學習和提高方法。 通過本次編譯原理課程設計,對面向對象的定義又有了更深一步的理解,對編譯程序有了進一步的理解,同時也認識到自己各方面知識的薄弱點,以后在學習中也能有針對性對這方面進行深入學習。學習更好的知識重在基礎,編譯原理的學習為我們提供非常好的橋梁和道路。 7、參考文獻 《編譯原理》 機械工業出版社出版 Alfred V.Aho Ravi Sethi Jeffrey D,Ullman著 李建中 姜守旭等譯 《程序設計語言 編譯原理(第三版)》 國防工業出版社出版 陳火旺 劉春林 譚慶平趙克佳 劉越 著 實驗二 語法分析器 一、實驗目的 通過完成預測分析法的語法分析程序,了解預測分析法和遞歸子程序法的區別和聯系。使學生了解語法分析的功能,掌握語法分析程序設計的原理和構造方法,訓練學生掌握開發應用程序的基本方法。有利于提高學生的專業素質,為培養適應社會多方面需要的能力。 二、實驗內容 ? 根據某一文法編制調試 LL(1)分析程序,以便對任意輸入的符號串進行分析。 ? 構造預測分析表,并利用分析表和一個棧來實現對上述程序設計語言的分析程序。 ? 分析法的功能是利用LL(1)控制程序根據顯示棧棧頂內容、向前看符號以及LL(1)分析表,對輸入符號串自上而下的分析過程。 三、LL(1)分析法實驗設計思想及算法 ? 模塊結構: (1)定義部分:定義常量、變量、數據結構。 (2)初始化:設立LL(1)分析表、初始化變量空間(包括堆棧、結構體、數組、臨時變量等); (3)控制部分:從鍵盤輸入一個表達式符號串; (4)利用LL(1)分析算法進行表達式處理:根據LL(1)分析表對表達式符號串進行堆棧(或其他)操作,輸出分析結果,如果遇到錯誤則顯示錯誤信息。 四、實驗要求 1、編程時注意編程風格:空行的使用、注釋的使用、縮進的使用等。 2、如果遇到錯誤的表達式,應輸出錯誤提示信息。 3、對下列文法,用LL(1)分析法對任意輸入的符號串進行分析: (1)E->TG(2)G->+TG|—TG(3)G->ε(4)T->FS(5)S->*FS|/FS(6)S->ε(7)F->(E)(8)F->i 輸出的格式如下: 五、實驗源程序 LL1.java import java.awt.*;import java.awt.event.*;import javax.swing.*;import javax.swing.table.DefaultTableModel;import java.sql.*;import java.util.Vector;public class LL1 extends JFrame implements ActionListener { /** * */ private static final long serialVersionUID = 1L;JTextField tf1;JTextField tf2;JLabel l;JButton b0;JPanel p1,p2,p3;JTextArea t1,t2,t3;JButton b1,b2,b3;JLabel l0,l1,l2,l3,l4;JTable table;Statement sta;Connection conn;ResultSet rs;DefaultTableModel dtm;String Vn[]=null;Vector int firstComplete[]=null;//存儲已判斷過first的數據 char first[][]=null;//存儲最后first結果 int followComplete[]=null;//存儲已判斷過follow的數據 char follow[][]=null;//存儲最后follow結果 char select[][]=null;//存儲最后select結果 int LL=0;//標記是否為LL(1)String vt_tou[]=null;//儲存Vt Object shuju[][]=null;//存儲表達式數據 char yn_null[]=null;//存儲能否推出空 LL1(){ setLocation(100,0);setSize(700,780);tf1=new JTextField(13);tf2=new JTextField(13);l=new JLabel(“>>”);l0=new JLabel(“輸入字符串:”);l1=new JLabel(“輸入的文 法”);l2=new JLabel(“ ”);l3=new JLabel(“ 分 析的結”);l4=new JLabel(“預測 分 析”);//p1=new JPanel(); p2=new JPanel();p3=new JPanel();t1=new JTextArea(24,20);t2=new JTextArea(1,30);t3=new JTextArea(24,40);b0=new JButton(“確定(S為開始)”);b1=new JButton(“ 判斷文法 ”); 為 :果:表 : b2=new JButton(“輸入”);b3=new JButton(“清空”);table=new JTable();JScrollPane jp1=new JScrollPane(t1);JScrollPane jp2=new JScrollPane(t2);JScrollPane jp3=new JScrollPane(t3);p2.add(tf1);p2.add(l);p2.add(tf2); p2.add(b0);p2.add(b1);p2.add(l0);p2.add(l2);p2.add(jp2);p2.add(b2);p2.add(b3); p2.add(l1);p2.add(l3);p2.add(jp1);p2.add(jp3); p3.add(l4);p3.add(new JScrollPane(table));add(p2,“Center”);add(p3,“South”); b0.addActionListener(this);b1.addActionListener(this);b2.addActionListener(this);b3.addActionListener(this);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);table.setPreferredScrollableViewportSize(new Dimension(660,200));setVisible(true);} public void actionPerformed(ActionEvent e){ if(e.getSource()==b0){ String a=tf1.getText();String b=tf2.getText();t1.append(a+'→'+b+'n');} if(e.getSource()==b1){ t3.setText(“");int Vnnum=0,k;Vn=new String[100];P=new Vector return;} if(s[i].charAt(0)<='Z'&&s[i].charAt(0)>='A'&&s[i].charAt(1)=='→'){ for(k=0;k if((flag=add_First(first[i],Vn[i],firstVn,flag))==-1)return;firstComplete[i]=1;} t3.append(”first集:“+”n“);//顯示FIRST** for(int i=0;Vn[i]!=null;i++){ t3.append(”first(“+Vn[i]+”)={ “);for(int j=0;first[i][j]!='
主站蜘蛛池模板:
国产精品理论片|
免费无码黄网站在线看|
欧美老人巨大xxxx做受视频|
少妇人妻无码专区在线视频|
天天做天天摸天天爽天天爱|
午夜亚洲国产理论片中文|
2023国产精品一卡2卡三卡4卡|
国产成人午夜福利在线小电影|
国产亚洲精品久久久999|
熟睡人妻被讨厌的公侵犯深田咏美|
亚洲国产成人久久一区|
欧美大片欧美激情性色a∨在线|
男人猛戳女人30分钟视频大全|
中文字幕无码日韩专区免费|
人妻精品久久无码专区涩涩|
国产裸体歌舞一区二区|
亚洲色大成网站www看下面|
久久久久亚洲AV色欲av|
精品蜜臀av在线天堂|
亚洲成熟女人av在线观看|
少妇无码一区二区三区|
男人激烈吮乳吃奶视频免费|
久章草在线精品视频免费观看|
国产真实乱对白精彩久久老熟妇女|
欧美日韩一卡2卡三卡4卡 乱码欧美孕交|
国99久9在线 | 传媒|
国产乱人伦av在线a|
无码日韩人妻av一区二区三区|
久热爱精品视频线路一|
国产成人精品视频国产|
av毛片无码中文字幕不卡|
人妻丰满熟妇aⅴ无码区|
国产白嫩护士被弄高潮|
亚洲精品无码专区在线在线播放|
色偷偷偷在线视频播放|
xxxxx欧美|
狠狠色噜噜狠狠狠777米奇|
精品免费一区二区三区在|
国产精品国产三级国产剧情|
久久精品人人做人人爱爱|
久久久无码视频|
第五篇:編譯原理 語法分析器 (java完美運行版)