📄 analyse.java
字号:
if(word[0].equals("=")){
sen.offer("%");
sen.offer("算术运算符:");
sen.offer("$");
sen.offer(word[0]);
sen.offer("%");
nextToken();
expression();
genDo(InsType.sto,0,adr);
}else if(word[0].equals("[")){
sen.offer(word[0]);
nextToken();
if(word[1].equals("INT")){
sen.offer(word[0]);
// 判断数组是否越界
int num = Integer.parseInt(word[0]);
if(Integer.parseInt(word[0]) < arrSize(adr)){
}else{
sen.offer("访问数组越界!");
flag = true;
}
nextToken();
if(word[0].equals("]")){
sen.offer(word[0]);
nextToken();
if(word[0].equals("=")){
sen.offer("%");
sen.offer("算术运算符:");
sen.offer("$");
sen.offer(word[0]);
sen.offer("%");
nextToken();
expression();
genDo(InsType.sto,0,adr);
genDo(InsType.lit,0,num);
}else{
sen.offer("第" + lineNum + "行:请为数组赋值!");
}
}else{
sen.offer("第" + lineNum + "行:缺少] !");
}
}else if(word[1].equals("ID")){
sen.offer(word[0]);
// 判断变量是否声明
int y = isIden(word[0]);
if(y>=0){
// 判断数组是否越界
int z = ((Variable)table.get(y)).getValue();
if(z < arrSize(adr)){
nextToken();
if(word[0].equals("]")){
sen.offer(word[0]);
nextToken();
if(word[0].equals("=")){
sen.offer("%");
sen.offer("算术运算符:");
sen.offer("$");
sen.offer(word[0]);
sen.offer("%");
nextToken();
expression();
genDo(InsType.sto,0,adr);
genDo(InsType.lod,0,y);
}else{
sen.offer("第" + lineNum + "行:请为数组赋值!");
}
}else{
sen.offer("第" + lineNum + "行:缺少] !");
}
}else{
sen.offer("数组访问越界!");
flag = true;
nextToken();
if(word[0].equals("]")){
sen.offer(word[0]);
nextToken();
if(word[0].equals("=")){
sen.offer("%");
sen.offer("算术运算符:");
sen.offer("$");
sen.offer(word[0]);
sen.offer("%");
nextToken();
expression();
genDo(InsType.sto,0,adr);
genDo(InsType.lod,0,z);
}else{
sen.offer("第" + lineNum + "行:请为数组赋值!");
}
}else{
sen.offer("第" + lineNum + "行:缺少] !");
}
}
}else{
sen.offer("变量" + word[0] + "未声明!");
flag = true;
nextToken();
if(word[0].equals("]")){
sen.offer(word[0]);
nextToken();
if(word[0].equals("=")){
sen.offer("%");
sen.offer("算术运算符:");
sen.offer("$");
sen.offer(word[0]);
sen.offer("%");
nextToken();
expression();
}else{
sen.offer("第" + lineNum + "行:请为数组赋值!");
}
}else{
sen.offer("第" + lineNum + "行:缺少] !");
}
}
}else{
sen.offer("第" + lineNum+ "行:请输入整数作为数组下标!");
}
}else{
sen.offer("第" + lineNum + "行:变量赋值,等号右边请输入正确的表达式!");
}
}
// R --> read M <读语句> --> read <输入串>
public void readIn(){
if(word[0].equalsIgnoreCase("read")){
sen.offer(word[0]);
//genDo(InsType.opr,0,12);
nextToken();
input();
// sen.offer("%");
}else{
sen.offer("第" + lineNum + "行:读语句,请输入正确的关键字read!");
}
}
// M --> i M1
public void input(){
if(word[1].equals("ID")){
sen.offer(word[0]);
if(isIden(word[0])>=0){
genDo(InsType.opr,0,12);
genDo(InsType.sto,0,isIden(word[0]));
}else{
sen.offer("变量"+word[0]+"未声明");
flag = true;
}
nextToken();
input_1();
}else{
sen.offer("第" + lineNum + "行:写语句,请输入正确的单个表达式作为输出串!");
}
}
// M1 --> [i] | | [x] | null
public void input_1(){
if(word[0].equals("[")){
sen.offer(word[0]);
nextToken();
if(word[1].equals("INT")||word[1].equals("ID")){
sen.offer(word[0]);
int y = ((Instruction)code.peekLast()).getA_i(); //数组在table表中的 第一个变量的地址
if(word[1].equals("INT")){
//int x = y + Integer.parseInt(word[0]);
if(Integer.parseInt(word[0])<arrSize(y)){
//((Instruction)code.peekLast()).setA(x);
genDo(InsType.lit,0,Integer.parseInt(word[0]));
}else{
sen.offer("数组越界!");
flag = true;
}
}else{
// 判断数组下标变量i是否声明
if(isIden(word[0])>=0){
//判断数组下标是否越界
if(((Variable)table.get(isIden(word[0]))).getValue()<arrSize(y)){
genDo(InsType.lod,0,isIden(word[0]));
}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("#"))){
sen.offer("第" + lineNum + "行:请输入正确的数组变量!");
}
}
// W--> write N <写语句> -->write <输出串>
public void writeOut(){
if(word[0].equalsIgnoreCase("write")){
sen.offer(word[0]);
nextToken();
output();
//输出栈顶到屏幕
genDo(InsType.opr,0,10);
//输出换行
genDo(InsType.opr,0,11);
}else{
sen.offer("第" + lineNum + "行:写语句,请输入正确的关键字write!");
}
}
// N--> P <输出串> --> <表达式>
public void output(){
if(word[0].equals("(")||word[1].equals("ID")||word[1].equals("INT")||word[1].equals("REAL")){
expression();
}else{
sen.offer("第" + lineNum + "行:写语句,请输入正确的单个表达式作为输出串!");
}
}
//C --> {S`} <复合语句> -->{ <语句串>}
public void composition(){
if(word[0].equals("{")){
sen.offer(word[0]);
nextToken();
an();
if(word[0].equals("}")){
sen.offer(word[0]);
nextToken();
}else{
sen.offer("第" + lineNum + "行:缺少} !");
}
}else{
sen.offer("第" + lineNum + "行:复合语句,请输入{开始复合语句!");
}
}
// B --> if (K)SB1
public void if_statement(){
if(word[0].equalsIgnoreCase("if")){
sen.offer(word[0]);
nextToken();
if(word[0].equals("(")){
sen.offer(word[0]);
nextToken();
condition();
if(word[0].equals(")")){
sen.offer(word[0]);
//为假则跳到循环体后的第一条指令
int adr1 = code.size();
genDo(InsType.jpc,0,0);
nextToken();
statement();
// 跳到else执行完后的下一条语句
int adr2 = code.size();
genDo(InsType.jmp,0,0);
if_s1();
int adr3 = code.size();
//将跳转语句中的a值补上
((Instruction)code.get(adr1)).setA(adr2+1);
((Instruction)code.get(adr2)).setA(adr3);
sen.offer("%");
}else{
sen.offer("第" + lineNum + "行:if语句,请以)结束条件!");
}
}else{
sen.offer("第"+lineNum + "行:if语句,if后请输入正确的条件语句!");
}
}else{
sen.offer("第" + lineNum + "行:if语句出错!");
}
}
//B1 --> else S
public void if_s1(){
if(word[0].equalsIgnoreCase("else")){
sen.offer(word[0]);
nextToken();
statement();
}else if(!(word[0].equals(";")||word[0].equalsIgnoreCase("else")||word[0].equals("}")||word[0].equals("#"))){
sen.offer("第" + lineNum + "行:if语句出错!");
}
}
// H-->while (K) S <while语句>--> while (<条件>) <语句>
public void while_statement(){
if(word[0].equalsIgnoreCase("while")){
sen.offer(word[0]);
nextToken();
if(word[0].equals("(")){
sen.offer(word[0]);
// 下一条目标代码的地址
int adr1 = code.size();
nextToken();
condition();
if(word[0].equals(")")){
sen.offer(word[0]);
//为假跳到循环体后的第一条指令,地址暂时未知
int adr2 = code.size();
genDo(InsType.jpc,0,0);
nextToken();
statement();
// 回到while循环的第一条指令
genDo(InsType.jmp,0,adr1);
int adr3 = code.size();
((Instruction)code.get(adr2)).setA(adr3);
sen.offer("%");
}else{
sen.offer("第" + lineNum + "行:while语句,缺少)结束条件!");
}
}else{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -