當前位置:首頁 » 編程軟體 » ll1編譯器

ll1編譯器

發布時間: 2022-04-15 12:21:19

Ⅰ 如何實現一個語法分析器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個符號才能確定選用哪個產生式、、

熱點內容
小蟻攝像機如何雲存儲 發布:2025-03-17 09:42:42 瀏覽:815
如何修改自己的名字和密碼 發布:2025-03-17 09:32:20 瀏覽:787
寶馬3系槍灰色輪轂是哪個配置 發布:2025-03-17 09:28:17 瀏覽:513
鴻蒙系統退回安卓系統怎麼備份 發布:2025-03-17 09:14:33 瀏覽:614
資料庫服務公司 發布:2025-03-17 08:56:43 瀏覽:495
我的世界伺服器載入不了區塊 發布:2025-03-17 08:56:39 瀏覽:817
如何給無線路由器設置密碼 發布:2025-03-17 08:51:40 瀏覽:886
SQL閥 發布:2025-03-17 08:45:23 瀏覽:162
ipadpro第一代什麼配置 發布:2025-03-17 08:44:38 瀏覽:198
linuxjava進程查看 發布:2025-03-17 08:29:19 瀏覽:969