📄 analyse.java
字号:
sen.offer("第" +lineNum + "行:while语句,while后请输入正确的条件语句!");
}
}else{
sen.offer("第" + lineNum + "行:while语句出错!");
}
}
//P-->QP1
public void expression(){
if(word[0].equals("(")|| word[1].equals("ID")||word[1].equals("INT")||word[1].equals("REAL")){
sen.offer("表达式:");
sen.offer("$");
item();
exp_1();
sen.offer("%");
}else{
sen.offer("第" + lineNum + "行:请输入正确的表达式!");
}
}
// P1 --> aQP1 | null
public void exp_1(){
if(word[0].equals("+")){
sen.offer(word[0]);
nextToken();
item();
exp_1();
genDo(InsType.opr,0,1);
}else if(word[0].equals("-")){
sen.offer(word[0]);
nextToken();
item();
exp_1();
genDo(InsType.opr,0,2);
}else if(!(word[0].equals(";")||word[0].equalsIgnoreCase("else")||word[0].equals("}")||word[0].equals("#")||word[1].equals("LO")||word[0].equals(")")||word[0].equals("]"))){
sen.offer("第" + lineNum + "行:请输入正确的表达式!");
}
}
// Q --> F Q1
public void item(){
if(word[0].equals("(")||word[1].equals("ID")||word[1].equals("INT")||word[1].equals("REAL")){
factor();
it_1();
}else{
sen.offer("第" + lineNum + "行:请输入正确的表达式!");
}
}
// Q1 --> bFQ1 | null
public void it_1(){
if(word[0].equals("*")){
sen.offer(word[0]);
nextToken();
factor();
it_1();
genDo(InsType.opr,0,3);
}else if(word[0].equals("/")){
sen.offer(word[0]);
nextToken();
factor();
it_1();
genDo(InsType.opr,0,4);
}else if(!(word[0].equals(";")||word[0].equals("else")||word[0].equals("}")||word[0].equals("#")||word[1].equals("LO")||word[0].equals(")")||word[0].equals("+")||word[0].equals("-")||word[0].equals("]"))){
sen.offer("第" + lineNum + "行:请输入正确的表达式!");
}
}
// F --> (P) | iF1 | x | y
public void factor(){
if(word[0].equals("(")){
sen.offer(word[0]);
nextToken();
expression();
if(word[0].endsWith(")")){
sen.offer(word[0]);
nextToken();
}else{
sen.offer("第" + lineNum + "行:缺少)!");
}
}else if(word[1].equals("ID")){
sen.offer(word[0]);
if(isIden(word[0])>=0){
//判断是否为赋值语句
if(flag_val==true){
if(type == ((Variable)table.get(isIden(word[0]))).getType()){
genDo(InsType.lod,0,isIden(word[0]));
}else{
sen.offer("赋值语句类型不匹配!");
flag = true;
}
}else{
genDo(InsType.lod,0,isIden(word[0]));
}
}else{
sen.offer("变量" + word[0] + "未声明!");
flag = true;
}
nextToken();
factor_1();
}else if(word[1].equals("INT")){
sen.offer(word[0]);
// 判断赋值符号左右类型是否匹配
if(flag_val == true){ //判断是否为赋值语句
if(type == VarType.INT){
genDo(InsType.lit,0,Integer.parseInt(word[0]));
}else if(type == VarType.REAL){
sen.offer("赋值语句类型不匹配!");
flag = true;
}
}else{
genDo(InsType.lit,0,Integer.parseInt(word[0]));
}
nextToken();
}else if(word[1].equals("REAL")){
sen.offer(word[0]);
if(flag_val == true){
if(type == VarType.REAL){
genDo(InsType.lit,0,Double.parseDouble(word[0]));
}else{
sen.offer("赋值语句类型不匹配!");
flag = true;
}
}else{
genDo(InsType.lit,0,Double.parseDouble(word[0]));
}
nextToken();
}
}
// F1 --> [x] | [i] | null
public void factor_1(){
if(word[0].equals("[")){
sen.offer(word[0]);
nextToken();
if(word[1].equals("INT")){
sen.offer(word[0]);
//判断数组是否越界
int x = ((Instruction)code.getLast()).getA_i();
if(Integer.parseInt(word[0])<arrSize(x)){
genDo(InsType.lit,0,Integer.parseInt(word[0]));
}else{
sen.offer("数组越界!");
flag = true;
}
nextToken();
if(word[0].equals("]")){
sen.offer(word[0]);
nextToken();
}else{
sen.offer("第" + lineNum + "行:缺少]!");
}
}else if(word[1].equals("ID")){
sen.offer(word[0]);
//判断数组下标变量是否声明
int x = isIden(word[0]);
if(x>=0){
// 判断数组下标是否越界
int z = ((Instruction)code.getLast()).getA_i();
int y = arrSize(z);
if(((Variable)table.get(x)).getValue()<y){
genDo(InsType.lod,0,x);
}else{
sen.offer("数组访问越界");
flag = true;
}
}else{
sen.offer("变量" + word[0] + "未声明!");
flag = true;
}
nextToken();
if(word[0].equals("]")){
sen.offer(word[0]);
nextToken();
}else{
sen.offer("第" + lineNum + "行:缺少]!");
}
}else{
sen.offer("第" + lineNum + "行:请输入正确的数组下标! ");
}
}else if(!(word[0].equals(";")||word[0].equals("else")||word[0].equals("}")||word[0].equals("#")||word[1].equals("LO")||word[0].equals(")")||word[0].equals("+")||word[0].equals("-")||word[0].equals("*")||word[0].equals("/")||word[0].equals("]"))){
sen.offer("第" + lineNum + "行:请输入正确的因子式!");
}
}
// K --> PzP <条件> --> <表达式><关系运算符><表达式>
public void condition(){
if(word[0].equals("(")||word[1].equals("ID")||word[1].equals("INT")||word[1].equals("REAL")){
sen.offer("条件:");
sen.offer("$");
expression();
if(word[1].equals("LO")){
sen.offer("关系运算符:");
sen.offer("$");
sen.offer(word[0]);
sen.offer("%");
//记录关系运算符
String lo = word[0];
nextToken();
expression();
//根据不同的关系运算符生成不同的目标代码
if(lo.equals("==")){
genDo(InsType.opr,0,6);
}else if(lo.equals("<")){
genDo(InsType.opr,0,7);
}else if(lo.equals("<>")){
genDo(InsType.opr,0,8);
}
sen.offer("%");
}else{
sen.offer("第" + lineNum + "行:请输入正确的关系运算符!");
}
}else{
sen.offer("第" + lineNum + "行:条件表达式出错!");
}
}
/** 在名字表中加入一项
*
* @param t 名字表尾指针
* @param nme 名字
* @param typ 名字种类
* @param val 名字值
* @param isA 是否为数组
*/
public void enter(String nme, VarType typ, double val, boolean isA){
Variable v = new Variable(nme,typ,val,isA);
table.offer(v);
}
public void enter(String nme, VarType typ, int val, boolean isA){
Variable v = new Variable(nme,typ,val,isA);
table.offer(v);
}
// 生成中间代码至列表末尾
public void genDo(InsType i, int l, int a){
Instruction ins = new Instruction(i,l,a);
code.offer(ins);
}
public void genDo(InsType i, int l, double a){
Instruction ins = new Instruction(i,l,a);
code.offer(ins);
}
// 添加一项中间代码至列表指定位置
public void genDo(int index, InsType i, int l, int a){
Instruction ins = new Instruction(i,l,a);
code.add(index, ins);
}
public void genDo(int index, InsType i, int l, double a){
Instruction ins = new Instruction(i,l,a);
code.add(index, ins);
}
// 将String类型转换成VarType枚举类型值
public VarType toVarType(String type){
if(type.equalsIgnoreCase("INT")){
return VarType.INT;
}else if(type.equalsIgnoreCase("REAL")){
return VarType.REAL;
}
return VarType.INT;
}
// 获得当前实例中code的队列
public LinkedList getCode(){
return code;
}
//获得当前实例中table的队列
public LinkedList getTable(){
return table;
}
// 变量在名字表中的位置,同时,通过判断返回值是否为-1判断该变量是否声明
public int isIden(String s){
int i;
for(i = 0; i<table.size();i++){
if(((Variable)table.get(i)).getName().equals(s)){
return i;
}
}
return -1;
}
/**
* 获取数组的大小
*
* @param i 数组第一个元素在名字表中的地址
* @return
*/
public int arrSize(int i){
int size=0;
String name = ((Variable)table.get(i)).getName();
for(int x = i; x<table.size();x++){
if(((Variable)table.get(x)).getName().equals(name)){
size++;
}else{
return size;
}
}
return size;
}
// 判断是否通过语义分析
public boolean isErr(){
return flag;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -