概述
实验要求
实现文法如下:
P→bSe //<程序>→ begin<语句串>end
S→AS1 //<语句串>→ <语句>{;<语句>}
S1→S|e
A→i=E; //<赋值语句>→ ID=<表达式>
E→TE'
E'→+TE’|-TE’|e //<表达式>→ <项>{+<项> | -<项>}
T→FT'
T'→*FT’|/FT’|e //<项>→ <因子>{*<因子> | /<因子>}
F→(E)|i //<因子>→ (<表达式>) |ID
测试表达式
输入: bi=i+i*(i/i-i);i=i+i;e#
输出 success!
输入 i=i+i*ie #
输出 error
源程序
import java.io.*;
public class Exp2 {
public static String txt = null;//存储测试表达式
public static int p = 0;//读取表达式的指针
public static int m = 0;//测试表达式的长度
public static boolean SIGN = true;//判断表达式是否正确的记号
public static void main(String[] args) throws IOException {
System.out.println("请输入一个语句,以#号结束语句(直接输入#号退出)");
SIGN = true;
p = 0;
BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));//定义输入流
txt = buf.readLine().replaceAll(" ", "");//去掉所有空格,包括首尾和中间
m= txt.length();
if(txt.charAt(0) == '#'){//如果直接输入#号
buf.close();//关闭流对象
System.exit(0);//程序正常结束
}
P();
if(p == m-1 && txt.charAt(p) == '#')//如果读完测试表达式后且没有出错
System.out.println("success!");
buf.close();
}
private static void P() {//P--→bSe,<程序>--→ begin<语句串>end
if(txt.charAt(p) == 'b'){
p++;
}
else {
System.out.println("error1!");
SIGN = false;
}
S();
if(SIGN) {
if(txt.charAt(p) == 'e'){
p++;
}
else {
System.out.println("error2!");
SIGN = false;
}
}
}
private static void S() {//S--→AS1
if(SIGN) {
A();
S1();
}
}
private static void S1() {//S1--→S|空
if(SIGN) {
if(txt.charAt(p) == 'i'){//如果读到的字符属于S的First集
S();
}else if(txt.charAt(p)!='#' && txt.charAt(p)!='e'){//如果读到的字符不属于S1的Follow集
System.out.println("error3!");
SIGN = false;
}
}
}
private static void A() {//A--→i=E;
if(SIGN) {
if(txt.charAt(p) == 'i'){
p++;
if(txt.charAt(p) == '='){
p++;
} else {//如果i后面跟着的不是 =
System.out.println("error4!");
SIGN = false;
}
E();
if(txt.charAt(p) == ';'){
p++;
} else {//如果E后面不是以;结束
System.out.println("error5!");
SIGN = false;
}
}
else {//如果不是以 i开头
System.out.println("error6!");
SIGN = false;
}
}
}
private static void E() {//E--→TE'
if(SIGN) {
T();
E1();
}
}
private static void E1() {//E'--→+TE’|-TE’|空
if(SIGN) {
if(txt.charAt(p) == '+' || txt.charAt(p) == '-'){
p++;
T();
E1();
}else if(txt.charAt(p)!='#' && txt.charAt(p)!=';' && txt.charAt(p)!=')'){//如果读到的字符不属于E1的Follow集
System.out.println("error7!");
SIGN = false;
}
}
}
private static void T() {//T--→FT'
if(SIGN)
{
F();
T1();
}
}
private static void T1() {//T'--→*FT’|/FT’|空
if(SIGN) {
if(txt.charAt(p) == '*' || txt.charAt(p) == '/'){
p++;
F();
T1();
}else if(txt.charAt(p)!='#' && txt.charAt(p)!=';' && txt.charAt(p)!=')' && txt.charAt(p)!='+' && txt.charAt(p)!='-'){
//如果读到的字符不属于T1的Follow集
System.out.println("error8!");
SIGN = false;
}
}
}
private static void F() {//F--→(E)|i
if(SIGN) {
if(txt.charAt(p) == '('){
p++;
E();
if(txt.charAt(p) == ')'){
p++;
} else if(txt.charAt(p) == '#'){//如果括号没有配对上
System.out.println("error9!");
SIGN = false;
}
}else if (txt.charAt(p) == 'i'){
p++;
}else {//如果因子既不是表达式也不是i
System.out.println("error10!");
SIGN = false;
}
}
}
}
测试截图
最后
以上就是结实金鱼为你收集整理的实验二 递归下降分析法(Java实现和代码详解)实验要求测试表达式源程序测试截图的全部内容,希望文章能够帮你解决实验二 递归下降分析法(Java实现和代码详解)实验要求测试表达式源程序测试截图所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复