📄 grammaranalyse.java
字号:
package jywhu;
public class GrammarAnalyse {
private AccAnalyse accAnalyse;
private Token token;
private String s=" ";
public GrammarAnalyse(AccAnalyse accAnalyse,Token token){
this.accAnalyse=accAnalyse;
this.token=token;
}
//输出错误信息
public void syntaxError(String message){
System.out.print("Syntax error at line "+token.getLineno()+":"+message);
}
public void match(String s){
if((token.getTokenType()).equals(s)){
if(accAnalyse.isOut()){
//System.out.println("right");
token=accAnalyse.getToken();
}else{
token=new Token("fileover","fileover,need ;",token.getLineno());}
}else{
syntaxError("unexpected token ->");
printToken(token.getToken());
if(accAnalyse.isOut())
token=accAnalyse.getToken();
}
}
public void printToken(String token){
System.out.println(token);
}
//开始语法分析
//语句序列节点
public TreeNode stmtSequence(){
TreeNode t=statement();
TreeNode p=t;
while(!token.getTokenType().equals("else")&&(!token.getTokenType().equals("leftbracket"))
&&(!token.getTokenType().equals("rightbracket"))&&(!token.getTokenType().equals("bleftbracket"))&&
(!token.getTokenType().equals("brightbracket"))&&(!token.getTokenType().equals("mrightbracket"))&&
(!token.getTokenType().equals("mleftbracket"))){
//System.out.println(token.getTokenType());
//System.out.println(accAnalyse.isOut());
match("semicolon");
if(token.getTokenType().equals("fileover")){
break;
}else{
TreeNode q;
q=statement();
if(q!=null){
if(t==null)
t=p=q;
else{
p.sibling=q;
p=q;
}
}
}
}
return t;
}
//语句节点
public TreeNode statement(){
TreeNode t=null;
if(token.getTokenType().equals("if")){
t=if_stmt();
}else if(token.getTokenType().equals("while")){
t=while_stmt();
}else if(token.getTokenType().equals("id")){
t=assign_stmt();
}else if(token.getTokenType().equals("read")){
t=read_stmt();
}else if(token.getTokenType().equals("write")){
t=write_stmt();
}else if(token.getTokenType().equals("int")||token.getTokenType().equals("real")){
t=declare_stmt();
}
return t;
}
//if语句节点
public TreeNode if_stmt(){
TreeNode t=new TreeNode();
t.kind="IfK";
match("if");
match("leftbracket");
t.leftChild=exp();
match("rightbracket");
match("bleftbracket");
t.midChild=stmtSequence();
match("brightbracket");
if(token.getTokenType().equals("else")){
match("else");
match("bleftbracket");
t.rightChild=stmtSequence();
match("brightbracket");
}
return t;
}
//while语句节点
public TreeNode while_stmt(){
TreeNode t=new TreeNode();
t.kind="WhileK";
match("while");
match("leftbracket");
t.leftChild=exp();
match("rightbracket");
match("bleftbracket");
t.midChild=stmtSequence();
match("brightbracket");
return t;
}
//赋值语句节点
public TreeNode assign_stmt(){
TreeNode t=new TreeNode();
t.kind="AssignK";
if((t!=null)&&(token.getTokenType().equals("id")))
t.attr=token.getToken();
match("id");
//为数组赋值
if(token.getTokenType().equals("mleftbracket")){
match("mleftbracket");
t.attr=t.attr+"[]";
TreeNode q=exp();
if(q!=null){
t.leftChild=q;}
match("mrightbracket");
}
match("equalop");
t.rightChild=exp();
return t;
}
//read语句节点
public TreeNode read_stmt(){
TreeNode t=new TreeNode();
t.kind="ReadK";
match("read");
if((t!=null)&&(token.getTokenType().equals("id")))
t.attr=token.getToken();
match("id");
return t;
}
//write语句节点
public TreeNode write_stmt(){
TreeNode t=new TreeNode();
t.kind="WriteK";
match("write");
if(t!=null)
t.leftChild=exp();
return t;
}
//声明语句节点
public TreeNode declare_stmt(){
TreeNode t=new TreeNode();
if(token.getTokenType().equals("int")){
t.kind="intDeclareK";
match("int");}
else if(token.getTokenType().equals("real")){
t.kind="realDeclareK";
match("real");}
if((t!=null)&&(token.getTokenType().equals("id")))
t.attr=token.getToken();
match("id");
//数组声明
if(token.getTokenType().equals("mleftbracket")){
match("mleftbracket");
t.attr=t.attr+"["+token.getToken()+"]";
match("intNum");
match("mrightbracket");
}
return t;
}
//表达式节点
public TreeNode exp(){
TreeNode t=simple_exp();
if(token.getTokenType().equals("relop")){
TreeNode p=new TreeNode();
p.kind="OpK";
if(p!=null){
p.leftChild=t;
p.attr=token.getToken();
t=p;
}
match("relop");
if(t!=null){
t.midChild=simple_exp();}
}
return t;
}
//简单表达式节点
public TreeNode simple_exp(){
TreeNode t=term();
while(token.getTokenType().equals("addop")){
TreeNode p=new TreeNode();
p.kind="OpK";
if(p!=null){
p.leftChild=t;
p.attr=token.getToken();
t=p;
match("addop");
t.midChild=term();
}
}
return t;
}
public TreeNode term(){
TreeNode t=factor();
while(token.getTokenType().equals("mulop")){
TreeNode p=new TreeNode();
p.kind="OpK";
if(p!=null){
p.leftChild=t;
p.attr=token.getToken();
t=p;
match("mulop");
t.midChild=factor();
}
}
return t;
}
//表达式因子节点
public TreeNode factor(){
TreeNode t=new TreeNode();
if(token.getTokenType().equals("intNum")){
t.kind="NumK";
if((t!=null)&&token.getTokenType().equals("intNum")){
t.attr=token.getToken();
}
match("intNum");
}else if(token.getTokenType().equals("realNum")){
t.kind="NumK";
if((t!=null)&&token.getTokenType().equals("realNum")){
t.attr=token.getToken();
}
match("realNum");
}else if(token.getTokenType().equals("id")){
t.kind="IdK";
if((t!=null)&&token.getTokenType().equals("id")){
t.attr=token.getToken();
}
match("id");
//数组元素作为表达式因子
if(token.getTokenType().equals("mleftbracket")){
match("mleftbracket");
t.attr=t.attr+"[]";
TreeNode q=exp();
if(q!=null){
t.leftChild=q;}
match("mrightbracket");
}
}else if(token.getTokenType().equals("leftbracket")){
match("leftbracket");
t=exp();
match("rightbracket");
}else{
syntaxError("unexpected token ->");
printToken(token.getToken());
token=accAnalyse.getToken();
}
return t;
}
public void printSpace(){
}
//将抽象语法树打印输出
public void printTree(TreeNode t){
while(t!=null){
s=s+" ";
System.out.print(s);
if(t.kind.equals("IfK")){
System.out.println("if");
}else if(t.kind.equals("WhileK")){
System.out.println("while");
}else if(t.kind.equals("AssignK")){
System.out.println("assign to: "+t.attr);
}else if(t.kind.equals("ReadK")){
System.out.println("read: "+t.attr);
}else if(t.kind.equals("WriteK")){
System.out.println("write");
}else if(t.kind.equals("intDeclareK")){
System.out.println("int: "+t.attr);
}else if(t.kind.equals("realDeclareK")){
System.out.println("real: "+t.attr);
}else if(t.kind.equals("OpK")){
System.out.println("op: "+t.attr);
}else if(t.kind.equals("NumK")){
System.out.println("num: "+t.attr);
}else if(t.kind.equals("IdK")){
System.out.println("id: "+t.attr);
}else{
System.out.println("Unknown token");
}
if(t.leftChild!=null)
//System.out.print(s);
printTree(t.leftChild);
if(t.midChild!=null)
//System.out.print(s);
printTree(t.midChild);
if(t.rightChild!=null)
//System.out.print(s);
printTree(t.rightChild);
t=t.sibling;
s=" ";
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -