❶ 編譯原理中 確定的有窮自動機和不確定的有窮自動機有什麼區別
確定的有窮自動機就是說當一個狀態面對一個輸入符號的時候,它所轉換到的是一個唯一確定的狀態;
而不確定的有窮自動機是說當一個狀態面對一個輸入符號的時候,它所轉換到的可能不只一個狀態,可以是一個狀態集合。
這就是兩者的主要區別。
還有就是DFA的開始狀態是唯一的,而NFA的開始狀態是一個開始狀態集。
❷ 編譯原理 詞法分析
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;
}
❸ 請問計算機軟體水平考試用書是什麼
參加軟體考試的用書:
1、《軟體設計師教程》教育部指定的教材
2、《軟體設計師歷年試題解析》
3、《軟體設計師大綱》
學習內容:
1、軟體工程
這是復習的重點,不但上午題佔10左右,而且下午題里也有2道軟體設計分析方面的題目,一定要熟練掌握書本中說到的各種軟體分析設計方法及有關的分析用圖。
2、資料庫
要對關系資料庫的基礎概念非常清楚,如鍵的定義,函數依賴,範式的定義、作用及轉換是建立關系的基礎。數據的並發控制,要熟練掌握SQL常用的幾個語句。
3、學習數據結構和演算法
數據結構和演算法是考試的重點內容,它的復習以普通的教材為主,對數組、鏈表、隊列、棧、樹及堆等基本的數據組織方式要非常熟悉。
4、程序設計語言
程序設計語言包括C語言、編譯原理和面向對象的程序設計語言(通常以C++為例)。編譯原理一定會考詞法分析,它是後面編譯過程的基礎。主要考的內容是NFA與DFA的轉換、正規式與有窮自動機的轉換等。
5、面向對象方法學
面向對象方法學不但是上午的考試重點,也是下午的考試重點。上午平均有12分左右,而下午有30分,一道與UML圖形有關的題目,一道面向對象程序設計的選做題。
6、操作系統
處理器的管理、存儲管理、設備管理、文件管理及系統安全。
❹ 求編譯原理的名詞解釋題
詞法分析(Lexical analysis或Scanning)和詞法分析程序(Lexical analyzer或Scanner)
詞法分析階段是編譯過程的第一個階段。這個階段的任務是從左到右一個字元一個字元地讀入源程序,即對構成源程序的字元流進行掃描然後根據構詞規則識別單詞(也稱單詞符號或符號)。詞法分析程序實現這個任務。詞法分析程序可以使用lex等工具自動生成。
語法分析(Syntax analysis或Parsing)和語法分析程序(Parser)
語法分析是編譯過程的一個邏輯階段。語法分析的任務是在詞法分析的基礎上將單詞序列組合成各類語法短語,如「程序」,「語句」,「表達式」等等.語法分析程序判斷源程序在結構上是否正確.源程序的結構由上下文無關文法描述.
語義分析(Syntax analysis)
語義分析是編譯過程的一個邏輯階段. 語義分析的任務是對結構上正確的源程序進行上下文有關性質的審查, 進行類型審查.例如一個C程序片斷:
int arr[2],b;
b = arr * 10;
源程序的結構是正確的.
語義分析將審查類型並報告錯誤:不能在表達式中使用一個數組變數,賦值語句的右端和左端的類型不匹配.
Lex
一個詞法分析程序的自動生成工具。它輸入描述構詞規則的一系列正規式,然後構建有窮自動機和這個有窮自動機的一個驅動程序,進而生成一個詞法分析程序.
Yacc
一個語法分析程序的自動生成工具。它接受語言的文法,構造一個LALR(1)分析程序.因為它採用語法制導翻譯的思想,還可以接受用C語言描述的語義動作,從而構造一個編譯程序. Yacc 是 Yet another compiler compiler的縮寫.[回頁首]
源語言(Source language)和源程序(Source program)
被編譯程序翻譯的程序稱為源程序,書寫該程序的語言稱為源語言.[回頁首]
目標語言(Object language or Target language)和目標程序(Object program or Target program)
編譯程序翻譯源程序而得到的結果程序稱為目標程序, 書寫該程序的語言稱為目標語言.[回頁首]
中間語言(中間表示)(Intermediate language(representation))
在進行了語法分析和語義分析階段的工作之後,有的編譯程序將源程序變成一種內部表示形式,這種內部表示形式叫做中間語言或中間表示或中間代碼。所謂「中間代碼」是一種結構簡單、含義明確的記號系統,這種記號系統復雜性介於源程序語言和機器語言之間,容易將它翻譯成目標代碼。另外,還可以在中間代碼一級進行與機器無關的優化。
[回頁首]
文法(Grammars)
文法是用於描述語言的語法結構的形式規則。文法G定義為四元組(,,,)。其中為非終結符號(或語法實體,或變數)集;為終結符號集;為產生式(也稱規則)的集合;產生式(規則)是形如或 a ::=b 的(a , b)有序對,其中(∪)且至少含有一個非終結符,而(∪)。,和是非空有窮集。稱作識別符號或開始符號,它是一個非終結符,至少要在一條規則中作為左部出現。
一個文法的例子: G=(={A,R},={0,1} ,={A?0R,A?01,R?A1},=A) [回頁首]
文法分類(A hierarchy of Grammars)
著名語言學家Noam Chomsky定義了四類文法和四種形式語言類,文法的四種類型分別是0型、1型、2型和3型。幾類文法的差別在於對產生式施加不同的限制,分別是:
0型文法(短語結構文法)(phrase structure grammars):
設G=(,,,),如果它的每個產生式是這樣一種結構: (∪) 且至少含有一個非終結符,而(∪),則G是一個0型文法。
1型文法(上下文有關文法)(context-sensitive grammars):
設G=(,,,)為一文法,若中的每一個產生式均滿足|,僅僅 除外,則文法G是1型或上下文有關的。
2型文法(上下文無關文法)(context-free grammars):
設G=(,,,),若P中的每一個產生式滿足:是一非終結符,(∪) 則此文法稱為2型的或上下文無關的。
3型文法(正規文法)(regular grammars):
設G=(,,,),若中的每一個產生式的形式都是A→aB或A→a,其中A和B都是非終結,a是終結符,則G是3型文法或正規文法。
0型文法產生的語言稱為0型語言。
1型文法產生的語言稱為1型語言,也稱作上下文有關語言。
2型文法產生的語言稱為2型語言,也稱作上下文無關語言。
3型文法產生的語言稱為3型語言,也稱作正規語言。
❺ 誰知道編譯原理中的有窮自動機是怎麼回事
即是有限自動機.在一個有限的狀態集中,當前狀態根據有窮字母表的輸入符號,確定下一個狀態.有限自動機只有一個初態,可以有幾個終態
❻ 如何通俗易懂地解釋編譯原理中語法分析的過程
分成詞法分析,語法分析(LL演算法,遞歸下降演算法,LR演算法),語義分析,運行時環境,中間代碼,代碼生成,代碼優化這些部分。其實現在很多編譯原理的教材都是按照85,86出版的那本龍書來安排教學內容的,所以那本龍書的內容格式幾乎成了現在編譯原理教材的定式,包括國內的教材也是如此。一般來說,大學裡面的本科教學是不可能把上面的所有部分都認真講完的,而是比較偏重於前面幾個部分。像代碼優化那部分東西,就像個無底洞一樣,如果要認真講,就是單獨開一個學期的課也不可能講得清楚。所以,一般對於本科生,對詞法分析和語法分析掌握要求就相對要高一點了。
詞法分析相對來說比較簡單。可能是詞法分析程序本身實現起來很簡單吧,很多沒有學過編譯原理的人也同樣可以寫出各種各樣的詞法分析程序。不過編譯原理在講解詞法分析的時候,重點把正則表達式和自動機原理加了進來,然後以一種十分標準的方式來講解詞法分析程序的產生。這樣的做法道理很明顯,就是要讓詞法分析從程序上升到理論的地步。
語法分析部分就比較麻煩一點了。現在一般有兩種語法分析演算法,LL自頂向下演算法和LR自底向上演算法。LL演算法還好說,到了LR演算法的時候,困難就來了。很多自學編譯原理的都是遇到LR演算法的理解成問題後就放棄了自學。其實這些東西都是只要大家理解就可以了,又不是像詞法分析那樣非得自己寫出來才算真正的會。像LR演算法的語法分析器,一般都是用工具Yacc來生成,實踐中完全沒有比較自己來實現。對於LL演算法中特殊的遞歸下降演算法,因為其實踐十分簡單,那麼就應該要求每個學生都能自己寫。當然,現在也有不少好的LL演算法的語法分析器,不過要是換在非C平台,比如Java,Delphi,你不能運用YACC工具了,那麼你就只有自己來寫語法分析器。
❼ 請問計算機軟體水平考試用書是什麼
參加軟體考試的用書:
1、《軟體設計師教程》教育部指定的教材
2、《軟體設計師歷年試題解析》
3、《軟體設計師大綱》
/iknow-pic.cdn.bcebos.com/f7246b600c3387446fecad055e0fd9f9d72aa09a"target="_blank"title="點擊查看大圖"class="illustration_alink">/iknow-pic.cdn.bcebos.com/f7246b600c3387446fecad055e0fd9f9d72aa09a?x-bce-process=image%2Fresize%2Cm_lfit%2Cw_600%2Ch_800%2Climit_1%2Fquality%2Cq_85%2Fformat%2Cf_auto"esrc="https://iknow-pic.cdn.bcebos.com/f7246b600c3387446fecad055e0fd9f9d72aa09a"/>
學習內容:
1、軟體工程
這是復習的重點,不但上午題佔10左右,而且下午題里也有2道軟體設計分析方面的題目,一定要熟練掌握書本中說到的各種軟體分析設計方法及有關的分析用圖。
2、資料庫
要對關系資料庫的基礎概念非常清楚,如鍵的定義,函數依賴,範式的定義、作用及轉換是建立關系的基礎。數據的並發控制,要熟練掌握SQL常用的幾個語句。
3、學習數據結構和演算法
數據結構和演算法是考試的重點內容,它的復習以普通的教材為主,對數組、鏈表、隊列、棧、樹及堆等基本的數據組織方式要非常熟悉。
4、程序設計語言
程序設計語言包括C語言、編譯原理和面向對象的程序設計語言(通常以C++為例)。編譯原理一定會考詞法分析,它是後面編譯過程的基礎。主要考的內容是NFA與DFA的轉換、正規式與有窮自動機的轉換等。
5、面向對象方法學
面向對象方法學不但是上午的考試重點,也是下午的考試重點。上午平均有12分左右,而下午有30分,一道與UML圖形有關的題目,一道面向對象程序設計的選做題。
6、操作系統
處理器的管理、存儲管理、設備管理、文件管理及系統安全。
❽ 考「軟考」的軟體設計師,該看什麼書
要參加軟體設計師的考試,務必購買兩本書:
《軟體設計師教程》《教程》建議買教育部指定的教材,
《軟體設計師歷年試題解析》。《解析》倒也無所謂,張友生老師的分析似乎更全面、更有針對性。
另外還有《軟體設計師大綱》,在復習過程中階段性地查一查,梳理一下知識結構體系,可以查缺補漏。
1、具體學習每門課程的方法
(1)軟體工程。軟體工程是復習的重點,不但上午題當中佔10左右,而且下午題里也有2道軟體設計分析方面的題目,一定要熟練的掌握書本中說到的各種軟體分析設計方法及有關的分析用圖,對各種圖的功能作用和製作方法(特別是各種圖的組成元素)以及各種圖之間的轉換及聯系(如果有的話),UML面向對象的軟體設計方法及面象過程的軟體設計方法完全理解,軟體測試要達到理解的程度,其它的內容只有去強記了,因為基本是都是上午題,而且每年的題都不定,但與CMM有關的一定會有。
(2)資料庫。資料庫部分也很重要,上午有5分左右,下午至少有一道資料庫的題目,而且也一定是考關系型資料庫,E-R模式也要搞懂,可由它導出關系,一定要弄懂關系資料庫的幾個範式及關系的建立方法。
因此,就要對關系資料庫的基礎概念非常清楚,如鍵的定義,函數依賴,範式的定義、作用及轉換是建立關系的基礎。數據的並發控制,要熟練掌握SQL常用的幾個語句,最好是用筆將每個語句寫上幾遍,對語句的各種形式加深記憶,資料庫的學習還是不太難的。因為考試不會考數據的物理存儲及數據安全,感覺這方面的知識更難,交叉學科更多。
(3)學習數據結構和演算法。數據結構和演算法是考試的重點內容,它的復習以普通的教材為主,對數組、鏈表、隊列、棧、樹及堆等基本的數據組織方式要非常熟悉(要做到看見演算法就知道要用什麼數據組織方式更高效),排序、索引及圖的各種演算法要瞭然於心(演算法的分析過程及代碼要非常清楚),演算法的分析方法達到理解應用的水平。
對C語言要非常熟練(要會應用C語言語句的一些技巧,如可以利用函數的返回值做為判定條件,在循環中對數組的處理可使用a[i++]來提高編寫代碼的效率,這類的小技巧只有通過大量的閱讀代碼才能提高),如果是初學面向對象方面的高級語言,建議還是先學C++,感覺它更象一種語言規范,而Java是一種編程的工具並且由於它的跨平台特性所以它有很多自己獨有的功能和特點,有時間一定要看一本C++語言的數據結構,它能使你更全面和深刻的理解類及對象的編程方法。
演算法的學習不是一朝一夕就能提高的,一定要靜下心來學習一些經典演算法,比如:窮舉法、貪婪法、分治法、迭代法、遞推法、遞歸法、回溯法;找一些有名的演算法程序來分析,比如:背包問題、組合問題、斐波那契數列、馬踏棋盤問題、貨朗擔問題、八皇後問題、迷宮問題、漢諾塔問題、約琴夫環問題等。
有了這些演算法思想在你的頭腦中紮根後,當看到問題,就自然的想起用什麼方法來求最優解了。
(4)程序設計語言。程序設計語言包括C語言、編譯原理和面向對象的程序設計語言(通常以C++為例)。編譯原理一定會考詞法分析,它是後面編譯過程的基礎。主要考的內容是NFA與DFA的轉換、正規式與有窮自動機的轉換等。
文法分析有一年考過下午題,這科對初學者比較難,比較抽象,理論性也比較強,反正我是學了4個來月才學通一點,這課復習沒什麼技巧,聽聽希賽的「編譯原理視頻教程」,學起來更快一些。
C語言要掌握好三種基本結構、數組、鏈表、結構體、共用體、參數傳遞、指針及指針數組、指針函數等等。面向對象的程序設計語言要對基本概念及初步應用要了解,考得不深。
(5)面向對象方法學。面向對象方法學不但是上午的考試重點,也是下午的考試重點。上午平均有12分左右,而下午有30分,一道與UML圖形有關的題目,一道面向對象程序設計的選做題。所以要好好掌握這一塊。UML當中的類圖、用例圖、狀態圖、協作圖要掌握好,考試中會常出現。(老師多次強調這個要學習的知識點,我通過做題,認為老師抓的很准。)
(6)操作系統。操作系統沒什麼說得了,把它的幾個功能模塊搞清楚及相關的演算法搞清楚就好了,如處理器的管理、存儲管理、設備管理、文件管理及系統安全,其中我認為比較難理解的是PV操作(在並發進程中它的應用非常靈活)和中斷(反正這個對我比較難),一定要把相關內容所講到的演算法及分析過程搞懂。當然還要注意進程死鎖的問題,段頁式存儲的問題。
其它課程的復習就按考試大綱進行,把裡面的概念搞清楚,因為它大部分都是上午題。
2、看書與練習相結合
「看書時要有目的性,帶著任務走,;看後做題進行鞏固,所以看了書以後,要找一兩個相關的題來做一做。
❾ 編譯原理的作業,求助啊。
這是我查了之後東拼西湊寫到暑假作業本上的,僅供參考 求助電話:110使用條件:發生緊急突發狀況,需要報警、求助時使用方法:向接電話者迅速、准確、清晰地說明發生的事件、發生的時間、地點、現狀,並留下自己的...
❿ 編譯原理詞法分析
編譯的詞法分析,一般是先畫一個狀態轉換圖,一般是有多少分支,就有多少if語句,分支裡面再分(可能有循環語句)。注意記住詞的類別和詞的字元串,請以以下代碼為例,理會一下詞法分析的大致過程。
while(s[i]!='#')
{
while(s[i]==' '||s[i]=='\t'||s[i]=='\n')
{
if(s[i]=='\n')
line++;
i++;
}
if(s[i]=='#')
break;
j=i;
if(s[i]>='a'&&s[i]<='z'||s[i]>='A'&&s[i]<='Z')
{
i++;
while(s[i]>='a'&&s[i]<='z'||s[i]>='A'&&s[i]<='Z'||s[i]>='0'&&s[i]<='9')
i++;
if((i-j)==2&&s[j]=='i'&&s[j+1]=='f')
{
strcpy(dancishuzu[dancigeshu].name,"if");
dancishuzu[dancigeshu].bianhao=4;
dancigeshu++;
}
else if((i-j)==3&&s[j]=='i'&&s[j+1]=='n'&&s[j+2]=='t')
{
strcpy(dancishuzu[dancigeshu].name,"int");
dancishuzu[dancigeshu].bianhao=2;
dancigeshu++;
}
else if((i-j)==3&&s[j]=='f'&&s[j+1]=='o'&&s[j+2]=='r')
{
strcpy(dancishuzu[dancigeshu].name,"for");
dancishuzu[dancigeshu].bianhao=6;
dancigeshu++;
}
else if((i-j)==4&&s[j]=='m'&&s[j+1]=='a'&&s[j+2]=='i'&&s[j+3]=='n')
{
strcpy(dancishuzu[dancigeshu].name,"main");
dancishuzu[dancigeshu].bianhao=1;
dancigeshu++;
}
else if ((i-j)==4&&s[j]=='c'&&s[j+1]=='h'&&s[j+2]=='a'&&s[j+3]=='r')
{
strcpy(dancishuzu[dancigeshu].name,"char");
dancishuzu[dancigeshu].bianhao=3;
dancigeshu++;
}
else if ((i-j)==4&&s[j]=='e'&&s[j+1]=='l'&&s[j+2]=='s'&&s[j+3]=='e')
{
strcpy(dancishuzu[dancigeshu].name,"else");
dancishuzu[dancigeshu].bianhao=5;
dancigeshu++;
}
else if ((i-j)==5&&s[j]=='w'&&s[j+1]=='h'&&s[j+2]=='i'&&s[j+3]=='l'&&s[j+4]=='e')
{
strcpy(dancishuzu[dancigeshu].name,"while");
dancishuzu[dancigeshu].bianhao=7;
dancigeshu++;
}
else{
dancishuzu[dancigeshu].bianhao=10;
count=0;
while(j<i)
{
dancishuzu[dancigeshu].name[count++]=s[j];
j++;
}
dancishuzu[dancigeshu].name[count]='\0';
dancigeshu++;
}
}
else if(s[i]>='0'&&s[i]<='9')
{
while(s[i]>='0'&&s[i]<='9')
i++;
dancishuzu[dancigeshu].bianhao=11;
count=0;
while(j<i)
{
dancishuzu[dancigeshu].name[count++]=s[j];
j++;
}
dancishuzu[dancigeshu].name[count]='\0';
dancigeshu++;
}
else if(s[i]=='=')
{
if(s[i+1]=='=')
{
dancishuzu[dancigeshu].bianhao=30;
strcpy(dancishuzu[dancigeshu].name,"==");
dancigeshu++;
i+=2;
}
else
{
dancishuzu[dancigeshu].bianhao=12;
strcpy(dancishuzu[dancigeshu].name,"=");
dancigeshu++;
i++;
}
}
else if(s[i]=='+')
{
dancishuzu[dancigeshu].bianhao=13;
strcpy(dancishuzu[dancigeshu].name,"+");
dancigeshu++;
i++;
}
else if(s[i]=='-')
{
dancishuzu[dancigeshu].bianhao=14;
strcpy(dancishuzu[dancigeshu].name,"-");
dancigeshu++;
i++;
}
else if(s[i]=='*')
{
dancishuzu[dancigeshu].bianhao=15;
strcpy(dancishuzu[dancigeshu].name,"*");
dancigeshu++;
i++;
}
else if(s[i]=='/')
{
dancishuzu[dancigeshu].bianhao=16;
strcpy(dancishuzu[dancigeshu].name,"/");
dancigeshu++;
i++;
}
else if(s[i]=='(')
{
i++;
dancishuzu[dancigeshu].bianhao=17;
strcpy(dancishuzu[dancigeshu].name,"(");
dancigeshu++;
}
else if(s[i]==')')
{
i++;
dancishuzu[dancigeshu].bianhao=18;
strcpy(dancishuzu[dancigeshu].name,")");
dancigeshu++;
}
else if(s[i]=='[')
{
i++;
dancishuzu[dancigeshu].bianhao=19;
strcpy(dancishuzu[dancigeshu].name,"[");
dancigeshu++;
}
else if(s[i]==']')
{
i++;
dancishuzu[dancigeshu].bianhao=20;
strcpy(dancishuzu[dancigeshu].name,"]");
dancigeshu++;
}
else if(s[i]=='{')
{
i++;
dancishuzu[dancigeshu].bianhao=21;
strcpy(dancishuzu[dancigeshu].name,"{");
dancigeshu++;
}
else if(s[i]=='}')
{
i++;
dancishuzu[dancigeshu].bianhao=22;
strcpy(dancishuzu[dancigeshu].name,"}");
dancigeshu++;
}
else if(s[i]==',')
{
i++;
dancishuzu[dancigeshu].bianhao=23;
strcpy(dancishuzu[dancigeshu].name,",");
dancigeshu++;
}
else if(s[i]==':')
{
i++;
dancishuzu[dancigeshu].bianhao=24;
strcpy(dancishuzu[dancigeshu].name,":");
dancigeshu++;
}
else if(s[i]==';')
{
i++;
dancishuzu[dancigeshu].bianhao=25;
strcpy(dancishuzu[dancigeshu].name,";");
dancigeshu++;
}
else if(s[i]=='>')
{
if(s[i+1]=='=')
{
dancishuzu[dancigeshu].bianhao=28;
strcpy(dancishuzu[dancigeshu].name,">=");
dancigeshu++;
i+=2;
}
else
{
i++;
dancishuzu[dancigeshu].bianhao=26;
strcpy(dancishuzu[dancigeshu].name,">");
dancigeshu++;
}
}
else if(s[i]=='<')
{
if(s[i+1]=='=')
{
dancishuzu[dancigeshu].bianhao=29;
strcpy(dancishuzu[dancigeshu].name,"<=");
dancigeshu++;
i+=2;
}
else
{
i++;
dancishuzu[dancigeshu].bianhao=27;
strcpy(dancishuzu[dancigeshu].name,"<");
dancigeshu++;
}
}
else if(s[i]=='!'&&s[i+1]=='=')
{
dancishuzu[dancigeshu].bianhao=31;
strcpy(dancishuzu[dancigeshu].name,"!=");
dancigeshu++;
i+=2;
}
else
{
printf("\nline:%derror!",line);
i++;
return;
}
}