当前位置:首页 » 编程软件 » 编译原理文法规则处理

编译原理文法规则处理

发布时间: 2022-09-19 21:00:55

编译原理简单文法归约计算

编译原理中的语法和文法是不一样的,但却融会贯通。
在计算机科学中,文法是编译原理的基础,是描述一门程序设计语言和实现其编译器的方法。
文法分成四种类型,即0型、1型、2型和3型。这几类文法的差别在于对产生式施加不同的限制。
形式语言,这种理论对计算机科学有着深刻的影响,特别是对程序设计语言的设计、编译方法和计算复杂性等方面更有重大的作用。
多数程序设计语言的单词的语法都能用正规文法或3型文法(3型文法G=(VN,VT,P,S)的P中的规则有两种形式:一种是前面定义的形式,即:A→aB或A→a其中A,B∈VN ,a∈VT*,另一种形式是:A→Ba或A→a,前者称为右线性文法,后者称为左线性文法。正规文法所描述的是VT*上的正规集)来描述。
四个文法类的定义是逐渐增加限制的,因此每一种正规文法都是上下文无关的,每一种上下文无关文法都是上下文有关的,而每一种上下文有关文法都是0型文法。称0型文法产生的语言为0型语言。上下文有关文法、上下文无关文法和正规文法产生的语言分别称为上下文有关语言、上下文无关语言和正规语言。

⑵ 规约的编译原理

推导的逆过程称为规约。规约就是选择一个文法规则:X→ABC,依次从栈顶弹出C、B、A,再将X压进栈。规范规约是文法中句子的一个最右推导的逆过程,而最左推导对应的是最右规约 。
另外在程序设计中的规约:∏和∏'是两个判定性问题,如果存在一个确定性算法A使得对于一个∏的实例I,A可以将I在多项式时间里转换成∏'的实例P,使得I得到肯定的回答,当且仅当I'得到肯定回答,则称∏在多项式时间里规约到∏',记为∏∝poly∏'.

⑶ 编译原理文法分析

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

⑷ 编译原理中如何用c语言来编写程序判断输入的字符串是否符合文法规则

LEX可以进行词法分析。
如果要自己写,主要是把正则文法转化为自动机,根据输入串进行状态转移。

⑸ 编译原理中如何用c语言来编写程序判断输入的字符串是否符合文法规则

scanf()有返回值,若返回值是0,则不符合文法规则
一般情况下,scanf()返回值是输入的字符数

⑹ 编译原理,为文法添加语义规则,求图片上题的详细解答过程,越细越好,完全不会啊,求大神指导。。

  • 每个产生式后面{ }中的内容即语义子程序。

  • 给每个非终结符设计一个语义值VAL,表示该非终结符对应的值

⑺ 编译原理中文法二义性问题

二义性文法

【定义】 若文法中存在这样的句型,它具有两棵不同的语法树,则称该文法是二义性文法。

二义性文法会引起歧义,应尽量避免之!

E E

E + E E * E

i E * E E + E i

i i i i

都可以表示i+i*i

所以G(E):E -> E+E | E*E | (E) | i ;文法具有二义性。

文法二义性的消除:

【方法1】不改变文法的原有规则,加进一些非形式规定。

加进运算符的优先顺序和结合规则对G(E),规定*优于+,*和+服从左结合

【方法2】构造一个等价的无二义性文法,将排除 二义性的规则合并到文法中

G(E) -> G´(E) : E -> E+T | T T -> T*F | F F -> (E) | i ;

⑻ 编译原理中的语法和文法一样吗

编译原理中的语法和文法是不一样的,但却融会贯通。
在计算机科学中,文法是编译原理的基础,是描述一门程序设计语言和实现其编译器的方法。
文法分成四种类型,即0型、1型、2型和3型。这几类文法的差别在于对产生式施加不同的限制。
形式语言,这种理论对计算机科学有着深刻的影响,特别是对程序设计语言的设计、编译方法和计算复杂性等方面更有重大的作用。
多数程序设计语言的单词的语法都能用正规文法或3型文法(3型文法G=(VN,VT,P,S)的P中的规则有两种形式:一种是前面定义的形式,即:A→aB或A→a其中A,B∈VN ,a∈VT*,另一种形式是:A→Ba或A→a,前者称为右线性文法,后者称为左线性文法。正规文法所描述的是VT*上的正规集)来描述。
四个文法类的定义是逐渐增加限制的,因此每一种正规文法都是上下文无关的,每一种上下文无关文法都是上下文有关的,而每一种上下文有关文法都是0型文法。称0型文法产生的语言为0型语言。上下文有关文法、上下文无关文法和正规文法产生的语言分别称为上下文有关语言、上下文无关语言和正规语言。

⑼ 编译原理的文法是什么

文法是描述语言规则的形式规则。实际上就是用一个四元组G=(VT,VN,S,P)定义的一个推理方式。其中VT是终结符,VN是非终结符,S是开始符号,P是一组产生规则。

⑽ 如何由文法推导语法树(编译原理)

语法树,是针对上下文无关文法,用来表示一个句型的生成过程的一种描述手段。

对于给定的句型,依据文法构造它的语法树,是语法分析的任务。
编译原理课程中重点学习的各种语法分析方法,都是解决语法树的构造的具体分析方法。

在学习并掌握各种语法分析方法之前,一般只能依据直觉印象,通过猜测、拼凑等手段,去试着推演,凑出符合要求的句型的语法树。所以这个阶段练习用的题目一般也不很复杂,通过多多练习也能找到一些技巧(其实主要是后面将要学习的自顶向下语法分析中的一些原则)。

对于给定的文法,有一些句型可能能构建出两棵甚至多棵结构不同的语法树,结果不一定是唯一的。这样的文法就是所谓的二义性文法。
对于非二义性文法而言,任意一个句型的语法树都是唯一的。

热点内容
scratch少儿编程课程 发布:2025-04-16 17:11:44 浏览:618
荣耀x10从哪里设置密码 发布:2025-04-16 17:11:43 浏览:345
java从入门到精通视频 发布:2025-04-16 17:11:43 浏览:60
php微信接口教程 发布:2025-04-16 17:07:30 浏览:287
android实现阴影 发布:2025-04-16 16:50:08 浏览:780
粉笔直播课缓存 发布:2025-04-16 16:31:21 浏览:332
机顶盒都有什么配置 发布:2025-04-16 16:24:37 浏览:195
编写手游反编译都需要学习什么 发布:2025-04-16 16:19:36 浏览:784
proteus编译文件位置 发布:2025-04-16 16:18:44 浏览:348
土压缩的本质 发布:2025-04-16 16:13:21 浏览:576