版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> 課程設(shè)計(jì)1-C語言詞法分析器</p><p><b> 1.題目</b></p><p> C語言詞法分析2.內(nèi)容</p><p> 選一個(gè)能正常運(yùn)行的c語言程序,以該程序出現(xiàn)的字符作為單詞符號(hào)集,不用處理c語言的所有單詞符號(hào)。將解析到的單詞符號(hào)對(duì)應(yīng)的二元組輸出到文件中保存可以將掃描緩沖區(qū)與輸入緩沖區(qū)合成一個(gè)緩
2、沖區(qū),一次性輸入源程序后就可以進(jìn)行預(yù)處理了3.設(shè)計(jì)目的</p><p> 掌握詞法分析算法,設(shè)計(jì)、編制并調(diào)試一個(gè)詞法分析程序,加深對(duì)詞法分析原理的理解4.設(shè)計(jì)環(huán)境(電腦語言環(huán)境)</p><p><b> 語言環(huán)境:C語言</b></p><p> CPU:i7HQ6700</p><p> 內(nèi)存:8G5.
3、概要設(shè)計(jì)(單詞符號(hào)表,狀態(tài)轉(zhuǎn)換圖)</p><p> 5.1 詞法分析器的結(jié)構(gòu)</p><p> 詞法分析程序的功能:</p><p> 輸入:所給文法的源程序字符串。</p><p> 輸出:二元組(syn,token或sum)構(gòu)成的序列。</p><p> 詞法分析程序可以單獨(dú)為一個(gè)程序;也可以作為整個(gè)編
4、譯程序的一個(gè)子程序,當(dāng)需要一個(gè)單詞時(shí),就調(diào)用此法分析子程序返回一個(gè)單詞.</p><p> 為便于程序?qū)崿F(xiàn),假設(shè)每個(gè)單詞間都有界符或運(yùn)算符或空格隔開,并引入下面的全局變量及子程序:</p><p> 1) ch 存放最新讀進(jìn)的源程序字符</p><p> 2) strToken 存放構(gòu)成單詞符號(hào)的字符串</p>
5、<p> 3) Buffer字符緩沖區(qū)</p><p> 4)struct keyType 存放保留字的符號(hào)和種別</p><p> 5.2 待分析的簡(jiǎn)單詞法</p><p><b> ?。?)保留字</b></p><p> break、case、char、const、int、do、whil
6、e…</p><p> (2)運(yùn)算符和界符</p><p> = 、+、 -、 * 、/、%、,、;、(、)、?、#</p><p> 5.3 各種單詞符號(hào)對(duì)應(yīng)的種別碼</p><p><b> 5.3 狀態(tài)轉(zhuǎn)換圖</b></p><p> 6.詳細(xì)設(shè)計(jì)(數(shù)據(jù)結(jié)構(gòu),子程序)</p
7、><p><b> 算法思想:</b></p><p> 首先設(shè)置3個(gè)變量:①strToken用來存放構(gòu)成單詞符號(hào)的字符串;②ch用來字符;③struct keyType用來存放單詞符號(hào)的種別碼。掃描子程序主要部分流程如下圖所示。</p><p><b> 子程序結(jié)構(gòu):</b></p><p>&
8、lt;b> 7.程序清單</b></p><p> // ConsoleApplication1.cpp : 定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。</p><p><b> //</b></p><p> #include "stdafx.h"</p><p> #include
9、"stdio.h"</p><p> #include "stdlib.h"</p><p> #include "conio.h"</p><p> #include "string.h"</p><p> #define N 47</p>
10、<p><b> char ch;</b></p><p> char strToken[20];//存放構(gòu)成單詞符號(hào)的字符串</p><p> char buffer[1024];//字符緩沖區(qū)</p><p> struct keyType {</p><p> char keyname[
11、256];</p><p> int value;</p><p> }Key[N] = { { "$ID",0 },{ "$INT",1 },{ "auto",2 },{ "break",3 },{ "case",4 },</p><p> { "c
12、har",5 },{ "const",6 },{ "continue",7 },{ "default",8 },{ "do",9 },</p><p> { "double",10 },{ "else",11 },{ "enum",12 },{ "ext
13、ern",13 },{ "float",14 },</p><p> { "for",15 },{ "goto",16 },{ "if",17 },{ "int",18 },{ "long",19 },{ "register",20 },</p>&
14、lt;p> { "return",21 },{ "short",22 },{ "signed",23 },{ "sizeof",24 },{ "static",25 },</p><p> { "struct",26 },{ "switch",27 },{ &quo
15、t;typedef",28 },{ "union",29 },{ "unsigned",30 },</p><p> { "void",31 },{ "volatile",32 },{ "while",33 },{ "=",34 },{ "+",35 },{ &q
16、uot;-",36 },{ "*",37 },</p><p> { "/",38 },{ "%",39 },{ ",",40 },{ ";",41 },{ "(",42 },{ ")",43 },{ "?",44 },{ "clea
17、r",45 },{ "#",46 } };</p><p> void GetChar()//讀一個(gè)字符到ch中</p><p><b> {</b></p><p><b> int i;</b></p><p> if (strlen(buffer)>
18、;0) {</p><p> ch = buffer[0];</p><p> for (i = 0; i<256; i++)</p><p> buffer[i] = buffer[i + 1];</p><p><b> }</b></p><p><b> else
19、</b></p><p> ch = '\0';</p><p><b> }</b></p><p> void GetBC()</p><p> //讀一個(gè)非空白字符到ch中</p><p><b> {</b></p>
20、<p><b> int i;</b></p><p> while (strlen(buffer)) {</p><p><b> i = 0;</b></p><p> ch = buffer[i];</p><p> for (; i<256; i++) bu
21、ffer[i] = buffer[i + 1];</p><p> if (ch != ' '&&ch != '\n'&&ch != '\0')break;</p><p><b> }</b></p><p><b> }</b>&l
22、t;/p><p> void ConCat()</p><p> //把ch連接到strToken之后</p><p><b> {</b></p><p> char temp[2];</p><p> temp[0] = ch;</p><p> temp[1
23、] = '\0';</p><p> strcat(strToken, temp);</p><p><b> }</b></p><p> bool Letter()</p><p> //判斷ch是否為字母</p><p><b> {</b>
24、</p><p> if (ch >= 'A'&&ch <= 'Z' || ch >= 'a'&&ch <= 'z')</p><p> return true;</p><p><b> else</b></p&
25、gt;<p> return false;</p><p><b> }</b></p><p> bool Digit()</p><p> //判斷ch是否為數(shù)字</p><p><b> {</b></p><p> if (ch >=
26、 '0'&&ch <= '9')</p><p> return true;</p><p><b> else</b></p><p> return false;</p><p><b> }</b></p><p
27、> int Reserve()</p><p> //用strToken中的字符查找保留字表,并返回保留字種別碼,若返回0,則非保留字</p><p><b> {</b></p><p><b> int i;</b></p><p> for (i = 0; i<N; i
28、++)</p><p> if (strcmp(strToken, Key[i].keyname) == 0)</p><p> return Key[i].value;</p><p><b> return 0;</b></p><p><b> }</b></p><
29、;p> void Retract()</p><p> //把ch中的字符回送到緩沖區(qū)</p><p><b> {</b></p><p><b> int i;</b></p><p> if (ch != '\0') {</p><p>
30、; buffer[256] = '\0';</p><p> for (i = 255; i>0; i--)</p><p> buffer[i] = buffer[i - 1];</p><p> buffer[0] = ch;</p><p><b> }</b></p>
31、<p> ch = '\0';</p><p><b> }</b></p><p> keyType ReturnWord()</p><p><b> {</b></p><p> strcpy(strToken, "\0");</
32、p><p><b> int c;</b></p><p> keyType tempkey;</p><p><b> GetBC();</b></p><p> if (ch >= 'A'&&ch <= 'Z' || ch >
33、= 'a'&&ch <= 'z') {</p><p><b> ConCat();</b></p><p> GetChar();</p><p> while (Letter() || Digit()) {</p><p><b> ConCat
34、();</b></p><p> GetChar();</p><p><b> }</b></p><p> Retract();</p><p> c = Reserve();</p><p> strcpy(tempkey.keyname, strToken);<
35、/p><p> if (c == 0)</p><p> tempkey.value = 0;</p><p><b> else</b></p><p> tempkey.value = Key[c].value;</p><p><b> }</b></p&g
36、t;<p> else if (ch >= '0'&&ch <= '9') {</p><p><b> ConCat();</b></p><p> GetChar();</p><p> while (Digit()) {</p><p&g
37、t;<b> ConCat();</b></p><p> GetChar();</p><p><b> }</b></p><p> Retract();</p><p> strcpy(tempkey.keyname, strToken);</p><p>
38、 tempkey.value = 1;</p><p><b> }</b></p><p><b> else {</b></p><p><b> ConCat();</b></p><p> strcpy(tempkey.keyname, strToken);&l
39、t;/p><p> tempkey.value = Reserve();</p><p><b> }</b></p><p> return tempkey;</p><p><b> }</b></p><p><b> /*</b></
40、p><p><b> 主函數(shù)</b></p><p><b> */</b></p><p> int main() {</p><p><b> //文件操作</b></p><p><b> FILE *fp;</b>&l
41、t;/p><p> if ((fp = fopen("E:\\作業(yè)\\編譯原理\\Ccode.txt", "r")) == NULL) {</p><p> printf("cannot open file/n"); exit(1);</p><p><b> }</b
42、></p><p> while (!feof(fp)) {</p><p> if (fgets(buffer, 250, fp) != NULL)</p><p><b> {</b></p><p> printf("E:\\作業(yè)\\編譯原理\\Ccode.txt\n"); <
43、;/p><p><b> }</b></p><p><b> }</b></p><p> keyType temp;</p><p> printf("單詞\t種別號(hào)\n");</p><p> while (strlen(buffer)) {&
44、lt;/p><p> temp = ReturnWord();</p><p> printf("%s\t %d\n\n", temp.keyname, temp.value);</p><p><b> }</b></p><p> printf("the end!\n");
45、 </p><p><b> getch();</b></p><p><b> return 0;</b></p><p><b> }</b></p><p><b> 8.運(yùn)行結(jié)果</b></p><p> E:/作
46、業(yè)/編譯原理/Code.txt</p><p><b> 運(yùn)行結(jié)果</b></p><p><b> 實(shí)驗(yàn)體會(huì)</b></p><p> 通過本次次法分析設(shè)計(jì)實(shí)驗(yàn),我加深了對(duì)詞法分析過程的理解。并在實(shí)際的設(shè)計(jì)過程深入的了解了編譯原理思想。對(duì)編譯原理課程有了更深的理解</p><p> 課程設(shè)
47、計(jì)二:設(shè)計(jì)簡(jiǎn)單的語法分析器</p><p><b> 題目</b></p><p> 設(shè)計(jì)簡(jiǎn)單的語法分析器</p><p><b> 設(shè)計(jì)內(nèi)容</b></p><p> 用算符優(yōu)先分析方法設(shè)計(jì)一個(gè)分析解釋程序,對(duì)輸入的賦值語句、輸出語句、清除語句進(jìn)行詞法分析、語法分析、表達(dá)式求值并存儲(chǔ)于指定
48、變量中;若存在錯(cuò)誤,提示錯(cuò)誤相關(guān)信息。</p><p><b> 設(shè)計(jì)目的</b></p><p> 了解掌握算符優(yōu)先分析的基本方法、內(nèi)容;</p><p><b> 設(shè)計(jì)環(huán)境</b></p><p><b> 語言環(huán)境:C語言</b></p><p
49、> CPU:i7HQ6700</p><p><b> 內(nèi)存:8G</b></p><p><b> 概要設(shè)計(jì)</b></p><p><b> 5.1設(shè)計(jì)思路</b></p><p> 語法分析的任務(wù): 把單詞符號(hào)作為基本單位,分析程序是否為合法的程序.<
50、;/p><p> 算符優(yōu)先分析法是自下而上的語法分析方法,即根據(jù)文法,對(duì)輸入字串進(jìn)行歸約,若能正確地歸約為文法的初始符號(hào),則表示輸入字串是合法的.主要研究對(duì)輸入的賦值語句、輸出語句、清除語句進(jìn)行詞法分析、語法分析、表達(dá)式求值并存儲(chǔ)于指定變量中;若存在錯(cuò)誤,提示錯(cuò)誤相關(guān)信息。</p><p><b> 文法表示:</b></p><p> S→
51、v=E|E?|clear</p><p> E→E+T|E-T|T</p><p> T→T*F|T/F|F</p><p> F→ (E)|v|c </p><p> 5.2 單詞種別碼設(shè)計(jì)</p><p><b> 詳細(xì)設(shè)計(jì)</b></p><p> 6.
52、1 變量及函數(shù)說明</p><p><b> 程序清單</b></p><p> // ConsoleApplication1.cpp : 定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。</p><p><b> //</b></p><p> #include "stdafx.h"<
53、;/p><p> #include "stdio.h"</p><p> #include "stdlib.h"</p><p> #include "conio.h"</p><p> #include "string.h"</p><p
54、> #define NUM 14</p><p> #define M 256</p><p> #define N 47//保留字個(gè)數(shù)</p><p> char ch = '\0';//存放最新讀進(jìn)的源程序字符</p><p> char strToken[20] = "\0"
55、;;//存放構(gòu)成單詞符號(hào)的字符串</p><p> char buffer[257] = "\0";//字符緩沖區(qū)</p><p> struct keyType {</p><p> char keyname[256];</p><p> int value;</p><p> }K
56、ey[N] = { { "$ID",0 },{ "$INT",1 },{ "auto",2 },{ "break",3 },{ "case",4 },</p><p> { "char",5 },{ "const",6 },{ "continue",7
57、},{ "default",8 },{ "do",9 },</p><p> { "double",10 },{ "else",11 },{ "enum",12 },{ "extern",13 },{ "float",14 },</p><p>
58、{ "for",15 },{ "goto",16 },{ "if",17 },{ "int",18 },{ "long",19 },{ "register",20 },</p><p> { "return",21 },{ "short",22 },{
59、"signed",23 },{ "sizeof",24 },{ "static",25 },</p><p> { "struct",26 },{ "switch",27 },{ "typedef",28 },{ "union",29 },{ "unsigned&
60、quot;,30 },</p><p> { "void",31 },{ "volatile",32 },{ "while",33 },{ "=",34 },{ "+",35 },{ "-",36 },{ "*",37 },</p><p> {
61、"/",38 },{ "%",39 },{ ",",40 },{ ";",41 },{ "(",42 },{ ")",43 },{ "?",44 },{ "clear",45 },{ "#",46 } };</p><p><b&
62、gt; //優(yōu)先關(guān)系矩陣</b></p><p> int priority[NUM][NUM] = { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },</p><p> { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },</p><p> { 0,0,0,0,0,0,0,0,0,0,0,0,1,0 },</
63、p><p> { 0,0,0,1,1,-1,-1,-1,1,-1,0,0,1,0 },</p><p> { 0,0,0,1,1,-1,-1,-1,1,-1,0,0,1,0 },</p><p> { 0,0,0,1,1,1,1,-1,1,-1,0,0,1,0 },</p><p> { 0,0,0,1,1,1,1,-1,1,-1,0,0
64、,1,0 },</p><p> { 0,0,0,-1,-1,-1,-1,-1,2,-1,0,0,0,0 },</p><p> { 0,0,0,1,1,1,1,0,1,0,0,0,1,0 },</p><p> { 0,0,1,1,1,1,1,0,1,0,0,0,1,0 },</p><p> { 0,0,0,0,0,0,0,0,0
65、,0,0,0,1,0 },</p><p> { 0,0,0,0,0,0,0,0,0,0,0,0,0,0 },</p><p> { 0,0,0,-1,-1,-1,-1,-1,0,0,0,0,3,0 },</p><p> { 0,0,1,0,0,0,0,0,0,0,0,0,1,0 } };</p><p> struct VarTa
66、ble {</p><p> VarWord elem[M];</p><p> int len;</p><p> }varTable;</p><p> struct OperateStack {</p><p> WordType elem[M];//單詞元素</p><p
67、> int len;</p><p><b> };</b></p><p> OperateStack mainStack;//歸約棧</p><p> OperateStack wordStack;</p><p> struct WordType {</p><p>
68、; char word[M];</p><p> int value;</p><p> }wordType[NUM] = { { "error",0 },{ "=",1 },{ "?",2 },{ "+",3 },{ "-",4 },{ "*",5 },{ &qu
69、ot;/",6 },{ "(",7 },{ ")",8 },{ "$i",9 },{ "$c",10 },{ "clear",11 },{ "#",12 },{ "$N",13 } };</p><p><b> /* </b></p&
70、gt;<p><b> 變量表</b></p><p><b> */</b></p><p> struct VarWord {</p><p> char varname[M];//變量名</p><p> char value[M]; </p><
71、p> bool flag;</p><p><b> };</b></p><p> void GetChar()//讀一個(gè)字符到ch中</p><p><b> {</b></p><p><b> int i;</b></p><p
72、> if (strlen(buffer)>0) {</p><p> ch = buffer[0];</p><p> for (i = 0; i<256; i++)</p><p> buffer[i] = buffer[i + 1];</p><p><b> }</b></p>
73、;<p><b> else</b></p><p> ch = '\0';</p><p><b> }</b></p><p> void GetBC()//讀一個(gè)非空白字符到ch中</p><p><b> {</b></p
74、><p><b> int i;</b></p><p> while (strlen(buffer)) {</p><p><b> i = 0;</b></p><p> ch = buffer[i];</p><p> for (; i<256; i++)
75、 buffer[i] = buffer[i + 1];</p><p> if (ch != ' '&&ch != '\n'&&ch != '\0')break;</p><p><b> }</b></p><p><b> }</b&g
76、t;</p><p> void ConCat()//把ch連接到strToken之后</p><p><b> {</b></p><p> char temp[2];</p><p> temp[0] = ch;</p><p> temp[1] = '\0';&l
77、t;/p><p> strcat(strToken, temp);</p><p><b> }</b></p><p> bool Letter()//判斷ch是否為字母</p><p><b> {</b></p><p> if (ch >= 'A
78、'&&ch <= 'Z' || ch >= 'a'&&ch <= 'z')</p><p> return true;</p><p><b> else</b></p><p> return false;</p>&
79、lt;p><b> }</b></p><p> bool Digit()//判斷ch是否為數(shù)字</p><p><b> {</b></p><p> if (ch >= '0'&&ch <= '9')</p><p>
80、 return true;</p><p><b> else</b></p><p> return false;</p><p><b> }</b></p><p> int Reserve()//用strToken中的字符查找保留字表,并返回保留字種別碼,若返回0,則非保留字<
81、;/p><p><b> {</b></p><p><b> int i;</b></p><p> for (i = 0; i<N; i++)</p><p> if (strcmp(strToken, Key[i].keyname) == 0)</p><p>
82、; return Key[i].value;</p><p><b> return 0;</b></p><p><b> }</b></p><p> void Retract()//把ch中的字符回送到緩沖區(qū)</p><p><b> {</b></p&
83、gt;<p><b> int i;</b></p><p> if (ch != '\0') {</p><p> buffer[256] = '\0';</p><p> for (i = 255; i>0; i--)</p><p> buffer[i]
84、 = buffer[i - 1];</p><p> buffer[0] = ch;</p><p><b> }</b></p><p> ch = '\0';</p><p><b> }</b></p><p> keyType ReturnW
85、ord()</p><p><b> {</b></p><p> strcpy(strToken, "\0");</p><p><b> int c;</b></p><p> keyType tempkey;</p><p><b>
86、; GetBC();</b></p><p> if (ch >= 'A'&&ch <= 'Z' || ch >= 'a'&&ch <= 'z') {</p><p><b> ConCat();</b></p>&l
87、t;p> GetChar();</p><p> while (Letter() || Digit()) {</p><p><b> ConCat();</b></p><p> GetChar();</p><p><b> }</b></p><p>
88、 Retract();</p><p> c = Reserve();</p><p> strcpy(tempkey.keyname, strToken);</p><p> if (c == 0)</p><p> tempkey.value = 0;</p><p><b> else<
89、/b></p><p> tempkey.value = Key[c].value;</p><p><b> }</b></p><p> else if (ch >= '0'&&ch <= '9') {</p><p><b> Co
90、nCat();</b></p><p> GetChar();</p><p> while (Digit()) {</p><p><b> ConCat();</b></p><p> GetChar();</p><p><b> }</b><
91、;/p><p> Retract();</p><p> strcpy(tempkey.keyname, strToken);</p><p> tempkey.value = 1;</p><p><b> }</b></p><p><b> else {</b>&
92、lt;/p><p><b> ConCat();</b></p><p> strcpy(tempkey.keyname, strToken);</p><p> tempkey.value = Reserve();</p><p><b> }</b></p><p>
93、 return tempkey;</p><p><b> }</b></p><p> bool GetwordStack() {</p><p><b> int i;</b></p><p> wordStack.len = 0;</p><p> keyT
94、ype temp;</p><p> while (strlen(buffer)) {</p><p> temp = ReturnWord();//詞法分析器獲得一個(gè)分析詞</p><p> if (temp.value == 1)//常數(shù)("$c",10)</p><p><b> {
95、</b></p><p> strcpy(wordStack.elem[wordStack.len].word, temp.keyname);</p><p> wordStack.elem[wordStack.len].value = 10;</p><p><b> }</b></p><p>
96、else if (temp.value == 0)//變量("$i",9)</p><p><b> {</b></p><p> strcpy(wordStack.elem[wordStack.len].word, temp.keyname);</p><p> wordStack.elem[wordSt
97、ack.len].value = 9;</p><p><b> }</b></p><p><b> else {</b></p><p> for (i = 0; i<NUM; i++) {</p><p> if (strcmp(temp.keyname, wordType[i]
98、.word) == 0)//關(guān)鍵字</p><p><b> {</b></p><p> wordStack.elem[wordStack.len] = wordType[i];</p><p><b> break;</b></p><p><b> }</b>&
99、lt;/p><p> else if (i == NUM - 1) {</p><p> printf("輸入串中出現(xiàn)未識(shí)別單詞!\n");</p><p> return false;</p><p><b> }</b></p><p><b> }<
100、/b></p><p><b> }</b></p><p> wordStack.len++;</p><p><b> }</b></p><p> wordStack.elem[wordStack.len++] = wordType[12];</p><p&g
101、t; return true;</p><p><b> }</b></p><p><b> /*</b></p><p><b> 從單詞串中取單詞</b></p><p><b> */</b></p><p>
102、WordType GetWord() {</p><p> WordType temp = wordStack.elem[0];</p><p> for (int i = 0; i<wordStack.len - 1; i++)</p><p> wordStack.elem[i] = wordStack.elem[i + 1];</p>
103、<p> wordStack.len--;</p><p> return temp;</p><p><b> }</b></p><p> void ClearwordStack()//清空單詞串</p><p><b> {</b></p><p
104、> wordStack.len = 0;</p><p><b> }</b></p><p> void ClearmainStack()//清空歸約棧</p><p><b> {</b></p><p> mainStack.len = 0;</p><
105、;p><b> }</b></p><p><b> /*</b></p><p> 查看變量在變量表中的位置</p><p><b> */</b></p><p> int CheckvarTable(char a[]) {</p><p
106、> for (int i = 0; i<M; i++)</p><p> if (strcmp(a, varTable.elem[i].varname) == 0)</p><p><b> return i;</b></p><p> else if (i == M - 1)</p><p> r
107、eturn -1;</p><p><b> }</b></p><p><b> /*</b></p><p><b> 添加變量</b></p><p><b> */</b></p><p> void Addvar
108、Table(VarWord a) {</p><p> varTable.elem[varTable.len] = a;</p><p> varTable.len++;</p><p><b> }</b></p><p><b> /*</b></p><p>&
109、lt;b> 初始化歸約棧</b></p><p><b> */</b></p><p> void InitmainStack()</p><p><b> {</b></p><p> mainStack.elem[0] = wordType[12];</p&g
110、t;<p> mainStack.len = 1;</p><p><b> }</b></p><p><b> /*</b></p><p><b> 添加歸約棧</b></p><p><b> */</b></p>
111、;<p> void AddmainStack(WordType a)</p><p><b> {</b></p><p> mainStack.elem[mainStack.len] = a;</p><p> mainStack.len++;</p><p><b> }</
112、b></p><p><b> /*</b></p><p><b> 歸約</b></p><p><b> */</b></p><p> bool Handle()</p><p><b> {</b><
113、/p><p><b> int i;</b></p><p><b> //常量歸約</b></p><p> if (mainStack.elem[mainStack.len - 1].value == 10) {</p><p> mainStack.elem[mainStack.len -
114、 1].value = 13;</p><p><b> }</b></p><p><b> //變量歸約</b></p><p> else if (mainStack.elem[mainStack.len - 1].value == 9) {</p><p> mainStack.el
115、em[mainStack.len - 1].value = 13;</p><p> i = CheckvarTable(mainStack.elem[mainStack.len - 1].word);</p><p> if (i<0) {</p><p> printf("\n變量 %s 未定義!", mainStack.elem
116、[mainStack.len - 1].word);</p><p> return false;</p><p><b> }</b></p><p><b> else</b></p><p> strcpy(mainStack.elem[mainStack.len - 1].word,
117、 varTable.elem[i].value);</p><p><b> }</b></p><p><b> //賦值歸約</b></p><p> else if (mainStack.elem[mainStack.len - 2].value == 1) {</p><p> if
118、 (mainStack.elem[mainStack.len - 3].value == 9) {</p><p> i = CheckvarTable(mainStack.elem[mainStack.len - 3].word);</p><p> if (i<0) {</p><p> VarWord temp;</p><p&
119、gt; strcpy(temp.varname, mainStack.elem[mainStack.len - 3].word);</p><p> strcpy(temp.value, mainStack.elem[mainStack.len - 1].word);</p><p> temp.flag = true;</p><p> AddvarTab
120、le(temp);</p><p><b> }</b></p><p><b> else</b></p><p> strcpy(varTable.elem[i].value, mainStack.elem[mainStack.len - 1].word);</p><p> strcp
121、y(mainStack.elem[mainStack.len - 3].word, mainStack.elem[mainStack.len - 1].word);</p><p> mainStack.elem[mainStack.len - 3].value = 13;</p><p><b> }</b></p><p> else
122、 if (mainStack.elem[mainStack.len - 3].value == 13)</p><p> strcpy(mainStack.elem[mainStack.len - 3].word, mainStack.elem[mainStack.len - 1].word);</p><p> mainStack.len = mainStack.len - 2;&l
123、t;/p><p><b> }</b></p><p><b> //運(yùn)算歸約</b></p><p> else if (mainStack.elem[mainStack.len - 2].value == 3) {</p><p><b> int a, b;</b>&
124、lt;/p><p> a = atoi(mainStack.elem[mainStack.len - 1].word);</p><p> b = atoi(mainStack.elem[mainStack.len - 3].word);</p><p> a = a + b;</p><p> itoa(a, mainStack.ele
125、m[mainStack.len - 3].word, 10);</p><p> mainStack.len = mainStack.len - 2;</p><p><b> }</b></p><p> else if (mainStack.elem[mainStack.len - 2].value == 5) {</p>
126、<p><b> int a, b;</b></p><p> a = atoi(mainStack.elem[mainStack.len - 1].word);</p><p> b = atoi(mainStack.elem[mainStack.len - 3].word);</p><p><b> a =
127、 a*b;</b></p><p> itoa(a, mainStack.elem[mainStack.len - 3].word, 10);</p><p> mainStack.len = mainStack.len - 2;</p><p><b> }</b></p><p><b>
128、 //輸出語句</b></p><p> else if (wordStack.elem[0].value == 2 && mainStack.elem[mainStack.len - 1].value == 13 && mainStack.elem[mainStack.len - 2].value == 12) {</p><p> pr
129、intf("\n表達(dá)式的值為 %s", mainStack.elem[mainStack.len - 1].word);</p><p> mainStack.len = 0;</p><p><b> }</b></p><p><b> //結(jié)束歸約</b></p><p&
130、gt; else if (mainStack.elem[mainStack.len - 2].value == 12 && wordStack.elem[0].value == 12)</p><p> mainStack.len = mainStack.len - 2;</p><p> return true;</p><p><b&
131、gt; }</b></p><p> bool MainHandle() {</p><p> while (wordStack.len)</p><p> if (priority[mainStack.elem[mainStack.len - 1].value][wordStack.elem[0].value] != 1)</p>
132、<p> AddmainStack(GetWord());</p><p><b> else {</b></p><p> if (mainStack.len) {</p><p> //printf("\n");</p><p> for (int i = 0; i<m
133、ainStack.len; i++)</p><p> printf("(%s,%d)", mainStack.elem[i].word, mainStack.elem[i].value);</p><p><b> Handle();</b></p><p><b> }</b></p&g
134、t;<p><b> break;</b></p><p><b> }</b></p><p> if (mainStack.len)</p><p> MainHandle();</p><p> return true;</p><p><
135、b> }</b></p><p><b> /*</b></p><p><b> 主函數(shù)</b></p><p><b> */</b></p><p> int main() {</p><p> int ok = 1;
136、</p><p> WordType temp;</p><p> int ii = 0;</p><p> while (ok) {</p><p> printf("\n");</p><p> printf("輸入第 %d 語句串:",++ii);</p&g
137、t;<p> scanf("%s", buffer);</p><p> printf("單詞串:");</p><p> if (!GetwordStack())</p><p><b> return 0;</b></p><p> for (int i
138、 = 0; i<wordStack.len; i++)</p><p> printf("(%s,%d)", wordStack.elem[i].word, wordStack.elem[i].value);</p><p> printf("\n當(dāng)前歸約棧:");</p><p> InitmainStack()
139、;</p><p> MainHandle();</p><p><b> }</b></p><p> printf("結(jié)束\n");</p><p><b> return 0;</b></p><p><b> }</b&g
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 編譯原理詞法分析器語法分析課程設(shè)計(jì)
- 編譯原理課程設(shè)計(jì)--pascal語言詞法、語法分析器設(shè)計(jì)
- 編譯原理課程設(shè)計(jì)--- 語法分析器
- 編譯原理課程設(shè)計(jì)---語法分析器
- 編譯原理課程設(shè)計(jì)--語法分析器
- 編譯原理語法分析器課程設(shè)計(jì)
- 編譯原理課程設(shè)計(jì)--構(gòu)造lr(0)分析法語法分析器
- 編譯原理課程設(shè)計(jì)(c++)-語法分析器
- 語法分析課程設(shè)計(jì)---編譯原理語法分析器的設(shè)計(jì)與實(shí)現(xiàn)
- 課程設(shè)計(jì)----編譯原理詞法分析器
- 編譯原理課程設(shè)計(jì)--表達(dá)式語法分析器
- 編譯原理課程設(shè)計(jì)報(bào)告詞法分析器
- 編譯原理課程設(shè)計(jì)詞法分析器文檔
- c-minus詞法分析和語法分析設(shè)計(jì)編譯器編譯原理課程設(shè)計(jì)
- 編譯原理課程設(shè)計(jì)報(bào)告之詞法分析器
- 編譯原理課程設(shè)計(jì)--c-編譯器詞法分析與語法分析的實(shí)現(xiàn)
- 課程設(shè)計(jì)詞法分析器
- 編譯課程設(shè)計(jì)-遞歸下降語法分析
- 編譯原理課程設(shè)計(jì)詞法分析
- 編譯技術(shù)課程設(shè)計(jì)報(bào)告-詞法分析、語法分析、中間代碼生成
評(píng)論
0/150
提交評(píng)論