編譯原理,自上而下非遞迴語法分析自上而下的語法分析

2021-07-31 14:17:47 字數 1680 閱讀 5084

/*要求:1. 使用的文法如下(見編譯陳第三版):e te e + te | t ft t * ft | f (e) | id2. 對於任意給定的輸入串(詞法記號流)進行語法分析,遞迴下降方法和非遞迴**分析方法可以任選其一來實現。3. 要有一定的錯誤處理功能。即對錯誤能提示,並且能在一定程度上忽略盡量少的記號來進行接下來的分析。可以參考書上介紹的同步記號集合來處理。可能的出錯情況:idid*id, id**id, (id+id, +id*+id ……4. 輸入串以#結尾,輸出推導過程中使用到的產生式。例如: 輸入:id+id*id# 輸出:e te t ft f ide + te t ft ……如果輸入串有錯誤,則在輸出中要體現是跳過輸入串的某些記號了,還是彈棧,彈出某個非終結符或者是終結符了,同時給出相應的出錯提示資訊。比如:idid*id對應的出錯資訊是:「輸入串跳過記號id,使用者多輸入了乙個id」;id**id對應的出錯資訊是:「彈棧,彈出非終結符f,使用者少輸入了乙個id」(id+id對應的出錯資訊是:「彈棧,彈出終結符 ) ,使用者少輸入了乙個右括號(或者說,括號不匹配)」

*/#include #include "textanalyse.h"

#include#includeusing namespace std;

string nexttoken(int index,list stringlist)

stacks;

int index=0;

int findtablevalue(string key)

void analyse(lista)

int findbykey(string key)

string keyword[6]=;

bool isletter(char a)

else

}bool isdigit(char a)

else

}bool iskeyw(string keywords)

}return false;

}bool isvar(string var) //id=letter(letter | digit)*

else if(type==1)

else if(type==2)

return req;

}string texthandle(string test,int linenum)

else if(isvar(test))

else if(isnum(test))

else if(-1==findbykey(test))

else

}listfile_output(char* filename)

{ int linenum=0;

string test;

fstream file;

string pice;

string expression="";

listwords;

file.open(filename,ios_base::in|ios_base::out) ;

if(!file)

{cout<<"error"<::iterator i;

for (i = words.begin(); i != words.end(); ++i)

//測試

cout<<*i<請大神告訴我:1.如何實現自動構建這種表呢?2.有沒有通用的方法

編譯原理筆記8 自上而下語法分析

1.自上而下分析法的一般問題。1 自上而下語法分析定義 從文法的開始符號開始,反覆使用不同產生式進行推導以謀求與輸入符號串相匹配。注 此處的輸入符號串是指詞法分析結果的一串二元式。2 一般方法 a 基本構成 設下推棧的初始狀態包括兩個符號 s 其中 為棧底,s 為文法開始符號。整個分析過程在語法分析...

編譯原理系列 實驗二自上而下語法分析

系列第二更!目錄 問題描述 最基本的要求,能對乙個算術表示式 a 15 b做自上而下的語法分析,具體內容見實驗指導實驗二的內容,文法在實驗指導最開始幾頁,重點關注以下幾條文法的ebnf,若不習慣看文法的巴科斯正規化ebnf,可先將文法改寫成常規的產生式形式p75 表示式 項 項 因子 因子 識別符號...

語法分析 自上而下分析

語法分析 是編譯過程的核心部分。它的任務是在詞法分析識別出單詞符號串的基礎上,分析並判定程式的語法結構是否符合語法規則。語言的語法結構是用上下文無關文法描述的。因此,語法分析器的工作本質上就是按文法的產生式,識別輸入符號串是否為乙個句子。這裡所說的輸入串是指由單詞符號 文法的終結符 組成的有限序列。...