• 5星
18KB m0_44995828 2020-12-16 21:46:42
• 5星
337KB wangshang12 2010-06-11 15:24:17
• 199KB agkwyf 2010-06-20 04:37:01
• ## 编译原理简单优先文法的判定以及分析器的构造 编译课程设计

4星
133KB xunian123 2010-06-11 23:52:19
• ## 编译原理_简单优先文法_语法分析器_Java 编译原理 java

原理：简单优先分析算法 语言：Java若需要查看算符优先算法，请进入主页查看https://blog.csdn.net/qq_24065713/article/details/71375421 MainMethod.java     public class MainMethod { public Str.....
本贴完全原创
根据《编译原理》何炎祥第三版第六章语法分析器实现
原理：简单优先分析算法
语言：Java若需要查看算符优先算法，请进入主页查看https://blog.csdn.net/qq_24065713/article/details/71375421

MainMethod.java

public class MainMethod {

public String jie="";
public String k = "　　　　";
int s = 1;
public String jieguo = "步骤"+"　　　"+"符号栈"+"　　　"+"关系"+"　　　"+"输入串"+"　　　"+"操作"+"\n\n";

public boolean accept(StringBuffer stack1,StringBuffer stack2){
boolean result ;

outer:
while (true) {
char c1 = stack1.charAt(stack1.length() - 1);//符号栈倒数第一个字符
char c2 = stack2.charAt(0);//输入串第一个字符
char c3 = stack1.charAt(stack1.length() - 2);//符号栈倒数第二个字符

if (c1=='S'&&c2=='$'&&c3=='$') {//判断是简单优先算法的条件
jie = "OK";
return true;

}

switch (c1) {//根据符号栈最后一位字符判断是什么操作
case '$': if (DaXiao(c1, c2) == -1) {//比较c1,c2的优先级，根据优先级判断操作方式 stack1.append(c2);//移进操作 stack2.deleteCharAt(0);//删除原输入串第一位字符 jieguo = jieguo+s++;//计数，拼接字符串方式 jieguo = jieguo +k+stack1 + k+"</="+k+stack2+k+"移进"+"\n";//结果用字符串拼接方式显示 } else {//$优先级最小，所以不可能出现其他情况
result = false;
jie = jie  + "$无法匹配"; break outer; } break; case '(': if (DaXiao(c1, c2) == 0 || DaXiao(c1, c2) == -1) { stack1.append(c2); stack2.deleteCharAt(0); jieguo = jieguo+s++; jieguo = jieguo +k+stack1 + k+"</="+k+stack2+k+"移进"+"\n"; } else { result = false; jie = jie + "(无法匹配"; break outer; } break; case 'a': if (DaXiao(c1, c2) == 1) { stack1.deleteCharAt(stack1.length() - 1); stack1.append('S'); jieguo = jieguo+s++; jieguo = jieguo +k+stack1 + k+" > "+k+stack2+k+"S->a"+"\n"; }else { result = false; jie = jie + "a无法匹配"; break outer; } break; case 'S': if (DaXiao(c1, c2) == 1) { stack1.deleteCharAt(stack1.length() - 1); stack1.append('T'); jieguo = jieguo+s++; jieguo = jieguo +k+stack1 + k+" > "+k+stack2+k+"T->S"+"\n"; } else if (DaXiao(c1, c2) == 0) { stack1.append(c2); stack2.deleteCharAt(0); jieguo = jieguo+s++; jieguo = jieguo +k+stack1 + k+"</="+k+stack2+k+"移进"+"\n"; } else { result = false; jie = jie + "S无法匹配"; break outer; } break; case 'T': if (DaXiao(c1, c2) == 1) { if (DaXiao(c3, c1) == -1||DaXiao(c3, c1) == 10)//由于T可能有两种产生情况，所以要另外判断句柄 { stack1.deleteCharAt(stack1.length() - 1); stack1.append('R'); jieguo = jieguo+s++; jieguo = jieguo +k+stack1 + k+" > "+k+stack2+k+"R->T"+"\n"; } else if (DaXiao(c3, c1) ==0||DaXiao(c3, c1) ==1)//由于T可能有两种产生情况，所以要另外判断句柄, { stack1.deleteCharAt(stack1.length()-1); stack1.deleteCharAt(stack1.length()-1); stack1.deleteCharAt(stack1.length()-1); stack1.append('T'); jieguo = jieguo+s++; jieguo = jieguo +k+stack1 + k+" > "+k+stack2+k+"T->S,T"+"\n"; } else { result = false; jie = jie + "T无法匹配"; break outer; } } else { result = false; jie = jie + "T无法匹配"; break outer; } break; case 'R': if (DaXiao(c1, c2) == 0) { stack1.append(c2); stack2.deleteCharAt(0); jieguo = jieguo+s++; jieguo = jieguo +k+stack1 + k+" = "+k+stack2+k+"移进"+"\n"; } else { result = false; jie = jie + "R无法匹配"; break outer; } break; case ')': if (DaXiao(c1, c2) == 1) { if (DaXiao(c3, c1) != -1)//由于T可能有两种产生情况，所以要另外判断句柄, { stack1.deleteCharAt(stack1.length()-1); stack1.deleteCharAt(stack1.length()-1); stack1.deleteCharAt(stack1.length()-1); stack1.append('S'); jieguo = jieguo+s++; jieguo = jieguo +k+stack1 + k+" > "+k+stack2+k+"S->(R)"+"\n"; } } else { result = false; jie = jie + ")无法匹配"; break outer; } break; case ',': if (DaXiao(c1, c2) == 0 || DaXiao(c1, c2) == -1) { stack1.append(c2); stack2.deleteCharAt(0); jieguo = jieguo+s++; jieguo = jieguo +k+stack1 + k+"</="+k+stack2+k+"移进"+"\n"; } else { result = false; jie = jie + ",无法匹配"; break outer; } break; case '^': if (DaXiao(c1, c2) == 1) { stack1.deleteCharAt(stack1.length() - 1); stack1.append('S'); jieguo = jieguo+s++; jieguo = jieguo +k+stack1 + k+" > "+k+stack2+k+"S-a"+"\n"; }else { result = false; jie = jie + "^无法匹配"; break outer; } break; default: jie = jie +"输入非法字符"; return false; } } return result; } public int DaXiao(char c1,char c2){ if(c1=='$') return -1;//$else if(c1 == 'S'&&c2 ==',')return 0;//S else if (c1 == 'S'&& (c2==')'||c2 == '$'))return 1;

else if(c1=='R'&&c2 ==')')return 0;
else if(c1=='R'&&c2 =='$')return 1; else if (c1=='T'&&(c2 == ')'||c2 == '$')) return 1;//T

else if (c1 == 'a' &&(c2=='a'||c2 == ')'||c2 == '$'))return 1;//a else if (c1 == '^' &&(c2=='a'||c2 == ')'||c2 == '$'))return 1;//^

else if (c1 == ',' &&(c2=='S'||c2 == 'a'||c2 == '^'||c2 == '('))return -1;//,
else if (c1 == ',' &&c2=='T')return 0;
else if (c1 == ',' &&c2=='$')return 1; else if (c1 == '(' &&(c2=='S'||c2 == 'T'||c2 == 'a'||c2 == '^'||c2 == '('))return -1;//( else if (c1 == '(' &&c2=='R')return 0; else if (c1 == '(' &&c2=='$')return 1;

else if (c1 == ')' &&(c2==','||c2 == ')'||c2 == '$'))return 1;//) else return 10;//不存在关系 } }  WaiKe.java import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; /** * Created by 吴为 on 2017/4/24. */ public class WaiKe {//GUI public WaiKe(){ JFrame jFrame = new JFrame("简单优先分析算法"); JPanel jPanel = new JPanel(); JButton jButton = new JButton("开始分析"); TextArea textArea = new TextArea(); JTextField jTextField1 = new JTextField("待 输 入 文 法"); JTextField jTextField2 = new JFormattedTextField(" "); TextArea textArea1 = new TextArea(); textArea1.setText(" ｜ Ｒ Ｓ Ｔ ａ ＾ ， （ ）\n" + "---------------------------------------------------------------------------\n" + "Ｒ｜ ＝\n" + "Ｓ｜ ＝ ＞\n" + "Ｔ｜ ＞\n" + "ａ｜ ＞ ＞\n" + "＾｜ ＞ ＞\n" + "，｜ ＜ ＝ ＜ ＜ ＜ \n" + "（｜ ＝ ＜ ＜ ＜ ＜ ＜ \n" + "）｜ ＞ ＞"); jFrame.setVisible(true); jFrame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e){ System.exit(0); } }); jFrame.setLayout(null); jPanel.setLayout(null); jFrame.setBounds(100,100,500,800); jPanel.setBounds(0,0,500,800); textArea.setBounds(0,300,500,500); textArea1.setBounds(0,100,500,300); jButton.setBounds(175,50,100,30); jTextField1.setBounds(50,50,100,30); jTextField2.setBounds(300,50,100,30); jFrame.add(jPanel); jPanel.add(jTextField1); jPanel.add(jButton); jPanel.add(jTextField2); jPanel.add(textArea); jPanel.add(textArea1); jButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { String wenFa = jTextField1.getText(); StringBuffer stringBuffer1 = new StringBuffer("$");
StringBuffer stringBuffer2 = new StringBuffer(wenFa);

MainMethod m= new MainMethod();
m.accept(stringBuffer1,stringBuffer2);

jTextField2.setText(m.jie);
textArea.setText(m.jieguo);

}
});
}

}

