package frontend.ast.func; import frontend.ast.Node; import frontend.ast.SyntaxType; import frontend.lexer.TokenStream; import frontend.lexer.TokenType; import midend.symbol.Symbol; import midend.symbol.SymbolType; import midend.symbol.ArraySymbol; import error.Errors; import frontend.ast.token.TokenNode; import error.ErrorType; import error.Error; public class FuncFParam extends Node { public FuncFParam(TokenStream ts) { super(SyntaxType.FUNC_FORMAL_PARAM, ts); } public void parse(Errors errors) { TokenNode intkk = new TokenNode(this.ts); addChild(intkk); TokenNode ident = new TokenNode(this.ts); addChild(ident); if (getCurrToken().getType() == TokenType.LBRACK) { TokenNode lbrack = new TokenNode(this.ts); addChild(lbrack); if (getCurrToken().getType() == TokenType.RBRACK) { TokenNode rbrack = new TokenNode(this.ts); addChild(rbrack); } else { errors.addError(new Error(this.ts.peek(-1).getLine(), ErrorType.k)); } } } public Symbol getSymbol() { if (getChildren().size() == 2) { TokenNode tn = (TokenNode) getChild(1); return new Symbol(tn.getName(), SymbolType.INT, tn.getLine()); } else { TokenNode tn = (TokenNode) getChild(1); return new ArraySymbol(tn.getName(), SymbolType.INT_ARRAY, tn.getLine(), -1); //这里不求维数,因为函数形参为数组只是相当于一个指针 } } }