ll1編譯器
Ⅰ 如何實現一個語法分析器ll
先做個LL(1)或者LALR的語法分析器,然後先把教材上的幾個LL(1)的例子調通過。然後網上有c語言子集的文法,有人做了轉成大小寫這樣的表述。通過那個的測試就差不多了。。。。其實做語法分析也沒多大用 編譯器的難點在於語法制導、代碼優化之類的,真要做C語言的完整編譯器,普通的學生都幾乎不可能實現。。。。就不多說了 你可以動手開始做了 如果你有較強的程序設計能力,做個漂亮的LR(1)分析器還是可以的,實在不會就做SLR(1)這樣的分析器,如果程序設計能力比較差,建議先做LL(1),那個比較好做。碼字不易,!
Ⅱ 編譯原理語法分析LL(1)程序
貌似我寫過LL1文法的DO WHILE 的循環語句那個什麼系統來著...
可惜要晚上回去在我電腦上菜能找到代碼.....
Ⅲ 編譯原理LL1語法分析的例子誰有
這個句子要分成兩大部分看:1.He said that....2.All things considered, he thought it was a bad idea.
2是1的賓語從句,但復雜的是在2這個賓語從句中包含了一個獨立主格結構(All things considered),其實2的核心主語和謂語應該是he和thought,此時all things是獨立於這個核心主語的,我們叫它獨立主格,此時considered不是謂語動詞,而是非謂語,在這里表示被動,所以all things considered不是一句完整的話(完整的應該是all things are considered)這里all things 是獨立主格considered是它的非謂語,一起構成一個獨立主格結構,和後面句子放在一起構成主句的賓語從句,是符合語法的。
Ⅳ 請問在 c語言中 1LL的意義
C語言中的printf、scanf、 sprintf、sscanf等函數中需要用格式字元串來控制數據的輸出格式。
比如: printf("%lx", 65535); /* 將65535輸出為十六進制格式 */
輸入參數"%lx"就是格式控制串,其中的%是格式控制符, l表示數據為長整型,x表示輸出十六進制
執行該函數輸出的內容為: ffff
更詳細的格式控制符說明如下:
語法: %[-][width][.prec]type
其中中括弧中的內容是可選項,每項的含義分別如下:
-: 表示輸出時按左對齊的格式,否則為右對齊。
width:輸出的總寬度(包括後面的prec),如果給的寬度不夠,則會自動增加寬度,而不會截斷。
prec: 用於控制浮點數的輸出小數位數
type: 類型控制符,具體如下:
d或i: 有符號整數
u: 無符號整數
x: 用十六進製表示整數
o: 用八進製表示整數
f: 浮點數
g: 用科學計數法表示浮點數
s: 字元串
c: 字元
其中 d、i、u、x、f、g前面可以加上字母l或ll表示long或者long long,
比如 "%ld"可以輸出32位整數,"%lld"可以輸出64位整數。
以上內容僅供參考,因為不同的編譯器可能會根據需要定義自己的控制符。
Ⅳ 求用LL1文法的匯編器程序,最好用C或C++
/////////////////////////////////////////////////////////////
// LL(1)文法預測分析程序 ////
/////////////////////////////////////////////////////////////
/////////////////LL(1)文法///////////////////////////////////
// E->TG ////
// G->+TG|$ ////
// T->FH ////
// H->*FH|$ ////
// F->(E)|$ ////
/////////////////////////////////////////////////////////////
////////////////LL(1)預測分析表//////////////////////////////
// | i | + | * | ( | ) | # |///
//————————————————————————————///
// E | TG | | TG | | | |///
//————————————————————————————///
// G | | +TG | | | $ | $ |///
//————————————————————————————///
// T | FH | | | FH | | |///
//————————————————————————————///
// H | | $ | *FH | | $ | $ |///
//————————————————————————————///
// F | i | | | (E) | | |///
//————————————————————————————///
/////////////////////////////////////////////////////////////
#ifndef PREANALYSIS_H
#define PREANALYSIS_H
struct CHARSTACK{
char ch;
CHARSTACK *nextNode;
};
struct HEADSTACK
{
CHARSTACK *stackHead;
};
int Stack_Count(HEADSTACK *head)
{
int count=0;
if(head->stackHead==NULL)
return 0;
CHARSTACK *currentNode=head->stackHead;
while(currentNode!=NULL)
{
currentNode=currentNode->nextNode;
count++;
}
return count;
}
HEADSTACK *Stack_Init()
{
HEADSTACK *headNode=(HEADSTACK *)malloc(sizeof(HEADSTACK));
headNode->stackHead=NULL;
return headNode;
}
void Stack_Push(HEADSTACK *head,char ch)
{
CHARSTACK *currentNode,*tail;
tail=(CHARSTACK *)malloc(sizeof(CHARSTACK));
tail->ch=ch;
tail->nextNode=NULL;
if(head->stackHead==NULL)
{
head->stackHead=tail;
return;
}
currentNode=head->stackHead;
while(currentNode->nextNode!=NULL)
{
currentNode=currentNode->nextNode;
}
currentNode->nextNode=tail;
currentNode=tail;
currentNode->nextNode=NULL;
}
CHARSTACK Stack_Pop(HEADSTACK *head)
{
CHARSTACK *currentNode,*tail,popNode;
if(head->stackHead==NULL)
{
printf("Error:The Stack does not has node\n");
return popNode;
}
currentNode=tail=head->stackHead;
if(tail->nextNode==NULL)
{
//只有一個節點時
popNode.ch=tail->ch;
popNode.nextNode=NULL;
head->stackHead=NULL;
return popNode;
}
while (tail->nextNode!=NULL)
{
tail=tail->nextNode;
if(tail->nextNode==NULL)
{
currentNode->nextNode=NULL;
popNode.ch=tail->ch;
popNode.nextNode=tail->nextNode;
return popNode;
}
currentNode=currentNode->nextNode;
}
}
#define MAXSYMBOL 30
//終結符
char NT[]={'E','G','T','H','F'};
//非終結符
char TE[]={'i','+','*','(','(',')'};
//LL(1)預測分析表
char *analysisTable[MAXSYMBOL][3]={
{"E","i","TG"},{"E","+",""},{"E","*",""},{"E","(","TG"},{"E",")",""},{"E","#",""},
{"G","i",""},{"G","+","+TG"},{"G","*",""},{"G","(",""},{"G",")","$"},{"G","#","$"},
{"T","i","FH"},{"T","+",""},{"T","*",""},{"T","(","FH"},{"T",")",""},{"T","#",""},
{"H","i",""},{"H","+","$"},{"H","*","*FH"},{"H","(",""},{"H",")","$"},{"H","#","$"},
{"F","i","i"},{"F","+",""},{"F","*",""},{"F","(","(E)"},{"F",")",""},{"F","#",""},
};
//判斷是否為終結符
bool IsNT(char ch)
{
for(int i=0;i<sizeof(NT)/sizeof(char);i++)
{
if(ch==NT[i])
return true;
}
return false;
}
//判斷是否為非終結符
bool IsTE(char ch)
{
for(int i=0;i<sizeof(TE)/sizeof(char);i++)
{
if(ch==TE[i])
return true;
}
return false;
}
char* GetMatrixValue(char NT,char TE)
{
char nt[2],te[2];
nt[0]=NT;
nt[1]='\0';
te[0]=TE;
te[1]='\0';
for(int i=0;i<MAXSYMBOL;i++)
{
if((strcmp(nt,analysisTable[i][0])==0)&&(strcmp(te,analysisTable[i][1])==0)&&(analysisTable[i][2]!=""))
{
return analysisTable[i][2];
}
}
return "";
}
//判斷是否為句子
bool IsCorrectSentence(char str[])
{
int pos=0;
bool Flag=true;
char X;
char *conclude;
HEADSTACK *head;
head=Stack_Init();
Stack_Push(head,'#');
Stack_Push(head,'E');
while(Flag)
{
X=Stack_Pop(head).ch;
if(IsTE(X))
{
if(X==str[pos])
{
pos++;
}
else
{
return false;
}
}
else if(X=='#')
{
if(X==str[pos])
Flag=false;
else
return false;
}
else if(strcmp((conclude=GetMatrixValue(X,str[pos])),"")!=0)
{
if(strcmp(conclude,"$")==0)
{
continue;
}
for(int j=strlen(conclude)-1;j>-1;j--)
{
Stack_Push(head,conclude[j]);
}
}
else
{
return false;
}
}
return true;
}
#endif
原來學編譯原理的時候寫的,不過是文法是固定死的,現在也忘了:)
Ⅵ 關於編譯原理
可以自己寫一個JPanel或者JComponent的子類,然後在子類中重寫paint方法,在裡面繪制背景圖片。下面的部分是從我的代碼里截出來的,不保證這樣能用,只是給你個大體的絲路。學會了這個後自己重寫組件就方便多了 public class ChessBoard extends JComponent{ private Image screen = null; public void paint(Graphics g) { if (screen != null) { g.drawImage(screen, (width - BOARDWIDTH) / 2, (height - BOARDHEIGHT) / 2, this); } else { screen = ChessBoard.this.createImage(BOARDWIDTH,BOARDHEIGHT); } } }
Ⅶ 編譯原理的LL(1)文法是什麼意思
1.文法不含左遞歸,沒有公共左因子
2.對於文法中的每個非終結符A的產生式的候選首符集兩兩不相交。
3.對於文法中的每個非終結符A,它存在某個候選首符集包括ε,則FIRST(A)∩FOLLOW(A)=空
滿足以上條件的文法為LL(1)文法
Ⅷ LL(1)文法-------編譯原理
我正在寫一個編譯器,源代碼在這里:
http://code.google.com/p/bellman/source/browse
其中詞法規則在lex.l文件中,語法規則在grammer.y中,分別用flex和bison的輸入文件的格式寫的。我實現了一個類似C/C++的語法
地址如下:
http://code.google.com/p/bellman/source/browse/trunk/lib/bellman/lex.l
http://code.google.com/p/bellman/source/browse/trunk/lib/bellman/grammer.y
具體有什麼問題可以發郵件[email protected]
Ⅸ c語言符合ll1文法嗎
LCC編譯器用的是LL1文法.
Ⅹ 編譯原理的LL(1)文法是什麼意思
L表明自頂向下分析是從左向右掃描輸入串,第2個L表明分析過程中將用最左到推倒,1表明只需向右看一個符號便可決定如何推倒即選擇哪個產生式(規則)進行推導,類似也可以有LL(k)文法,也就是需要向前查看k個符號才能確定選用哪個產生式、、