Test.java

/**
* Created by 吴为 on 2017/4/24.
*/
public class Test {//主方法
public static void main(String []args){
new WaiKe();

}
}



展开全文
qq_24065713 2017-04-24 21:12:59
• ## warshall算法实现简单优先文法 简单优先文法

36KB sunandtwins 2009-10-02 08:25:26
• 5KB mengyuanxin 2008-11-27 00:40:25
• 745KB sunandtwins 2009-10-02 08:31:26
• ## 简单优先分析 java

实验原理 简单优先文法定义： 一个文法是简单优先文法，需要满足以下两个条件： ①在文法符号集中V，任意两个符号之间必须之后一种优先关系存在。（显然满足） ②在文法中，两个产生式不能有相同的右部。 2 . 简单...
实验原理
简单优先文法定义： 一个文法是简单优先文法，需要满足以下两个条件： ①在文法符号集中V，任意两个符号之间必须之后一种优先关系存在。（显然满足） ②在文法中，两个产生式不能有相同的右部。 2 . 简单优先分析法的操作步骤 将输入输入串a1a2···an#依次压栈，不断比较栈顶符号ai和下一个待输入符号aj的优先级，若ai>·aj则进行下一步，否则重复此步骤。
解读：停止条件是ai>·aj表示前面输入串一定比后面先归约，所以只需要在前面找句柄就行了。
栈顶符号ai即为句柄尾，从此处向左寻找句柄头ak，满足ak-1<·ak。
解读：从后向前找ak-1<·ak表示ak之前的输入串一定比ai···ak后归约，由此确定现在就是要归约ai···ak。
由句柄ai···ak在文法中寻找右部为ai···ak的产生式；找到则将句柄替换为相应左部，找不到则说明该输入串不是该文法的句子。
重复以上步骤直到归约完成。
实例分析
文法： Z->bMb M->a M->(L L->Ma)
优先关系矩阵
ZMLb(a)#Z>M==L>>b=<<(=<<a>>=)>>#<<
将该表手动输入得到结果
问题1：无法在Stack类里将Object类直接转换为Char类型 问题截图：无法将字符直接进栈

解决方法：自己写一个Stack类
class myStack {
public char[] mySt;
public int len;
myStack(){
mySt=new char[20];
len=0;
}
void push(char c){
mySt[len++]=c;
}
char peek() {
return mySt[len-1];
}
void pop(){
len--;
}
char getElement(int i) {
return mySt[i];
}
void showSt(){
for(int i=0;i<len;i++) {
System.out.print(mySt[i]);
}
System.out.print("\t");
}
}

问题二：无法正确从字符数组中读取到栈中 因为我要实现从字符串的头读取到栈顶，起初我在字符串的头部增设“#”就导致字符串将第一个字符“#”传入栈后，自身就没有了。 对于字符串长度和栈的长度等需要明确 解决办法：进行调试明确到长度和指针的值 问题三：执行到中途有误 分析原因：①对于getElement（）方法不能以judge[]中的i作为标准。
②对于替换之后要将栈长度进行相应的变换
问题截图：  问题四： 循环条件不应该以字符串为标准，应该基于栈内是否得到#Z的情况 问题截图：判断了字符串的长度次之后就结束程序了  问题五：对于成功的条件没有设置清楚  解决方法： 在match（）中增加条件
if(begin=='Z'&&st.getElement(i-1)=='#')
{System.out.println("符合！");
System.exit(0);
}

至此，问题就大致解决了 
展开全文
m0_45890079 2021-10-31 15:49:15
• ## 编译原理——判断文法是否为算符优先文法 编译原理

编译原理——判断文法是否为算符优先文法 在判断之前我们需要看一下该文法是否为算符文法。 算符文法定义 一个文法，如果它的任意产生式的右部都不含两个相继（并列）的非终结符，即不含如下形式的产生式右部： …QR...
编译原理——判断文法是否为算符优先文法
在判断之前我们需要看一下该文法是否为算符文法。
算符文法定义
一个文法，如果它的任意产生式的右部都不含两个相继（并列）的非终结符，即不含如下形式的产生式右部： …QR… 那么我们称该文法为算符文法。

