compiler-有谁懂算符优先文法语法分析吗

问题描述

有谁懂算符优先文法语法分析吗

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.Scanner;
import java.util.Stack;
public class compiler3 {
private static char O_Table[][]={
{'>','>','<','<','<','>','<','>'},// +
{'>','>','<','<','<','>','<','>'},// -
{'>','>','>','>','<','>','<','>'},// *
{'>','>','<','<','<','>','<','>'},// /
{'<','<','<','<','<','=','<','-'},// (
{'>','>','>','>','-','>','-','>'},// )
{'>','>','>','>','-','>',' ','>'},// i
{'<','>','<','<','<','-','<','='}// #
};
private static char Vt[]={'+','-','*','/','(',')','0','1','2','3','4','5','6','7','8','9','#'};
static char ch;
// private static char[] Vn={'E'};
private static int judgePriority(char ch){
int priority=0;
switch (ch) {
case '+':
priority=0;
break;
case'-':
priority=1;
break;
case'*':
priority=2;
break;
case'/':
priority=3;
break;
case'(':
priority=4;
break;
case')':
priority=5;
break;
case'i':
priority=6;
break;
case'#':
priority=7;
break;

    default:
        break;
    }
    return priority;
}
public static char getPriority(char m,char n) {
    return O_Table[judgePriority(m)][judgePriority(n)];
}

// public static char getCurrent(String str,int current) {
// return str.charAt(current);
//

// }
public static boolean isVt(char ch) {
int i;
for(i=0;i<Vt.length;i++){
if(Vt[i]==ch)
return true;

    }
    return false;

}

// public static boolean isOperator(char ch) {
// if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='('||ch==')'||ch=='#')
// return true;
// return false;
// }
public static boolean isDigit(char ch) {
if((ch>='0')&&(ch<='9'))
return true;
return false;
}
public static void Analysis(String in) {
int i,r = 0;
String a,b;
String str="";
Character op;
Stack OPTR =new Stack();
Stack OPND = new Stack();
OPTR.push('#');
for(i=0;i<in.length();i++){
ch=in.charAt(i);
// System.out.println(ch);
if(isDigit(ch)){
str=str+ch;

i++;
}

    else {

// System.out.println(ch);
OPND.push(str);
System.out.println(OPND);
// OPTR.push(ch);
if(getPriority(OPTR.lastElement(), in.charAt(i))=='>'){
a=OPND.pop();
b=OPND.pop();
op=OPTR.pop();
System.out.println(a+b+op);
switch (op) {
case '+':
r=Integer.parseInt(a)+Integer.parseInt(b);
break;
case '-':
r=Integer.parseInt(a)-Integer.parseInt(b);
break;
case '*':
r=Integer.parseInt(a)-Integer.parseInt(b);
break;
case '/':
r=Integer.parseInt(a)-Integer.parseInt(b);
break;
default:
break;

}
String str1=Integer.toString(r);
OPND.push(str1);
}
else if (getPriority(OPTR.lastElement(), ch)=='<') {
OPTR.push(ch);

            }
            else if (getPriority(OPTR.lastElement(), ch)=='=') {
                OPTR.pop();
                OPTR.pop();
            }
            else if (OPTR.empty()) {
                System.out.println("式子正确");
            }
            else {
                System.out.println("分析出错");
            }
        }
   }

}
public static void main(String[] args) throws IOException {
System.out.println("请输入以“#”结束的表达式:"); //自下而上的语法分析方法-算符优先文法处理
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String in = br.readLine();
Analysis(in);

}

}
文法是E-E+E|E*E|E-E| E/E |(E)|i 找了好久 , 不知道哪里出现了逻辑错误 ,求帮忙看看万分感谢

解决方案

语法分析(算符优先文法)

时间: 2025-01-02 13:11:12

compiler-有谁懂算符优先文法语法分析吗的相关文章

C#数据结构与算法揭秘五

这节我们讨论了两种好玩的数据结构,栈和队列. 老样子,什么是栈, 所谓的栈是栈(Stack)是操作限定在表的尾端进行的线性表.表尾由于要进行插入.删除等操作,所以,它具有特殊的含义,把表尾称为栈顶(Top) ,另一端是固定的,叫栈底(Bottom) .当栈中没有数据元素时叫空栈(Empty Stack).这个类似于送饭的饭盒子,上层放的是红烧肉,中层放的水煮鱼,下层放的鸡腿.你要把这些菜取出来,这就引出来了栈的特点先进后出(First in last out).   具体叙述,加下图. 栈通常记

C#数据结构与算法揭秘五 栈和队列_C#教程

