導航:首頁 > 源碼編譯 > 編譯原理的語法分析

編譯原理的語法分析

發布時間:2022-08-16 23:43:01

① 求 編譯原理 語法分析程序

可以參考我的空間,我在三年前寫過類似代碼。
http://hi..com/逄韶華/ihome/myblog

② 編譯原理中語法分析的作用是什麼

語法分析是搞清楚語言含義的必要條件,只有語法搞清楚了,語句表達的意思才能得到准確理解,才能得到正確實現。

③ 編譯原理

編譯原理):利用編譯程序從源語言編寫的源程序產生目標程序的過程; 用編譯程序產生目標程序的動作。 編譯就是把高級語言變成計算機可以識別的2進制語言,計算機只認識1和0,編譯程序把人們熟悉的語言換成2進制的。

編譯程序把一個源程序翻譯成目標程序的工作過程分為五個階段:詞法分析;語法分析;語義檢查和中間代碼生成

(3)編譯原理的語法分析擴展閱讀:

編譯程序的語法分析器以單詞符號作為輸入,分析單詞符號串是否形成符合語法規則的語法單位,如表達式、賦值、循環等,最後看是否構成一個符合要求的程序,按該語言使用的語法規則分析檢查每條語句是否有正確的邏輯結構,程序是最終的一個語法單位。

編譯程序的語法規則可用上下文無關文法來刻畫。語法分析的方法分為兩種:自上而下分析法和自下而上分析法。自上而下就是從文法的開始符號出發,向下推導,推出句子。

而自下而上分析法採用的是移進歸約法,基本思想是:用一個寄存符號的先進後出棧,把輸入符號一個一個地移進棧里,當棧頂形成某個產生式的一個候選式時,即把棧頂的這一部分歸約成該產生式的左鄰符號。

④ 請問編譯原理中什麼叫完成詞法分析,語法分析

以你說的SQL語句為例,詞法分析是將語句中的單詞流識別出來,比如create table Student 詞法分析是分析出 這句的單詞流是 「create」 「table」 「identifier」(前提是你給它們編號 比如用宏或者枚舉),然後語法分析 是通過單詞流 判斷 非邏輯錯誤 比如 有不能識別的符號 create table後面不是標示符等等 語義分析是分析語句的邏輯關系 比如欄位長度越界什麼的如 vchar(2) 你賦值為「啊啊啊啊啊啊」這種錯誤的識別是語義分析階段完成的 希望能幫到你

⑤ 編譯原理這門課程第三章語法分析的知識點有哪些

編譯原理這門課第三章語法分析的知識點包含章節導引,第一節上下文無關文法,第二節語言和文法,第三節自上而下分析,第四節自下而上分析,第五節LR分析器,第六節二義文法的應用,課後練習,。

⑥ 編譯原理語法分析有哪幾種方法

語法分析有自上而下和自下而上兩種分析方法
其中
自上而下:遞歸下降,LL(1)
自下而上:LR(0),SLR(1),LR(1),LALR(1)

⑦ 編譯原理關於語法分析

這都五年,這個問題還沒有解決嗎?我們現在也急需要答案啊,實在是無能為力了。

⑧ 編譯原理文法分析

改完了,能文法分析出來了!!
大概 跟你說下 你的錯誤吧:
出錯地點:
1.聲明的stack[50]沒有初始化;
2.stack的入棧是錯誤的,按照你的方式,如果原來有TM,再加入T->FN,則M就被擠出來了.(這里很關鍵,你對照我給你改的再看看)
3.s指針在你入棧操作以後並沒有指向棧頂,而是保持了不變,這肯定是有問題的.(傳入push函數的時候直接傳參數s就好了.)
4.if(*s==*p){***}else{}的else的右括弧管轄的范圍 有錯誤

不嫌棄的話,可以去http://blog.csdn.net/fangguanya,我的BLOG,不怎麼充實,呵呵,有這個程序的運行結果的. 謝謝 呵呵.
總之你對照我給你改的再看看吧. 我把我的測試輸出 也給保留了.你好對照點.
(PS.我用的vs2005,用的時候你改下頭申明,其他一樣)

// grammar.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include<iostream>
using namespace std;

char * spush(char *stack,char *pt);
bool analyse(char *p);

void main()
{
//將分析串存放在二維數組中
char input[5][10]={"i+i#",
"i*(i+i)#",
"i*i+i#",
"i+*#",
"+i*i#"};
bool flag; //定義一個布爾型的標記量
for(int h=0;h<5;++h)
{
flag=analyse(input[h]);
if(flag) cout<<"恭喜你!"<<input[h]<<"語法分析成功,合法!"<<endl;
else cout<<"對不起!"<<input[h]<<"語法分析失敗,非法!"<<endl;
}
int aaa;
cin>>aaa;
}
//定義各一將串逆序入棧的函數
char * spush(char *stack,char *pt)
{
int l=0;
//while循環的作用是將指針指向字元串的末尾,然後再由後向前入棧,從而實現逆序
while(*pt!='\0')
{
pt++;
l++;
}

if (*stack == '#')
{
stack++;
}
while(l)
{
pt--;
char cTempIntoStack = (*pt);
*stack=cTempIntoStack;
stack++;
l--;
}
stack--; //由於前面向前加了一位,要返回
////////////////
return stack;
///////////////////////////////////

}

/*LL(1)分析表
i + * ( ) #
E TM +TM
F i (E)
M TM e e
N e *FN e e
T FN FN
*/

//分析函數
bool analyse(char *p){
char analyseTable[5][6][4]={
"TM", "", "", "TM", "", "",
"i", "", "", "(E)", "", "",
"", "+TM", "", "", "e", "e",
"", "e", "*FN", "", "e", "e",
"FN", "", "", "TN", "", ""
};
char *stack = new char[50]; //定義一個棧空間
for (int iStack = 0;iStack<50 ;iStack++)
{
stack[iStack] = 0;
}
char *s=stack; //用指針*s指向棧的起始地址
*s='#'; //將「#」入棧
s++; //指針加1
*s='E'; //將「E」入棧
//下面的while循環實現字元串的詞法分析操作

int count = 0;

while(*s!='#' || *p!='#'){
count++;
char * temp = s;
cout<<"NO."<<count<<endl;
cout<<"STACK"<<endl;
while (*temp != '#')
{
cout<<*temp<<" ";
temp--;
}
cout<<endl;

int x,y;
//若果棧頂數據和分析串的字元匹配,則將符號棧的棧頂數據出棧(即將棧頂指針減1)
if(*s==*p){
cout<<"Before :"<<*s<<endl;
s--;
p++;
cout<<"After :"<<*s<<endl;
}
//當符號棧和分析串的字元不匹配時,查分析表
else {
switch(*s){
case 'E':x=0;break;
case 'F':x=1;break;
case 'M':x=2;break;
case 'N':x=3;break;
case 'T':x=4;break;
default:return false;
}
switch(*p){
case 'i':y=0;break;
case '+':y=1;break;
case '*':y=2;break;
case '(':y=3;break;
case ')':y=4;break;
case '#':y=5;break;
default:return false;
}
//若果對應的為空,則分析串非法,退出
if(analyseTable[x][y][0]=='\0') return false;
//若查表所對應的為'e',則將符號棧的棧頂數據出棧
else if(analyseTable[x][y][0]=='e') s--;
//其它,這時將查表所得的項逆序入符號棧
else {
s=spush(s,analyseTable[x][y]);
}
}
}
return true; //分析成功,返回
}

⑨ 如何通俗易懂地解釋編譯原理中語法分析的過程

分成詞法分析,語法分析(LL演算法,遞歸下降演算法,LR演算法),語義分析,運行時環境,中間代碼,代碼生成,代碼優化這些部分。其實現在很多編譯原理的教材都是按照85,86出版的那本龍書來安排教學內容的,所以那本龍書的內容格式幾乎成了現在編譯原理教材的定式,包括國內的教材也是如此。一般來說,大學裡面的本科教學是不可能把上面的所有部分都認真講完的,而是比較偏重於前面幾個部分。像代碼優化那部分東西,就像個無底洞一樣,如果要認真講,就是單獨開一個學期的課也不可能講得清楚。所以,一般對於本科生,對詞法分析和語法分析掌握要求就相對要高一點了。

詞法分析相對來說比較簡單。可能是詞法分析程序本身實現起來很簡單吧,很多沒有學過編譯原理的人也同樣可以寫出各種各樣的詞法分析程序。不過編譯原理在講解詞法分析的時候,重點把正則表達式和自動機原理加了進來,然後以一種十分標準的方式來講解詞法分析程序的產生。這樣的做法道理很明顯,就是要讓詞法分析從程序上升到理論的地步。

語法分析部分就比較麻煩一點了。現在一般有兩種語法分析演算法,LL自頂向下演算法和LR自底向上演算法。LL演算法還好說,到了LR演算法的時候,困難就來了。很多自學編譯原理的都是遇到LR演算法的理解成問題後就放棄了自學。其實這些東西都是只要大家理解就可以了,又不是像詞法分析那樣非得自己寫出來才算真正的會。像LR演算法的語法分析器,一般都是用工具Yacc來生成,實踐中完全沒有比較自己來實現。對於LL演算法中特殊的遞歸下降演算法,因為其實踐十分簡單,那麼就應該要求每個學生都能自己寫。當然,現在也有不少好的LL演算法的語法分析器,不過要是換在非C平台,比如Java,Delphi,你不能運用YACC工具了,那麼你就只有自己來寫語法分析器。

⑩ 編譯原理,遞歸下降子程序語法分析

沒學過編譯原理,看描述,是讓寫一個腳本執行軟體。
終結符我查了下,就是不可再分的。比如iε。
輸入是EGTSFI*/ε組成的字元串。
規則需要預處理。注意轉意符在字元串中的效果。因為有/字元。

不會c或c++,只會c#。你可以到貼吧發帖。強人工智慧吧 就挺好。演算法吧有點亂。

最重要的,不要錢。

閱讀全文

與編譯原理的語法分析相關的資料

熱點內容
職業生涯pdf 瀏覽:954
ubuntu安裝軟體php 瀏覽:159
黑馬程序員退學流程 瀏覽:362
網頁伺服器崩潰怎麼回事 瀏覽:651
cnc編程前景怎麼樣 瀏覽:320
lniux命令詳解 瀏覽:494
linuxmysql查詢日誌 瀏覽:369
老捷達夥伴壓縮比 瀏覽:94
改後綴加密 瀏覽:433
郵局選址問題演算法 瀏覽:15
河北伺服器內存雲主機 瀏覽:13
在電腦上怎麼找到加密狗圖標 瀏覽:437
電腦的瀏覽器怎麼打開pdf文件怎麼打開 瀏覽:144
pdf卡片庫下載 瀏覽:13
單片機中二進製表示什麼 瀏覽:726
java網路編程推薦 瀏覽:797
施耐德開關編程 瀏覽:68
組織胚胎學pdf 瀏覽:845
linux查看發包 瀏覽:497
加密貨幣交易所暴利時代 瀏覽:826