接下来就可以构造优先关系表了，再构造之前我们需要了解两个基本知识。
1.算符优先关系
关系有三种: a<b a的优先性低于b a>b a的优先性高于b a=b a的优先性等于b 注意：<,>,=写的时候中间有个点，而且关系不像数学中的那样，a<b不一定意味着b>a,a=b也不一定意味着b等于a。
2.FIRSTVT集和LASTVT集的构造方法
FIRSTVT集构造方法： 1.P->a…或者P->Qa…，那么a∈FIRSTVT（P） 2.a∈FIRSTVT(Q)且P->Q…，那么a∈FIRSTVT（P）
LASTVT集构造方法： 1.P->…a或者P->…aQ，那么a∈LASTVT（P） 2.a∈LASTVT（Q），P->…Q，那么a∈LASTVT（P）
看上去是不是很简单，那我们  设有文法G: S→a|b|(A) A→SdA|S
对于FIRSTVT（S），很容易看出来有a，b（…在这里就是空字），还有（【这里的…就是A）】，对于FIRSTVT（A），有d（应用了P->Qa…），再通过第二条规则，在这里SdA和S哪个产生式都行，可以看出要把FISRTVT（S）加到FIRSTVT（A）里，所以我们得到： FIRSTVT（S）={a，b，( }； FIRSTVT（A）={a，b，d，（ }； 注意：FIRSTVT（S）和FIRSTVT（A）写的顺序不可以调换，看文法的顺序，S在上就先写S的，一会要用到。

对于LASTVT（S），有a，b，）【这里用的是P->…Qa,还有印象吧】，对于LASTVT（A），有d，根据A->…Q，（这里的…就是空字），我们可以看出还要把LASTVT（S）加到LASTVT（A）里，所以我们得到： LASTVT（S）={a，b，）}； LASTVT（A）={a，b，d，）}；
构造优先关系表
这是针对上述文法的优先表，我们来说一下怎么构造。 我们先找填写=的，若文法中产生式有满足P->…ab…或P->…aQb…的那么就直接填写=，注意顺序是左边等于右边，对应表是横着的等于竖着的，这里是（=），#号直接填写等于就好了。 然后再去文法中找类似于P->QaR这种有用的文法，终结符和非终结符在一起的那种。找到后根据以下两条： 1.a小于FIRSTVT(R）中元素，横着写 2.LASTVT（Q）中元素大于a，竖着写
比如这里A->SdA，d小于FIRSTVT（A），对应着倒数第二行a，b，（，d那里都填了<，然后LASTVT（S）都大于d，对应着倒数第二列a，b，）那里都填了>。 剩下的大家可以自己对照着看。 最后是#号的填法，用到了第一个FIRSTVT集和LASTVT集（所以才说不可以调顺序），填法跟上面的一样，横着的都小于FIRSTVT集，像这里最后一行#小于a，b，（，然后LASTVT集元素大于#，竖着的填>，像这里对应最后一列，a，b，）那里都填了>。
表构建完了我们就可以写结论了： 该文法任一产生式右部都不含两个相继的非终结符，故为算符文法。从上表可以看出，任何两个终结符之间至多满足=，<，>，三种关系之一，故该文法为算符优先文法。

个人觉得编译原理算是比较难的了，我也是第一次写博客，想通过大白话让大家都能看懂，错误的地方还望各位大牛指正，提提宝贵意见。 
展开全文
weixin_44162921 2019-12-10 12:29:33
• ## 简单算符优先文法分析程序（编译原理） 编译原理

279KB u010635543 2017-12-26 16:01:19
• 5.3视频，48分钟往后看。
5.3视频，48分钟往后看。
展开全文
weixin_43912188 2021-04-09 16:32:02
• ## 2020编译原理练习记录(4)--------算符优先文法 经验分享

qq_43337175 2020-05-14 13:00:59
• getianao97 2018-12-03 18:44:00
• ## 算符优先文法 编译器

weixin_43634220 2020-11-28 16:40:58
• 20KB straybird_fish 2012-07-10 16:13:57
• ## java实现算符优先文法ll1文法 编译原理 算符优先文法 java

weixin_41705703 2019-06-04 21:22:27
• ## 编译原理简单优先分析算法 编译原理 c++

ye_se_cong_cong 2017-06-02 18:36:48
• 249KB wangyao635 2009-06-23 07:51:55
• Hickey_Chen 2018-12-29 18:26:04
• 108KB lizhenqi19890218 2010-11-16 14:17:28
• weixin_41032720 2019-07-13 10:59:18
• tpman07 2016-12-11 14:37:45
• qq_43309286 2020-09-05 12:14:43
• 51KB ygb101013 2015-06-30 11:11:35
• ## 编译原理基本定义（文法、算符文法、算符优先文法、算符优先关系表、算符优先分析过程） 编译器

qq_48813213 2021-12-27 11:57:28
• weixin_33696106 2019-05-29 22:00:00

...