compiler-go/include/ICG/GoTo3code.h

398 lines
15 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef INCLUDE_ICG_MYGOLIS_H_
#define INCLUDE_ICG_MYGOLIS_H_
#include "Public/Public.h"
#include "Public/Scope.h"
#include "Public/TAC.h"
#include "GoParser.h"
#include "GoLexer.h"
#include "GoParserListener.h"
#include "GoParserBaseListener.h"
#include "ICG/StmtICG/ForStmt.h"
namespace std
{
class GoTo3code : public GoParserListener
{
public:
int LineIndex = 0;
int LocalIndex = 0;
int IFIndex = 0;
int ForIndex = 0;
// TACBlock *test = new TACBlock;
// 全局的key是global其他的为函数名字
TACFile TACBlocks;
antlr4::tree::ParseTreeProperty<string> *values = new antlr4::tree::ParseTreeProperty<string>;
antlr4::tree::ParseTreeProperty<string> *ifvalues = new antlr4::tree::ParseTreeProperty<string>;
antlr4::tree::ParseTreeProperty<ForStmt> *forvalues = new antlr4::tree::ParseTreeProperty<ForStmt>;
// 记录哪个临时变量是指针
std::unordered_map<string,bool> ptrs;
std::shared_ptr<Scope> currentScope;
std::shared_ptr<Scope> globalScope;
vector<std::shared_ptr<Scope>> allScopes;
// todo:给函数的开始更新curFUn
string curFun="global";
// vector<Symbol*> deleteSymbolList;
Symbol::Type defineTmpType() {return Symbol::Type::INT;}
string CreateLocalVar(); // check the local_varname is illgal
string CreateElseLabel();
string CreateForLabel();
bool is_digit(string s);
void Go23file(string filename);
void Go23file_(string filename);
string ToString(TACOP num);
string ToString(TACOPERANDTYPE num);
TACOPERANDTYPE OperandTypereslove(string name);
void myPrint(std::shared_ptr<Scope> currentScope);
void addScope();
void popScope();
void push_line(TACOP op, Operand src1, Operand src2, Operand dst);
void exitPackageClause(GoParser::PackageClauseContext *ctx);
void enterPackageClause(GoParser::PackageClauseContext *ctx);
void enterSourceFile(GoParser::SourceFileContext *ctx);
void exitSourceFile(GoParser::SourceFileContext *ctx);
void enterImportDecl(GoParser::ImportDeclContext *ctx);
void exitImportDecl(GoParser::ImportDeclContext *ctx);
void enterImportSpec(GoParser::ImportSpecContext *ctx);
void exitImportSpec(GoParser::ImportSpecContext *ctx);
void enterImportPath(GoParser::ImportPathContext *ctx);
void exitImportPath(GoParser::ImportPathContext *ctx);
void enterDeclaration(GoParser::DeclarationContext *ctx);
void exitDeclaration(GoParser::DeclarationContext *ctx);
void enterConstDecl(GoParser::ConstDeclContext *ctx);
void exitConstDecl(GoParser::ConstDeclContext *ctx);
void enterConstSpec(GoParser::ConstSpecContext *ctx);
void exitConstSpec(GoParser::ConstSpecContext *ctx);
void enterIdentifierList(GoParser::IdentifierListContext *ctx);
void exitIdentifierList(GoParser::IdentifierListContext *ctx);
void enterExpressionList(GoParser::ExpressionListContext *ctx);
void exitExpressionList(GoParser::ExpressionListContext *ctx);
void enterTypeDecl(GoParser::TypeDeclContext *ctx);
void exitTypeDecl(GoParser::TypeDeclContext *ctx);
void enterTypeSpec(GoParser::TypeSpecContext *ctx);
void exitTypeSpec(GoParser::TypeSpecContext *ctx);
void enterFunctionDecl(GoParser::FunctionDeclContext *ctx);
void exitFunctionDecl(GoParser::FunctionDeclContext *ctx);
void enterMethodDecl(GoParser::MethodDeclContext *ctx);
void exitMethodDecl(GoParser::MethodDeclContext *ctx);
void enterReceiver(GoParser::ReceiverContext *ctx);
void exitReceiver(GoParser::ReceiverContext *ctx);
void enterVarDecl(GoParser::VarDeclContext *ctx);
void exitVarDecl(GoParser::VarDeclContext *ctx);
void enterVarSpec(GoParser::VarSpecContext *ctx);
void exitVarSpec(GoParser::VarSpecContext *ctx);
void enterBlock(GoParser::BlockContext *ctx);
void exitBlock(GoParser::BlockContext *ctx);
void enterStatementList(GoParser::StatementListContext *ctx);
void exitStatementList(GoParser::StatementListContext *ctx);
void enterStatement(GoParser::StatementContext *ctx);
void exitStatement(GoParser::StatementContext *ctx);
void enterSimpleStmt(GoParser::SimpleStmtContext *ctx);
void exitSimpleStmt(GoParser::SimpleStmtContext *ctx);
void enterExpressionStmt(GoParser::ExpressionStmtContext *ctx);
void exitExpressionStmt(GoParser::ExpressionStmtContext *ctx);
void enterSendStmt(GoParser::SendStmtContext *ctx);
void exitSendStmt(GoParser::SendStmtContext *ctx);
void enterIncDecStmt(GoParser::IncDecStmtContext *ctx);
void exitIncDecStmt(GoParser::IncDecStmtContext *ctx);
void enterAssignment(GoParser::AssignmentContext *ctx);
void exitAssignment(GoParser::AssignmentContext *ctx);
void enterAssign_op(GoParser::Assign_opContext *ctx);
void exitAssign_op(GoParser::Assign_opContext *ctx);
void enterShortVarDecl(GoParser::ShortVarDeclContext *ctx);
void exitShortVarDecl(GoParser::ShortVarDeclContext *ctx);
void enterEmptyStmt(GoParser::EmptyStmtContext *ctx);
void exitEmptyStmt(GoParser::EmptyStmtContext *ctx);
void enterLabeledStmt(GoParser::LabeledStmtContext *ctx);
void exitLabeledStmt(GoParser::LabeledStmtContext *ctx);
void enterReturnStmt(GoParser::ReturnStmtContext *ctx);
void exitReturnStmt(GoParser::ReturnStmtContext *ctx);
void enterBreakStmt(GoParser::BreakStmtContext *ctx);
void exitBreakStmt(GoParser::BreakStmtContext *ctx);
void enterContinueStmt(GoParser::ContinueStmtContext *ctx);
void exitContinueStmt(GoParser::ContinueStmtContext *ctx);
void enterGotoStmt(GoParser::GotoStmtContext *ctx);
void exitGotoStmt(GoParser::GotoStmtContext *ctx);
void enterFallthroughStmt(GoParser::FallthroughStmtContext *ctx);
void exitFallthroughStmt(GoParser::FallthroughStmtContext *ctx);
void enterDeferStmt(GoParser::DeferStmtContext *ctx);
void exitDeferStmt(GoParser::DeferStmtContext *ctx);
void enterIfStmt(GoParser::IfStmtContext *ctx);
void exitIfStmt(GoParser::IfStmtContext *ctx);
void enterSwitchStmt(GoParser::SwitchStmtContext *ctx);
void exitSwitchStmt(GoParser::SwitchStmtContext *ctx);
void enterExprSwitchStmt(GoParser::ExprSwitchStmtContext *ctx);
void exitExprSwitchStmt(GoParser::ExprSwitchStmtContext *ctx);
void enterExprCaseClause(GoParser::ExprCaseClauseContext *ctx);
void exitExprCaseClause(GoParser::ExprCaseClauseContext *ctx);
void enterExprSwitchCase(GoParser::ExprSwitchCaseContext *ctx);
void exitExprSwitchCase(GoParser::ExprSwitchCaseContext *ctx);
void enterTypeSwitchStmt(GoParser::TypeSwitchStmtContext *ctx);
void exitTypeSwitchStmt(GoParser::TypeSwitchStmtContext *ctx);
void enterTypeSwitchGuard(GoParser::TypeSwitchGuardContext *ctx);
void exitTypeSwitchGuard(GoParser::TypeSwitchGuardContext *ctx);
void enterTypeCaseClause(GoParser::TypeCaseClauseContext *ctx);
void exitTypeCaseClause(GoParser::TypeCaseClauseContext *ctx);
void enterTypeSwitchCase(GoParser::TypeSwitchCaseContext *ctx);
void exitTypeSwitchCase(GoParser::TypeSwitchCaseContext *ctx);
void enterTypeList(GoParser::TypeListContext *ctx);
void exitTypeList(GoParser::TypeListContext *ctx);
void enterSelectStmt(GoParser::SelectStmtContext *ctx);
void exitSelectStmt(GoParser::SelectStmtContext *ctx);
void enterCommClause(GoParser::CommClauseContext *ctx);
void exitCommClause(GoParser::CommClauseContext *ctx);
void enterCommCase(GoParser::CommCaseContext *ctx);
void exitCommCase(GoParser::CommCaseContext *ctx);
void enterRecvStmt(GoParser::RecvStmtContext *ctx);
void exitRecvStmt(GoParser::RecvStmtContext *ctx);
void enterForStmt(GoParser::ForStmtContext *ctx);
void exitForStmt(GoParser::ForStmtContext *ctx);
void enterForClause(GoParser::ForClauseContext *ctx);
void exitForClause(GoParser::ForClauseContext *ctx);
void enterRangeClause(GoParser::RangeClauseContext *ctx);
void exitRangeClause(GoParser::RangeClauseContext *ctx);
void enterGoStmt(GoParser::GoStmtContext *ctx);
void exitGoStmt(GoParser::GoStmtContext *ctx);
void enterType_(GoParser::Type_Context *ctx);
void exitType_(GoParser::Type_Context *ctx);
void enterTypeName(GoParser::TypeNameContext *ctx);
void exitTypeName(GoParser::TypeNameContext *ctx);
void enterTypeLit(GoParser::TypeLitContext *ctx);
void exitTypeLit(GoParser::TypeLitContext *ctx);
void enterArrayType(GoParser::ArrayTypeContext *ctx);
void exitArrayType(GoParser::ArrayTypeContext *ctx);
void enterArrayLength(GoParser::ArrayLengthContext *ctx);
void exitArrayLength(GoParser::ArrayLengthContext *ctx);
void enterElementType(GoParser::ElementTypeContext *ctx);
void exitElementType(GoParser::ElementTypeContext *ctx);
void enterPointerType(GoParser::PointerTypeContext *ctx);
void exitPointerType(GoParser::PointerTypeContext *ctx);
void enterInterfaceType(GoParser::InterfaceTypeContext *ctx);
void exitInterfaceType(GoParser::InterfaceTypeContext *ctx);
void enterSliceType(GoParser::SliceTypeContext *ctx);
void exitSliceType(GoParser::SliceTypeContext *ctx);
void enterMapType(GoParser::MapTypeContext *ctx);
void exitMapType(GoParser::MapTypeContext *ctx);
void enterChannelType(GoParser::ChannelTypeContext *ctx);
void exitChannelType(GoParser::ChannelTypeContext *ctx);
void enterMethodSpec(GoParser::MethodSpecContext *ctx);
void exitMethodSpec(GoParser::MethodSpecContext *ctx);
void enterFunctionType(GoParser::FunctionTypeContext *ctx);
void exitFunctionType(GoParser::FunctionTypeContext *ctx);
void enterSignature(GoParser::SignatureContext *ctx);
void exitSignature(GoParser::SignatureContext *ctx);
void enterResult(GoParser::ResultContext *ctx);
void exitResult(GoParser::ResultContext *ctx);
void enterParameters(GoParser::ParametersContext *ctx);
void exitParameters(GoParser::ParametersContext *ctx);
void enterParameterDecl(GoParser::ParameterDeclContext *ctx);
void exitParameterDecl(GoParser::ParameterDeclContext *ctx);
void enterExpression(GoParser::ExpressionContext *ctx);
void exitExpression(GoParser::ExpressionContext *ctx);
void enterUnaryOperation(GoParser::UnaryOperationContext *ctx);
void exitUnaryOperation(GoParser::UnaryOperationContext *ctx);
void enterPrimaryExpression(GoParser::PrimaryExpressionContext *ctx);
void exitPrimaryExpression(GoParser::PrimaryExpressionContext *ctx);
void enterPlusMinusOperation(GoParser::PlusMinusOperationContext *ctx);
void exitPlusMinusOperation(GoParser::PlusMinusOperationContext *ctx);
void enterRelationOperation(GoParser::RelationOperationContext *ctx);
void exitRelationOperation(GoParser::RelationOperationContext *ctx);
void enterMulDivOperation(GoParser::MulDivOperationContext *ctx);
void exitMulDivOperation(GoParser::MulDivOperationContext *ctx);
void enterLogicalOrOperation(GoParser::LogicalOrOperationContext *ctx);
void exitLogicalOrOperation(GoParser::LogicalOrOperationContext *ctx);
void enterLogicalAndOperation(GoParser::LogicalAndOperationContext *ctx);
void exitLogicalAndOperation(GoParser::LogicalAndOperationContext *ctx);
void enterPrimaryExpr(GoParser::PrimaryExprContext *ctx);
void exitPrimaryExpr(GoParser::PrimaryExprContext *ctx);
void enterConversion(GoParser::ConversionContext *ctx);
void exitConversion(GoParser::ConversionContext *ctx);
void enterNonNamedType(GoParser::NonNamedTypeContext *ctx);
void exitNonNamedType(GoParser::NonNamedTypeContext *ctx);
void enterOperand(GoParser::OperandContext *ctx);
void exitOperand(GoParser::OperandContext *ctx);
void enterLiteral(GoParser::LiteralContext *ctx);
void exitLiteral(GoParser::LiteralContext *ctx);
void enterBasicLit(GoParser::BasicLitContext *ctx);
void exitBasicLit(GoParser::BasicLitContext *ctx);
void enterInteger(GoParser::IntegerContext *ctx);
void exitInteger(GoParser::IntegerContext *ctx);
void enterOperandName(GoParser::OperandNameContext *ctx);
void exitOperandName(GoParser::OperandNameContext *ctx);
void enterQualifiedIdent(GoParser::QualifiedIdentContext *ctx);
void exitQualifiedIdent(GoParser::QualifiedIdentContext *ctx);
void enterCompositeLit(GoParser::CompositeLitContext *ctx);
void exitCompositeLit(GoParser::CompositeLitContext *ctx);
void enterLiteralType(GoParser::LiteralTypeContext *ctx);
void exitLiteralType(GoParser::LiteralTypeContext *ctx);
void enterLiteralValue(GoParser::LiteralValueContext *ctx);
void exitLiteralValue(GoParser::LiteralValueContext *ctx);
void enterElementList(GoParser::ElementListContext *ctx);
void exitElementList(GoParser::ElementListContext *ctx);
void enterKeyedElement(GoParser::KeyedElementContext *ctx);
void exitKeyedElement(GoParser::KeyedElementContext *ctx);
void enterKey(GoParser::KeyContext *ctx);
void exitKey(GoParser::KeyContext *ctx);
void enterElement(GoParser::ElementContext *ctx);
void exitElement(GoParser::ElementContext *ctx);
void enterStructType(GoParser::StructTypeContext *ctx);
void exitStructType(GoParser::StructTypeContext *ctx);
void enterFieldDecl(GoParser::FieldDeclContext *ctx);
void exitFieldDecl(GoParser::FieldDeclContext *ctx);
void enterString_(GoParser::String_Context *ctx);
void exitString_(GoParser::String_Context *ctx);
void enterEmbeddedField(GoParser::EmbeddedFieldContext *ctx);
void exitEmbeddedField(GoParser::EmbeddedFieldContext *ctx);
void enterFunctionLit(GoParser::FunctionLitContext *ctx);
void exitFunctionLit(GoParser::FunctionLitContext *ctx);
void enterIndex(GoParser::IndexContext *ctx);
void exitIndex(GoParser::IndexContext *ctx);
void enterSlice_(GoParser::Slice_Context *ctx);
void exitSlice_(GoParser::Slice_Context *ctx);
void enterTypeAssertion(GoParser::TypeAssertionContext *ctx);
void exitTypeAssertion(GoParser::TypeAssertionContext *ctx);
void enterArguments(GoParser::ArgumentsContext *ctx);
void exitArguments(GoParser::ArgumentsContext *ctx);
void enterMethodExpr(GoParser::MethodExprContext *ctx);
void exitMethodExpr(GoParser::MethodExprContext *ctx);
void enterReceiverType(GoParser::ReceiverTypeContext *ctx);
void exitReceiverType(GoParser::ReceiverTypeContext *ctx);
void enterEoss(GoParser::EossContext *ctx);
void exitEoss(GoParser::EossContext *ctx);
void visitTerminal(antlr4::tree::TerminalNode *node);
void visitErrorNode(antlr4::tree::ErrorNode *node);
void enterEveryRule(antlr4::ParserRuleContext *ctx);
void exitEveryRule(antlr4::ParserRuleContext *ctx);
private:
};
}// namespace std end
#endif