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个符号才能确定选用哪个产生式、、