南郵編譯原理實驗
A. 編譯原理 詞法分析
C語言詞法分析器
#include<iostream>
#include<stdio.h>
#include<string>
using namespace std;
FILE *f; //定義一個文件變數
static int line = 1; //表示游標所在的行數
struct ID{ char *name; int count;}id[100];//用於存放ID號碼
static int I = 0; //用於記錄ID存放的數量
int Number[100]; //用於存放數字
static int P = 0; //用於記錄存放數字的個數
int error[100] = {0}; //用於記錄錯誤所在的行數
static int K = 0; //記錄錯誤次數
void Error(); //記錄錯誤
void loginID(char *); //注冊ID號
void loginNumber(int &); //記錄數字
void noteLine(char &); //記錄游標所在的行數
void print(); //輸出分析結果
int same(char *chr); //判斷單詞是否已經存在
void Error()
{ error[K++] = line; }
void loginID(char *chr) //注冊ID號
{
int k = 0;
int h = 0;
for(int i = 0; i < I; i++)
{
if(!strcmp(chr,id.name)) //如果單詞已經存在
{
id.count++;
k = 1;
}
}
if(k == 0) //該單詞不存在
{
h = I + 1;
//I = h;
id[h].count++;
id[h].name = chr;
//strcpy(id[h].name ,chr);
}
}
void loginNumber(int &nu)
{ Number[P++] = nu; }
void noteLine(char &ch)
{
if ( ch == ' ' )
++line;
}
void print()//輸出部分
{
//cout << "關鍵字以及變數:" << endl;
//for(int i = 0; i < 100; i++)
//cout << i <<" " << id.name << " " << id.count << endl;
cout << "數字:" << endl;
for(int i = 1; i <= P; i++)
cout << i << ": " << Number[i-1] << endl;
if(error[0] != 0)
{
cout << "出現的錯誤!" << endl;
for(int i = 1; i <= K; i++)
cout << "第" << i << "個錯誤: " << "第" << error[i-1] << "行" << endl;
}
else cout << "沒有錯誤!" << endl;
}
//文件處理部分
void noblank( char &ch) //跳過空格,回車
{
noteLine(ch);
while(ch == ' ' || ch == ' ')
ch = fgetc(f);
}
void identifier(char name[],char &ch)//字母變數
{
int i;
for(i = 0; i < 20; i++)
name = '';
i = 0;
while (('0'<= ch && ch <= '9')||('a'<= ch&&ch <= 'z')||('A'<= ch&&ch <='Z'))
{
name = ch;
i++;
ch = fgetc(f);
}
loginID(name);
//for(int j = 0; j < i; j++)
//{cout << name[j];}
// cout << ' ';
}
int number(char &ch)//數字
{
int num=0;
while('0'<= ch && ch <= '9')
{
num = num* 10 + (ch-'0');
ch = fgetc(f);
}
if( ('a'<= ch&&ch <= 'z')||('A'<= ch&&ch <='Z'))
{
Error();
}
else if( ch == '.')
{;}
loginNumber(num); //記錄數字
return num;
}
void test(char &ch)//符號
{
char str[2]={'0/'};
if(ch == '*')
{ str[0] = ch; ch = fgetc(f);}
if(ch == '.')
{ str[0] = ch; ch = fgetc(f);}
if(ch == ',')
{ str[0] = ch; ch = fgetc(f);}
if(ch == '"')
{ str[0] = ch; ch = fgetc(f);}
if(ch == '/')
{ str[0] = ch; ch = fgetc(f);}
if(ch == '%')
{ str[0] = ch; ch = fgetc(f);}
if(ch == '^')
{ str[0] = ch; ch = fgetc(f);}
if(ch == '-')
{ str[0] = ch; ch = fgetc(f);}
if(ch == '{')
{ str[0] = ch; ch = fgetc(f);}
if(ch == '}')
{ str[0] = ch; ch = fgetc(f);}
if(ch == '[')
{ str[0] = ch; ch = fgetc(f);}
if(ch == ']')
{ str[0] = ch; ch = fgetc(f);}
if(ch == ';')
{str[0] = ch; ch = fgetc(f);}
if(ch == ':')
{ str[0] = ch; ch = fgetc(f);}
if(ch == '?')
{ str[0] = ch; ch = fgetc(f);}
if(ch == '(')
{ str[0] = ch; ch = fgetc(f);}
if(ch == ')')
{str[0] = ch; ch = fgetc(f);}
if(ch =='+')
{
str[0] = ch;
if((ch = fgetc(f)) == '+' )
{
str[1] = ch;
ch = fgetc(f);
//cout << str[0] << str[1] << endl;
}
//cout << str[0]<< endl;
}
if(ch == '-')
{
str[0] = ch;
if((ch = fgetc(f)) == '-' )
{
str[1] = ch;
ch = fgetc(f);
//cout << str[0] << str[1] << endl;
}
//cout << str[0]<< endl;
}
if(ch == '&')
{
str[0] = ch;
if((ch = fgetc(f)) == '&' )
{
str[1] = ch;
ch = fgetc(f);
//cout << str[0] << str[1] << endl;
}
//cout << str[0]<< endl;
}
if(ch == '|')
{
str[0] = ch;
if((ch = fgetc(f)) == '|' )
{
str[1] = ch;
ch = fgetc(f);
//cout << str[0] << str[1] << endl;
}
//cout << str[0]<< endl;
}
if(ch == '!')
{
str[0] = ch;
if((ch = fgetc(f)) == '=' )
{
str[1] = ch;
ch = fgetc(f);
//cout << str[0] << str[1] << endl;
}
//cout << str[0]<< endl;
}
if(ch == '=')
{
str[0] = ch;
if((ch = fgetc(f)) == '=' )
{
str[1] = ch;
ch = fgetc(f);
//cout << str[0] << str[1] << endl;
}
}
if(ch == '>')
{
str[0] = ch;
if((ch = fgetc(f)) == '=' )
{
str[1] = ch;
ch = fgetc(f);
//cout << str[0] << str[1] << endl;
}
else
if(ch == '>' )
{
str[1] = ch;
ch = fgetc(f);
//cout << str[0] << str[1] << endl;
}
}
if(ch == '<')
{
str[0] = ch;
if((ch = fgetc(f)) == '=' )
{
str[1] = ch;
ch = fgetc(f);
}
else
if(ch == '<' )
{
str[1] = ch;
ch = fgetc(f);
}
}
}
int main()
{
char ch;
char name[30];
for(int i = 0; i < 30; i++)
name = '/0';
f = fopen("c.txt","r"); //打開指定輸入文件
if (f == NULL)
cout<<"文件不存在!"<<endl;
ch = fgetc(f);
while(!feof(f))
{
noblank( ch ); //跳過回車,空格
if( ( ch >= 'a' && ch <= 'z' )||( ch >= 'A' && ch <= 'Z' ))
{ identifier(name,ch); } //處理字母
else if( ch >= '0'&& ch <= '9')
{ number(ch); } //處理數字
else
{ test(ch); } //處理符號
}
print(); //列印詞法分析結果
fclose(f); //關閉文件
system("pause");
return 0;
}
B. 編譯原理實驗二 LL(1)分析法
通過完成預測分析法的語法分析程序,了解預測分析法和遞歸子程序法的區別和聯系。使學生了解語法分析的功能,掌握語法分析程序設計的原理和構造方法,訓練學生掌握開發應用程序的基本方法。有利於提高學生的專業素質,為培養適應社會多方面需要的能力。
根據某一文法編制調試 LL(1)分析程序,以便對任意輸入的符號串進行分析。
構造預測分析表,並利用分析表和一個棧來實現對上述程序設計語言的分析程序。
分析法的功能是利用LL(1)控製程序根據顯示棧棧頂內容、向前看符號以及LL(1)分析表,對輸入符號串自上而下的分析過程。
對文法 的句子進行不含回溯的自上向下語法分析的充分必要條件是:
(1)文法不含左遞歸;
(2)對於文法中的每一個非終結符 的各個產生式的候選首符集兩兩不相交,即,若
Follow集合構造:
對於文法 的每個非終結符 構造 的演算法是,連續使用下面的規則,直至每個 不再增大為止:
僅給出核心部分
(1) GrammerSymbol.java
(2) GrammerSymbols.java
(3) Grammer.java
(4) LL1Grammer.java
C. 編譯原理 詞法分析程序的設計與實現實驗題
說他像蒼蠅,是罵蒼蠅呢還是罵他呢?
D. 0513《編譯原理》作業要求 設計並實現TINYC語言的掃描程序;
你的作業還在不在,能否借我一用,酬謝
E. 南京郵電大學的計算機專業怎麼樣啊南郵轉專業好轉嗎
計算機在南郵算不錯的專業。。。
南郵轉專業條件比較苛刻~~所以極其困難~~~
轉進通信工程的 大一大二 每年全校才8-9個人~~
隨便說說。新生既然專業已訂,不要動不動就問可不可以轉專業,先好好學完你的大一再說。
說白了,一百個說想轉專業的新生中能有一個轉成就不錯了。
也沒必要問自己的專業好不好,即使是學長學姐也回答不了這種問題。
【下面提供你兩個資料:轉專業細則 和 計算機專業介紹】
---------------------------------------------------------------------------------------------------------------------
一、總 則
第一條 為充分體現「以人為本、以學生為中心」的教學管理理念,不斷完善學生自我構建知識結構的管理機制,充分發揮學生的個性、特長,尊重學生的志向和愛好,進一步調動學生的學習積極性、主動性,使學生有更多的自主選擇和發展的機會,特製定本規定。
第二條 學校對轉專業的年級和學生人數實行宏觀控制,原則上允許一、二年級的學生轉專業,一年級轉專業學生人數控制在全年級總人數的5%以內;二年級控制在3%以內。
第三條 學生提出轉專業申請,只限於第二學期和第四學期。每年5月上旬為受理時間,5月中旬為接收院系甄別考試時間,5月下旬進行學校評審,6月上旬公布轉專業學生名單。
二、轉專業資格
第四條 凡提出申請轉專業的學生,應具備下列條件之一:
(一)思想品質與學習成績優良,智育排名在本專業前10%(含10%)以內;
(二)對所轉專業有一定的特長和志向,經學校認可,確有某種特殊困難,不轉專業無法繼續學習的學生,需滿足以下條件之一:
1.從工學電氣信息類、理學電子信息科學類專業轉入經濟學、管理學、教育學、文學學科我校所設專業學習;
2.申請轉專業的學生只能從生源省份入學當年錄取平均分高的專業轉入錄取平均分低的專業,當申請轉入專業在學生生源省份入學當年沒招生時,以江蘇省當年相應轉入、轉出專業錄取平均分為依據。
(三)學校因專業調整或停辦,保留入學資格並重新辦理入學手續的學生或學籍異動的學生,不轉專業無法繼續學習的,由學校根據實際情況,安排申請者轉入有關專業。
第五條 有下列情況之一者,不得申請轉專業:
(一)在校期間受到警告(含警告)以上處分者;
(二)在校期間已有一次轉專業記錄者;
(三)已取消學籍或應予退學者。
三、轉專業程序
第六條 各院系根據所在專業畢業生就業情況、師資、實驗條件等狀況,按照不超過接收專業年級總人數的3%的比例提出能接收外專業轉入學生人數並報教務處。
第七條 教務處根據教學條件,確定並統一公布各專業接收轉專業人數。
第八條 凡需申請轉專業的學生在規定時間內,須向所在院系提出書面申請,填寫《南京郵電大學學生轉專業申請表》並附家長(或監護人)同意的書面意見,報主管教學院長(系主任)審批,經所在院系同意後,報教務處。
第九條 教務處匯總各院系申請轉專業學生名單並進行資格預審,教務處預審同意轉專業的學生,參加轉入院系組織的考試、考核。
第十條 接收院系要認真組織好申請轉專業學生的考核工作,對於符合第四條第一款的學生,考核應採取閉卷筆試的方式,著重考核學生轉入專業的基礎要求;對於符合第四條第二款的學生,考核應採取閉卷筆試與面試相結合的方式,著重考核學生轉入專業的基礎要求以及特長表現。接收院系根據考核情況和參考學生當學期期中考試成績,提出能否接收的意見,並報教務處。
第十一條 教務處根據各院系轉專業學生考核情況,提出初審意見,並報校級評審小組(由校監察處、教務處、學工處等部門負責人組成)討論通過後由主管校長批准,上網公布。
第十二條 經學校同意轉專業的學生,由教務處通知學生所在院系和接收院系,學生憑所在院系轉專業通知書辦理轉專業手續。
四、學籍管理與學分記載
第十三條 學校對轉專業的學生按照轉入專業的培養計劃進行學籍管理。
第十四條 學校對轉專業學生的學分按下列規定計算:
(一)與轉入專業同檔或高一檔的通識基礎課、學科基礎課和專業基礎課程學分仍然有效。低於轉入專業的通識基礎課、學科基礎課和專業基礎課程必須補修。
(二)學生轉專業前獲得的課程學分與轉入專業培養計劃無關的,可計算為選修課學分(具體見各專業培養計劃)。
五、附 則
第十五條 國防生轉專業按照國防生相關管理規定執行。
第十六條 本規定自2008年9月1日起執行,由教務處負責解釋。
--------------------------------------------------------------------------------------------------------------------
計算機科學與技術專業
(本科、四年制)
本專業培養具有良好的科學素養和創新能力,系統地掌握計算機科學與技術,包括計算機軟體、硬體、計算機通信與應用的基本理論、方法與技能,能從事計算機科學研究和應用或軟硬體開發和技術管理的高級專業技術人才。
本專業學生主要學習計算機科學與技術方面的基本理論和基礎知識,接受從事研究計算機理論與應用計算機技術的基本訓練,具有研究和開發計算機系統的基本能力。本專業的學生按照教學計劃修滿所規定的學分後,符合南京郵電大學全日制本科畢業學士學位授予條件的將被授予工學學士學位。
主要課程有:高級語言程序設計、電工電子技術基礎、數字電路與邏輯設計、離散數學、數據結構、操作系統、計算機組成原理、軟體工程、微型計算機介面技術、計算機系統結構、資料庫系統、編譯原理、通信原理、計算機通信與網路、TCP/IP網路設計與實現、現代通信技術、計算機網路編程技術、演算法分析與設計、嵌入式系統開發、網路信息安全等。
本專業繼續深造的方向有計算機應用技術、計算機軟體與理論、通信與信息系統等。
本專業學生畢業後,可在政府機關、科研部門、企事業單位和高等院校,特別是信息技術領域從事計算機軟體、計算機應用、計算機
通信和網路等方面的研究、設計、開發和技術管理等工作。
---------------------------------------------------------------------------------------------------------------------
學弟好~~~
F. 有人知道編譯原理實驗之詞法分析器用C++怎麼做嗎
#include "globals.h"
#include "util.h"
#include "scan.h"
#include "parse.h"
static TokenType token; /* holds current token */
/* function prototypes for recursive calls */
static TreeNode * stmt_sequence(void);
static TreeNode * statement(void);
static TreeNode * if_stmt(void);
static TreeNode * repeat_stmt(void);
static TreeNode * assign_stmt(void);
static TreeNode * read_stmt(void);
static TreeNode * write_stmt(void);
static TreeNode * exp(void);
static TreeNode * simple_exp(void);
static TreeNode * term(void);
static TreeNode * factor(void);
static void syntaxError(char * message)
{ fprintf(listing,"\n>>> ");
fprintf(listing,"Syntax error at line %d: %s",lineno,message);
Error = TRUE;
}
static void match(TokenType expected)
{ if (token == expected) token = getToken();
else {
syntaxError("unexpected token -> ");
printToken(token,tokenString);
fprintf(listing," ");
}
}
TreeNode * stmt_sequence(void)
{ TreeNode * t = statement();
TreeNode * p = t;
while ((token!=ENDFILE) && (token!=END) &&
(token!=ELSE) && (token!=UNTIL))
{ TreeNode * q;
match(SEMI);
q = statement();
if (q!=NULL) {
if (t==NULL) t = p = q;
else /* now p cannot be NULL either */
{ p->sibling = q;
p = q;
}
}
}
return t;
}
TreeNode * statement(void)
{ TreeNode * t = NULL;
switch (token) {
case IF : t = if_stmt(); break;
case REPEAT : t = repeat_stmt(); break;
case ID : t = assign_stmt(); break;
case READ : t = read_stmt(); break;
case WRITE : t = write_stmt(); break;
default : syntaxError("unexpected token -> ");
printToken(token,tokenString);
token = getToken();
break;
} /* end case */
return t;
}
TreeNode * if_stmt(void)
{ TreeNode * t = newStmtNode(IfK);
match(IF);
if (t!=NULL) t->child[0] = exp();
match(THEN);
if (t!=NULL) t->child[1] = stmt_sequence();
if (token==ELSE) {
match(ELSE);
if (t!=NULL) t->child[2] = stmt_sequence();
}
match(END);
return t;
}
TreeNode * repeat_stmt(void)
{ TreeNode * t = newStmtNode(RepeatK);
match(REPEAT);
if (t!=NULL) t->child[0] = stmt_sequence();
match(UNTIL);
if (t!=NULL) t->child[1] = exp();
return t;
}
TreeNode * assign_stmt(void)
{ TreeNode * t = newStmtNode(AssignK);
if ((t!=NULL) && (token==ID))
t->attr.name = String(tokenString);
match(ID);
match(ASSIGN);
if (t!=NULL) t->child[0] = exp();
return t;
}
TreeNode * read_stmt(void)
{ TreeNode * t = newStmtNode(ReadK);
match(READ);
if ((t!=NULL) && (token==ID))
t->attr.name = String(tokenString);
match(ID);
return t;
}
TreeNode * write_stmt(void)
{ TreeNode * t = newStmtNode(WriteK);
match(WRITE);
if (t!=NULL) t->child[0] = exp();
return t;
}
TreeNode * exp(void)
{ TreeNode * t = simple_exp();
if ((token==LT)||(token==EQ)) {
TreeNode * p = newExpNode(OpK);
if (p!=NULL) {
p->child[0] = t;
p->attr.op = token;
t = p;
}
match(token);
if (t!=NULL)
t->child[1] = simple_exp();
}
return t;
}
TreeNode * simple_exp(void)
{ TreeNode * t = term();
while ((token==PLUS)||(token==MINUS))
{ TreeNode * p = newExpNode(OpK);
if (p!=NULL) {
p->child[0] = t;
p->attr.op = token;
t = p;
match(token);
t->child[1] = term();
}
}
return t;
}
TreeNode * term(void)
{ TreeNode * t = factor();
while ((token==TIMES)||(token==OVER))
{ TreeNode * p = newExpNode(OpK);
if (p!=NULL) {
p->child[0] = t;
p->attr.op = token;
t = p;
match(token);
p->child[1] = factor();
}
}
return t;
}
TreeNode * factor(void)
{ TreeNode * t = NULL;
switch (token) {
case NUM :
t = newExpNode(ConstK);
if ((t!=NULL) && (token==NUM))
t->attr.val = atoi(tokenString);
match(NUM);
break;
case ID :
t = newExpNode(IdK);
if ((t!=NULL) && (token==ID))
t->attr.name = String(tokenString);
match(ID);
break;
case LPAREN :
match(LPAREN);
t = exp();
match(RPAREN);
break;
default:
syntaxError("unexpected token -> ");
printToken(token,tokenString);
token = getToken();
break;
}
return t;
}
/****************************************/
/* the primary function of the parser */
/****************************************/
/* Function parse returns the newly
* constructed syntax tree
*/
TreeNode * parse(void)
{ TreeNode * t;
token = getToken();
t = stmt_sequence();
if (token!=ENDFILE)
syntaxError("Code ends before file\n");
return t;
}
上面是一個語法分析器的主代碼部分它可以識別類似下面的代碼,但是由於篇幅有限,上面的代碼不是完整代碼,完整代碼太長,還有好幾個文件。
read x; { input an integer }
if 0 < x then { don't compute if x <= 0 }
fact := 1;
repeat
fact := fact * x;
x := x - 1
until x = 0;
write fact { output factorial of x }
end
G. 編譯原理語法分析實驗問題
錯誤1:在3.txt中,第二個表達式x:=2*3,在編譯器裡面沒有對*符號進行解釋,這個應補充,或者改掉*為+。
錯誤2:代碼中出現3次類似syn==15||16的代碼,我理解應該是(syn==15)||(syn==16)
改掉這兩點後代碼可以正常運行。
建議:寫代碼是一項工作,更是一個創作過程,建議你按照代碼寫作規范來寫,這樣的代碼清晰易讀,易於交流和糾錯。
H. 急!有誰知道南京郵電大學計算機專業考研需要考哪些科,有參考書最好!
南京郵電大學計算機學院
081202計算機軟體與理論2007 招生目錄(本專業招生 52 人)
研究方向
01軟體技術及其在通信中的應用
02基於網路的計算機軟體應用技術
03網路環境下的軟體開發技術
04數據倉庫與決策支持系統
初試科目
①101政治理論
②201英語
③301數學一
④413通信系統原理或416微機原理及應用或417數據結構
參考書目
413通信系統原理
《通信原理》(第五版)(前八章為主) 樊昌信等國防工業出版社
416微機原理及應用
《 微型計算機系統原理及應用》周明德主編清華大學出版社
《32位微型計算機原理與介面技術》仇玉章主編清華大學出版社
417數據結構
《數據結構——使用C++語言描述》 陳慧南主編 東南大學出版社
《數據結構-C語言描述》 陳慧南主編 西安電子科技大學出版社
《數據結構》 (pascal語言描述) 嚴蔚敏,吳偉民編清華大學出版社
復試備注 復試:1編譯原理2數據結構(二選一)
081020信息安全2007 招生目錄(本專業招生 10 人)
研究方向
01通信系統的信息安全
02計算機通信網與安全
03信息安全理論與技術
04計算機取證技術
初試科目
①101政治理論
②201英語
③301數學一
④413通信系統原理或416微機原理及應用或417數據結構
參考書目
416微機原理及應用
《 微型計算機系統原理及應用》周明德主編清華大學出版社
《32位微型計算機原理與介面技術》仇玉章主編清華大學出版
417數據結構
《數據結構——使用C++語言描述》 陳慧南主編 東南大學出版社
《數據結構-C語言描述》 陳慧南主編 西安電子科技大學出版社
《數據結構》 (pascal語言描述) 嚴蔚敏,吳偉民編清華大學出版社
413通信系統原理
《通信原理》(第五版)(前八章為主) 樊昌信等國防工業出版社
復試備注 復試:1網路信息安全2密碼學3操作系統(三選一)
081201計算機系統結構2007 招生目錄(本專業招生 10 人)
研究方向
01嵌入式技術及其在通信中的應用
02智能計算技術方法及其體系結構與應用
03網路體系結構及其在通信中的應用
04並行計算及其體系結構
初試科目
①101政治理論
②201英語
③301數學一
④413通信系統原理或416微機原理及應用或417數據結構
參考書目
416微機原理及應用
《 微型計算機系統原理及應用》周明德主編清華大學出版社
《32位微型計算機原理與介面技術》仇玉章主編清華大學出版
417數據結構
《數據結構——使用C++語言描述》 陳慧南主編 東南大學出版社
《數據結構-C語言描述》 陳慧南主編 西安電子科技大學出版社
《數據結構》 (pascal語言描述) 嚴蔚敏,吳偉民編清華大學出版社
413通信系統原理
《通信原理》(第五版)(前八章為主) 樊昌信等國防工業出版社
復試備注 復試:1計算機組成原理 2數據結構(二選一)
081203計算機應用技術2007 招生目錄(本專業招生 85 人)
研究方向
①101政治理論
②201英語
③301數學一
④413通信系統原理或416微機原理及應用或417數據結構
初試科目
①101政治理論
②201英語
③301數學一
④413通信系統原理或416微機原理及應用或417數據結構
參考書目
416微機原理及應用
《 微型計算機系統原理及應用》周明德主編清華大學出版社
《32位微型計算機原理與介面技術》仇玉章主編清華大學出版
417數據結構
《數據結構——使用C++語言描述》 陳慧南主編 東南大學出版社
《數據結構-C語言描述》 陳慧南主編 西安電子科技大學出版社
《數據結構》 (pascal語言描述) 嚴蔚敏,吳偉民編清華大學出版社
413通信系統原理
《通信原理》(第五版)(前八章為主) 樊昌信等國防工業出版社
復試備注 復試:1微機原理及應用2數據結構(二選一)
I. 編譯原理課程設計-詞法分析器設計(C語言)
#include"stdio.h"/*定義I/O庫所用的某些宏和變數*/
#include"string.h"/*定義字元串庫函數*/
#include"conio.h"/*提供有關屏幕窗口操作函數*/
#include"ctype.h"/*分類函數*/
charprog[80]={'