这节我们讨论了两种好玩的数据结构,栈和队列. 老样子,什么是栈, 所谓的栈是栈(Stack)是操作限定在表的尾端进行的线性表.表尾由于要进行插入.删除等操作,所以,它具有特殊的含义,把表尾称为栈顶(Top) ,另一端是固定的,叫栈底(Bottom) .当栈中没有数据元素时叫空栈(Empty Stack).这个类似于送饭的饭盒子,上层放的是红烧肉,中层放的水煮鱼,下层放的鸡腿.你要把这些菜取出来,这就引出来了栈的特点先进后出(First in last out).   具体叙述,加下图. 栈通常记

自己动手构造编译系统:编译、汇编与链接2.1.2 语法分析

2.1.2  语法分析        词法分析器的输入是文本字符串,语法分析器的输入则是词法分析器识别的词法记号序列.语法分析器的输出不再是一串线性符号序列,而是一种树形的数据结构,通常称之为抽象语法树.见图2-4. 继续前面赋值语句的例子,我们可以先看看它可能对应的抽象语法树,如图2-5所示.   图2-5  抽象语法树示例 从图2-5中可以看出,所有的词法记号都出现在树的叶子节点上,我们称这样的叶子节点为终结符.而所有的非叶子节点,都是对一串词法记号的抽象概括,我们称之为非终结符,可以将非终

自己动手构造编译系统:编译、汇编与链接

"自己动手系列" 自己动手构造编译系统 编译.汇编与链接 范志东  张琼声  著 图书在版编目(CIP)数据 自己动手构造编译系统:编译.汇编与链接 / 范志东,张琼声著. -北京:机械工业出版社,2016.7 (自己动手系列) ISBN 978-7-111-54355-8 I. 自- II. ①范- ②张- III. 编译器 IV. TP314 中国版本图书馆CIP数据核字(2016)第163077号 自己动手构造编译系统:编译.汇编与链接 出版发行:机械工业出版社(北京市西城区百万

数据挖掘之--啥都不会到逻辑回归

QQ交流群:127591054 JackChiang QQ:595696297 欢迎大家来交流. 作者经历:17年7月刚毕业的童孩~~16年底实习半年在做DBA,中途有变,想把数据挖掘作为自己的长远职业,也就是职业规划定位:数据挖掘.偏爱做数据分析,没办法.但是!但是!但是!挖掘的门槛真的好高!好高!好高!快毕业的时候辞去在电信的工作,来了一场说走就走的旅途,一个人!!!去了云南,带上仅有的200块钱!!!(大家别张嘴,我在飞猪报的团),云南很美!就不发图了. 回来开始找工作,真的很难!很难!很

简单的表达式求值

一直很想做个比Windows自带的高级一点的计算器,能将整个表达式输入,然后求值.这个程序要求读者具备编译原理的一些知识.举个实例来说明程序处理过程.假设要求值的表达式为 : -25*(56+15)# (其中#号作为表达式结束标志). 首先对表达式进行词法分析,允许出现的字符为: {0 ,1, 2 ,3 ,4 ,5 ,6, 7 ,8, 9 . ,+ ,-, *, / ,( ,),#} 分析的结果产生两种类型的单词:操作符和操作数. 操作符包括: {+, - ,* ,/ ,( ,)} 操作数包括:

编译原理

编译原理 语法是指这样的一组规则,用它可以形成和产生一个合适的程序. 词法规则是指单词符号的形成规则. 语法规则是语法单位的形成规则,规定了如何从单词符号形成更大的结构(即语法单位或语法范畴). 一般程序语言的语法单位有:表达式.语句.分程序.函数.过程和程序等. 程序语言的基本功能是描述数据和对数据的运算.所谓程序,从本质上来说是描述一定数据的处理过程.   强制式语言也称过程式语言.其特点是命令驱动,面向语句.一个强制式语言程序由一系列的语句组成,每个语句的执行引起若干存储单元中的值的改变.

基于LLVM的编译原理简明教程 (1) - 写编译器越来越容易了

基于LLVM的编译原理简明教程 (1) - 写编译器越来越容易了 进入21世纪,新的编程语言如雨后春笋一样不停地冒出来.需求当然是重要的驱动力量,但是在其中起了重要作用的就是工具链的改善. 2000年,UIUC的Chris Lattner主持开发了一套称为LLVM(Low Level Virtual Machine)的编译器工具库套件.后来,LLVM的scope越来越大,Low Level Virtual Machine已经不足以表示LLVM的全部,于是,LLVM就变成了正式的名字.LLVM可以

abcde-怎样用c实现链栈的算术表达式运算,不得使用stl模板

问题描述 怎样用c实现链栈的算术表达式运算,不得使用stl模板 按照严蔚敏版的书上的算法,用c语言链栈实现,不让使用stl模板,有没有原代码 解决方案 #include""stdio.h"" #include""stdlib.h"" #include""string.h"" #include""math.h"" #define true 1 #de