当前位置:首页 » 编程软件 » 编译原理构造分析表

编译原理构造分析表

发布时间: 2022-02-28 19:00:43

⑴ 请学过编译原理的进来编个词法分析器 对应下面的表格 用C或C++

你用lex自动给你生成一个然后再去阅读其源码

⑵ 编译原理算符优先分析法中构造分析表的时候,井号和其他符号的优先级怎么判断在线等。

首先,算符优先分析法只考虑终结符之间的优先关系。
其次,#和其他终结符之间的优先关系按如下方法来确定:
1)假设文法的开始符为E,则增加一个产生式E‘-> #E#, E'不在原文法中出现
2)#<FIRSTVT(E) ; LASTVT(E)>#

⑶ 编译原理

4、文法G为:
A->aABe/Ba
B->dB/ε
构造LL(1)分析表并判断adae是否是该文法的句子。
5、文法G为:
A->i:=E;
E->E+E
E->E*E
E->i
构造SLR分析表,并判断i:=i*i是否是该文法的句子。
6、文法G为:
S->E
E->aB/bB
A->cA/d
B->Cb/d
构造该文法的LR(0)和SLR(1)分析表,并模拟分析句子bcd时分析栈和输入串的变化。
7、文法G为:
E->E+T/T
T->T*F/F
F->P^F/P
P->(E)/i
判断该文法是否为算符优先文法,若是,构造优先表。

⑷ [高分,急!]编译原理LR(1)分析表题目

I0: S->.T,# T->.T(T),#
I1: S->T.,# T->T.(T),#
I2: S->T(.T),# T->.T(T),) T->.ε,)
I3: S->T(T.),# T->T.(T),)

(1,() 是s2
(1,#) 是acc (就是接受)
T下1 是1
T下3 是3

⑸ 编译原理中LR(0)分析表中的r1、r2等等 是怎么规则填写的s1、s2…我明白了,但r规则看不懂

r表示规约 r5表示的就是用第五条产生式进行规约的 至于r填在哪里吗 我就举个例子吧 比如I8 进行规约 就会在H的所有fellow集合上填上r5 希望你能看懂。。。。

⑹ 编译原理:优先函数 f和g 到底怎么看啊,不懂怎么构造的 求解...

求算符优先函数的方法—迭代法

若已知运算符之间的优先关系,可按如下步骤构造优先函数:

1、对每个运算符a(包括#在内)令f(a)=g(a)=1

2、如果a⋗b且f(a)<=g(b),令f(a)=g(b)+1

3、如果a⋖b且f(a)>=g(b),令g(b)= f(a)+1

4、如果a≐b而f(a) ≠g(b),令min{f(a),g(b)}=max{f(a),g(b)}

5、重复2~4,直到过程收敛。如果重复过程中有一个值大于2n,则表明不存在算符优先函数。

⑺ 编译原理LR分析法中的SLR(1)分析表和LR分析过程、语法树怎么求

第二题和第三题拿去,刚做的:


由B->cAa|c就可知该文法不是LR(0)文法了


⑻ 编译原理算符优先分析法中构造分析表的时候,井号和其他符号的优先级怎么判断

产生式中,只有两种文法符号:终结符和非终结符。
所有的优先关系,也仅仅只存在于这两种符号之间。

并号不是产生式中的符号,它仅仅只是将两个左端相同的产生式写在一个式子里的省略写法用的辅助符号。
所以,它不存在优先关系。

遇到并号之类的辅助符号,应当将它们拆开,写成标准形式的产生式,再分析产生式中的优先关系。

⑼ 编译原理,构造SLR分析表时,产生式中出现F的星闭包该怎么处理

仔细分析你的文法
F->F*|a|b也就是说,写成正则表达式的话 F就是[ab]*
同样的T也是[ab]*

你的整个文法就是[ab]+ [ab\+]*第一个+是+closure,第二个+是符号+,所以用了\符号
个人感觉这个文法是有问题的,因为根本不需要用上下文无关文法表达,只需要正则表达式就可以了。

⑽ 编译原理文法分析

改完了,能文法分析出来了!!
大概 跟你说下 你的错误吧:
出错地点:
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; //分析成功,返回
}

热点内容
脚本设计图 发布:2025-01-18 18:06:17 浏览:600
内部存储空间不足总是跳出来 发布:2025-01-18 17:56:22 浏览:950
安卓光遇更新后魔法商店去哪里了 发布:2025-01-18 17:55:47 浏览:132
安卓手机怎么变成苹果设备 发布:2025-01-18 17:46:06 浏览:915
linux服务端 发布:2025-01-18 17:36:55 浏览:250
表白代码的编译器是什么 发布:2025-01-18 17:36:53 浏览:999
录像机日志服务器地址怎么填 发布:2025-01-18 17:28:17 浏览:110
安卓手机如何调整图标样式 发布:2025-01-18 17:23:53 浏览:549
计算机配置单怎么算 发布:2025-01-18 17:23:52 浏览:81
超级终端如何清空配置 发布:2025-01-18 17:18:44 浏览:598