Make anltr conformed to standard env

This commit is contained in:
ridethepig 2023-04-28 16:38:48 +08:00
parent c9863dda91
commit 31bf47eb70
12 changed files with 5292 additions and 14 deletions

View File

@ -5,23 +5,13 @@ project(sysy)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_EXPORT_COMPILE_COMMANDS 1) # generate food for clangd
# Include path for ExternalAntlr4Cpp
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
add_definitions(-DANTLR4CPP_STATIC)
# using /MD flag for antlr4_runtime (for Visual C++ compilers only)
set(ANTLR4_WITH_STATIC_CRT OFF)
set(ANTLR4_ZIP_REPOSITORY ${CMAKE_CURRENT_SOURCE_DIR}/tools/antlr4-4.12.0.zip)
include(ExternalAntlr4Cpp)
include_directories(${ANTLR4_INCLUDE_DIRS})
set(ANTLR_EXECUTABLE ${CMAKE_CURRENT_SOURCE_DIR}/tools/antlr-4.12.0-complete.jar)
find_package(ANTLR REQUIRED)
antlr_target(SysY ${CMAKE_CURRENT_SOURCE_DIR}/SysY.g4 VISITOR
PACKAGE antlrSysY
)
include_directories(${ANTLR_SysY_OUTPUT_DIR})
find_package(ANTLR4-RUNTIME REQUIRED)
include_directories(${ANTLR4_INCLUDE_DIR})
# Custom sources start here
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
file(GLOB_RECURSE SOURCES "src/*.cpp")
add_executable(sysy ${SOURCES} ${ANTLR_SysY_CXX_OUTPUTS})
add_executable(sysy ${SOURCES})
target_link_libraries(sysy antlr4_static)

207
include/SysYBaseVisitor.h Normal file
View File

@ -0,0 +1,207 @@
// Generated from SysY.g4 by ANTLR 4.12.0
#pragma once
#include "antlr4-runtime.h"
#include "SysYVisitor.h"
namespace antlrSysY {
/**
* This class provides an empty implementation of SysYVisitor, which can be
* extended to create a visitor which only needs to handle a subset of the available methods.
*/
class SysYBaseVisitor : public SysYVisitor {
public:
virtual std::any visitProgram(SysYParser::ProgramContext *ctx) override {
return visitChildren(ctx);
}
virtual std::any visitCompUnit(SysYParser::CompUnitContext *ctx) override {
return visitChildren(ctx);
}
virtual std::any visitDecl(SysYParser::DeclContext *ctx) override {
return visitChildren(ctx);
}
virtual std::any visitConstDecl(SysYParser::ConstDeclContext *ctx) override {
return visitChildren(ctx);
}
virtual std::any visitBType(SysYParser::BTypeContext *ctx) override {
return visitChildren(ctx);
}
virtual std::any visitConstDef(SysYParser::ConstDefContext *ctx) override {
return visitChildren(ctx);
}
virtual std::any visitConstInitVal(SysYParser::ConstInitValContext *ctx) override {
return visitChildren(ctx);
}
virtual std::any visitVarDecl(SysYParser::VarDeclContext *ctx) override {
return visitChildren(ctx);
}
virtual std::any visitVarDef(SysYParser::VarDefContext *ctx) override {
return visitChildren(ctx);
}
virtual std::any visitInitVal(SysYParser::InitValContext *ctx) override {
return visitChildren(ctx);
}
virtual std::any visitFuncDef(SysYParser::FuncDefContext *ctx) override {
return visitChildren(ctx);
}
virtual std::any visitFuncType(SysYParser::FuncTypeContext *ctx) override {
return visitChildren(ctx);
}
virtual std::any visitFuncFParams(SysYParser::FuncFParamsContext *ctx) override {
return visitChildren(ctx);
}
virtual std::any visitFuncFParam(SysYParser::FuncFParamContext *ctx) override {
return visitChildren(ctx);
}
virtual std::any visitBlock(SysYParser::BlockContext *ctx) override {
return visitChildren(ctx);
}
virtual std::any visitBlockItem(SysYParser::BlockItemContext *ctx) override {
return visitChildren(ctx);
}
virtual std::any visitStmt(SysYParser::StmtContext *ctx) override {
return visitChildren(ctx);
}
virtual std::any visitAssignStmt(SysYParser::AssignStmtContext *ctx) override {
return visitChildren(ctx);
}
virtual std::any visitExpStmt(SysYParser::ExpStmtContext *ctx) override {
return visitChildren(ctx);
}
virtual std::any visitConditionStmt(SysYParser::ConditionStmtContext *ctx) override {
return visitChildren(ctx);
}
virtual std::any visitWhileStmt(SysYParser::WhileStmtContext *ctx) override {
return visitChildren(ctx);
}
virtual std::any visitBreakStmt(SysYParser::BreakStmtContext *ctx) override {
return visitChildren(ctx);
}
virtual std::any visitContinueStmt(SysYParser::ContinueStmtContext *ctx) override {
return visitChildren(ctx);
}
virtual std::any visitReturnStmt(SysYParser::ReturnStmtContext *ctx) override {
return visitChildren(ctx);
}
virtual std::any visitExp(SysYParser::ExpContext *ctx) override {
return visitChildren(ctx);
}
virtual std::any visitCond(SysYParser::CondContext *ctx) override {
return visitChildren(ctx);
}
virtual std::any visitLVal(SysYParser::LValContext *ctx) override {
return visitChildren(ctx);
}
virtual std::any visitPrimaryExp(SysYParser::PrimaryExpContext *ctx) override {
return visitChildren(ctx);
}
virtual std::any visitNumber(SysYParser::NumberContext *ctx) override {
return visitChildren(ctx);
}
virtual std::any visitIntConst(SysYParser::IntConstContext *ctx) override {
return visitChildren(ctx);
}
virtual std::any visitUnaryExp(SysYParser::UnaryExpContext *ctx) override {
return visitChildren(ctx);
}
virtual std::any visitCallee(SysYParser::CalleeContext *ctx) override {
return visitChildren(ctx);
}
virtual std::any visitUnaryOp(SysYParser::UnaryOpContext *ctx) override {
return visitChildren(ctx);
}
virtual std::any visitFuncRParams(SysYParser::FuncRParamsContext *ctx) override {
return visitChildren(ctx);
}
virtual std::any visitParam(SysYParser::ParamContext *ctx) override {
return visitChildren(ctx);
}
virtual std::any visitMulExp(SysYParser::MulExpContext *ctx) override {
return visitChildren(ctx);
}
virtual std::any visitMulOp(SysYParser::MulOpContext *ctx) override {
return visitChildren(ctx);
}
virtual std::any visitAddExp(SysYParser::AddExpContext *ctx) override {
return visitChildren(ctx);
}
virtual std::any visitAddOp(SysYParser::AddOpContext *ctx) override {
return visitChildren(ctx);
}
virtual std::any visitRelExp(SysYParser::RelExpContext *ctx) override {
return visitChildren(ctx);
}
virtual std::any visitRelOp(SysYParser::RelOpContext *ctx) override {
return visitChildren(ctx);
}
virtual std::any visitEqExp(SysYParser::EqExpContext *ctx) override {
return visitChildren(ctx);
}
virtual std::any visitEqOp(SysYParser::EqOpContext *ctx) override {
return visitChildren(ctx);
}
virtual std::any visitLAndExp(SysYParser::LAndExpContext *ctx) override {
return visitChildren(ctx);
}
virtual std::any visitLOrExp(SysYParser::LOrExpContext *ctx) override {
return visitChildren(ctx);
}
virtual std::any visitConstExp(SysYParser::ConstExpContext *ctx) override {
return visitChildren(ctx);
}
};
} // namespace antlrSysY

58
include/SysYLexer.h Normal file
View File

@ -0,0 +1,58 @@
// Generated from SysY.g4 by ANTLR 4.12.0
#pragma once
#include "antlr4-runtime.h"
namespace antlrSysY {
class SysYLexer : public antlr4::Lexer {
public:
enum {
CONST_KW = 1, INT_KW = 2, VOID_KW = 3, IF_KW = 4, ELSE_KW = 5, WHILE_KW = 6,
BREAK_KW = 7, CONTINUE_KW = 8, RETURN_KW = 9, IDENT = 10, DECIMAL_CONST = 11,
OCTAL_CONST = 12, HEXADECIMAL_CONST = 13, STRING = 14, PLUS = 15, MINUS = 16,
NOT = 17, MUL = 18, DIV = 19, MOD = 20, ASSIGN = 21, EQ = 22, NEQ = 23,
LT = 24, GT = 25, LE = 26, GE = 27, AND = 28, OR = 29, L_PAREN = 30,
R_PAREN = 31, L_BRACE = 32, R_BRACE = 33, L_BRACKT = 34, R_BRACKT = 35,
COMMA = 36, SEMICOLON = 37, DOUBLE_QUOTE = 38, WS = 39, LINE_COMMENT = 40,
MULTILINE_COMMENT = 41
};
explicit SysYLexer(antlr4::CharStream *input);
~SysYLexer() override;
std::string getGrammarFileName() const override;
const std::vector<std::string>& getRuleNames() const override;
const std::vector<std::string>& getChannelNames() const override;
const std::vector<std::string>& getModeNames() const override;
const antlr4::dfa::Vocabulary& getVocabulary() const override;
antlr4::atn::SerializedATNView getSerializedATN() const override;
const antlr4::atn::ATN& getATN() const override;
// By default the static state used to implement the lexer is lazily initialized during the first
// call to the constructor. You can call this function if you wish to initialize the static state
// ahead of time.
static void initialize();
private:
// Individual action functions triggered by action() above.
// Individual semantic predicate functions triggered by sempred() above.
};
} // namespace antlrSysY

849
include/SysYParser.h Normal file
View File

@ -0,0 +1,849 @@
// Generated from SysY.g4 by ANTLR 4.12.0
#pragma once
#include "antlr4-runtime.h"
namespace antlrSysY {
class SysYParser : public antlr4::Parser {
public:
enum {
CONST_KW = 1, INT_KW = 2, VOID_KW = 3, IF_KW = 4, ELSE_KW = 5, WHILE_KW = 6,
BREAK_KW = 7, CONTINUE_KW = 8, RETURN_KW = 9, IDENT = 10, DECIMAL_CONST = 11,
OCTAL_CONST = 12, HEXADECIMAL_CONST = 13, STRING = 14, PLUS = 15, MINUS = 16,
NOT = 17, MUL = 18, DIV = 19, MOD = 20, ASSIGN = 21, EQ = 22, NEQ = 23,
LT = 24, GT = 25, LE = 26, GE = 27, AND = 28, OR = 29, L_PAREN = 30,
R_PAREN = 31, L_BRACE = 32, R_BRACE = 33, L_BRACKT = 34, R_BRACKT = 35,
COMMA = 36, SEMICOLON = 37, DOUBLE_QUOTE = 38, WS = 39, LINE_COMMENT = 40,
MULTILINE_COMMENT = 41
};
enum {
RuleProgram = 0, RuleCompUnit = 1, RuleDecl = 2, RuleConstDecl = 3,
RuleBType = 4, RuleConstDef = 5, RuleConstInitVal = 6, RuleVarDecl = 7,
RuleVarDef = 8, RuleInitVal = 9, RuleFuncDef = 10, RuleFuncType = 11,
RuleFuncFParams = 12, RuleFuncFParam = 13, RuleBlock = 14, RuleBlockItem = 15,
RuleStmt = 16, RuleAssignStmt = 17, RuleExpStmt = 18, RuleConditionStmt = 19,
RuleWhileStmt = 20, RuleBreakStmt = 21, RuleContinueStmt = 22, RuleReturnStmt = 23,
RuleExp = 24, RuleCond = 25, RuleLVal = 26, RulePrimaryExp = 27, RuleNumber = 28,
RuleIntConst = 29, RuleUnaryExp = 30, RuleCallee = 31, RuleUnaryOp = 32,
RuleFuncRParams = 33, RuleParam = 34, RuleMulExp = 35, RuleMulOp = 36,
RuleAddExp = 37, RuleAddOp = 38, RuleRelExp = 39, RuleRelOp = 40, RuleEqExp = 41,
RuleEqOp = 42, RuleLAndExp = 43, RuleLOrExp = 44, RuleConstExp = 45
};
explicit SysYParser(antlr4::TokenStream *input);
SysYParser(antlr4::TokenStream *input, const antlr4::atn::ParserATNSimulatorOptions &options);
~SysYParser() override;
std::string getGrammarFileName() const override;
const antlr4::atn::ATN& getATN() const override;
const std::vector<std::string>& getRuleNames() const override;
const antlr4::dfa::Vocabulary& getVocabulary() const override;
antlr4::atn::SerializedATNView getSerializedATN() const override;
class ProgramContext;
class CompUnitContext;
class DeclContext;
class ConstDeclContext;
class BTypeContext;
class ConstDefContext;
class ConstInitValContext;
class VarDeclContext;
class VarDefContext;
class InitValContext;
class FuncDefContext;
class FuncTypeContext;
class FuncFParamsContext;
class FuncFParamContext;
class BlockContext;
class BlockItemContext;
class StmtContext;
class AssignStmtContext;
class ExpStmtContext;
class ConditionStmtContext;
class WhileStmtContext;
class BreakStmtContext;
class ContinueStmtContext;
class ReturnStmtContext;
class ExpContext;
class CondContext;
class LValContext;
class PrimaryExpContext;
class NumberContext;
class IntConstContext;
class UnaryExpContext;
class CalleeContext;
class UnaryOpContext;
class FuncRParamsContext;
class ParamContext;
class MulExpContext;
class MulOpContext;
class AddExpContext;
class AddOpContext;
class RelExpContext;
class RelOpContext;
class EqExpContext;
class EqOpContext;
class LAndExpContext;
class LOrExpContext;
class ConstExpContext;
class ProgramContext : public antlr4::ParserRuleContext {
public:
ProgramContext(antlr4::ParserRuleContext *parent, size_t invokingState);
virtual size_t getRuleIndex() const override;
CompUnitContext *compUnit();
virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
};
ProgramContext* program();
class CompUnitContext : public antlr4::ParserRuleContext {
public:
CompUnitContext(antlr4::ParserRuleContext *parent, size_t invokingState);
virtual size_t getRuleIndex() const override;
std::vector<FuncDefContext *> funcDef();
FuncDefContext* funcDef(size_t i);
std::vector<DeclContext *> decl();
DeclContext* decl(size_t i);
virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
};
CompUnitContext* compUnit();
class DeclContext : public antlr4::ParserRuleContext {
public:
DeclContext(antlr4::ParserRuleContext *parent, size_t invokingState);
virtual size_t getRuleIndex() const override;
ConstDeclContext *constDecl();
VarDeclContext *varDecl();
virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
};
DeclContext* decl();
class ConstDeclContext : public antlr4::ParserRuleContext {
public:
ConstDeclContext(antlr4::ParserRuleContext *parent, size_t invokingState);
virtual size_t getRuleIndex() const override;
antlr4::tree::TerminalNode *CONST_KW();
BTypeContext *bType();
std::vector<ConstDefContext *> constDef();
ConstDefContext* constDef(size_t i);
antlr4::tree::TerminalNode *SEMICOLON();
std::vector<antlr4::tree::TerminalNode *> COMMA();
antlr4::tree::TerminalNode* COMMA(size_t i);
virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
};
ConstDeclContext* constDecl();
class BTypeContext : public antlr4::ParserRuleContext {
public:
BTypeContext(antlr4::ParserRuleContext *parent, size_t invokingState);
virtual size_t getRuleIndex() const override;
antlr4::tree::TerminalNode *INT_KW();
virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
};
BTypeContext* bType();
class ConstDefContext : public antlr4::ParserRuleContext {
public:
ConstDefContext(antlr4::ParserRuleContext *parent, size_t invokingState);
virtual size_t getRuleIndex() const override;
antlr4::tree::TerminalNode *IDENT();
antlr4::tree::TerminalNode *ASSIGN();
ConstInitValContext *constInitVal();
std::vector<antlr4::tree::TerminalNode *> L_BRACKT();
antlr4::tree::TerminalNode* L_BRACKT(size_t i);
std::vector<ConstExpContext *> constExp();
ConstExpContext* constExp(size_t i);
std::vector<antlr4::tree::TerminalNode *> R_BRACKT();
antlr4::tree::TerminalNode* R_BRACKT(size_t i);
virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
};
ConstDefContext* constDef();
class ConstInitValContext : public antlr4::ParserRuleContext {
public:
ConstInitValContext(antlr4::ParserRuleContext *parent, size_t invokingState);
virtual size_t getRuleIndex() const override;
ConstExpContext *constExp();
antlr4::tree::TerminalNode *L_BRACE();
antlr4::tree::TerminalNode *R_BRACE();
std::vector<ConstInitValContext *> constInitVal();
ConstInitValContext* constInitVal(size_t i);
std::vector<antlr4::tree::TerminalNode *> COMMA();
antlr4::tree::TerminalNode* COMMA(size_t i);
virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
};
ConstInitValContext* constInitVal();
class VarDeclContext : public antlr4::ParserRuleContext {
public:
VarDeclContext(antlr4::ParserRuleContext *parent, size_t invokingState);
virtual size_t getRuleIndex() const override;
BTypeContext *bType();
std::vector<VarDefContext *> varDef();
VarDefContext* varDef(size_t i);
antlr4::tree::TerminalNode *SEMICOLON();
std::vector<antlr4::tree::TerminalNode *> COMMA();
antlr4::tree::TerminalNode* COMMA(size_t i);
virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
};
VarDeclContext* varDecl();
class VarDefContext : public antlr4::ParserRuleContext {
public:
VarDefContext(antlr4::ParserRuleContext *parent, size_t invokingState);
virtual size_t getRuleIndex() const override;
antlr4::tree::TerminalNode *IDENT();
std::vector<antlr4::tree::TerminalNode *> L_BRACKT();
antlr4::tree::TerminalNode* L_BRACKT(size_t i);
std::vector<ConstExpContext *> constExp();
ConstExpContext* constExp(size_t i);
std::vector<antlr4::tree::TerminalNode *> R_BRACKT();
antlr4::tree::TerminalNode* R_BRACKT(size_t i);
antlr4::tree::TerminalNode *ASSIGN();
InitValContext *initVal();
virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
};
VarDefContext* varDef();
class InitValContext : public antlr4::ParserRuleContext {
public:
InitValContext(antlr4::ParserRuleContext *parent, size_t invokingState);
virtual size_t getRuleIndex() const override;
ExpContext *exp();
antlr4::tree::TerminalNode *L_BRACE();
antlr4::tree::TerminalNode *R_BRACE();
std::vector<InitValContext *> initVal();
InitValContext* initVal(size_t i);
std::vector<antlr4::tree::TerminalNode *> COMMA();
antlr4::tree::TerminalNode* COMMA(size_t i);
virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
};
InitValContext* initVal();
class FuncDefContext : public antlr4::ParserRuleContext {
public:
FuncDefContext(antlr4::ParserRuleContext *parent, size_t invokingState);
virtual size_t getRuleIndex() const override;
FuncTypeContext *funcType();
antlr4::tree::TerminalNode *IDENT();
antlr4::tree::TerminalNode *L_PAREN();
antlr4::tree::TerminalNode *R_PAREN();
BlockContext *block();
FuncFParamsContext *funcFParams();
virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
};
FuncDefContext* funcDef();
class FuncTypeContext : public antlr4::ParserRuleContext {
public:
FuncTypeContext(antlr4::ParserRuleContext *parent, size_t invokingState);
virtual size_t getRuleIndex() const override;
antlr4::tree::TerminalNode *VOID_KW();
antlr4::tree::TerminalNode *INT_KW();
virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
};
FuncTypeContext* funcType();
class FuncFParamsContext : public antlr4::ParserRuleContext {
public:
FuncFParamsContext(antlr4::ParserRuleContext *parent, size_t invokingState);
virtual size_t getRuleIndex() const override;
std::vector<FuncFParamContext *> funcFParam();
FuncFParamContext* funcFParam(size_t i);
std::vector<antlr4::tree::TerminalNode *> COMMA();
antlr4::tree::TerminalNode* COMMA(size_t i);
virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
};
FuncFParamsContext* funcFParams();
class FuncFParamContext : public antlr4::ParserRuleContext {
public:
FuncFParamContext(antlr4::ParserRuleContext *parent, size_t invokingState);
virtual size_t getRuleIndex() const override;
BTypeContext *bType();
antlr4::tree::TerminalNode *IDENT();
std::vector<antlr4::tree::TerminalNode *> L_BRACKT();
antlr4::tree::TerminalNode* L_BRACKT(size_t i);
std::vector<antlr4::tree::TerminalNode *> R_BRACKT();
antlr4::tree::TerminalNode* R_BRACKT(size_t i);
std::vector<ExpContext *> exp();
ExpContext* exp(size_t i);
virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
};
FuncFParamContext* funcFParam();
class BlockContext : public antlr4::ParserRuleContext {
public:
BlockContext(antlr4::ParserRuleContext *parent, size_t invokingState);
virtual size_t getRuleIndex() const override;
antlr4::tree::TerminalNode *L_BRACE();
antlr4::tree::TerminalNode *R_BRACE();
std::vector<BlockItemContext *> blockItem();
BlockItemContext* blockItem(size_t i);
virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
};
BlockContext* block();
class BlockItemContext : public antlr4::ParserRuleContext {
public:
BlockItemContext(antlr4::ParserRuleContext *parent, size_t invokingState);
virtual size_t getRuleIndex() const override;
ConstDeclContext *constDecl();
VarDeclContext *varDecl();
StmtContext *stmt();
virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
};
BlockItemContext* blockItem();
class StmtContext : public antlr4::ParserRuleContext {
public:
StmtContext(antlr4::ParserRuleContext *parent, size_t invokingState);
virtual size_t getRuleIndex() const override;
AssignStmtContext *assignStmt();
ExpStmtContext *expStmt();
BlockContext *block();
ConditionStmtContext *conditionStmt();
WhileStmtContext *whileStmt();
BreakStmtContext *breakStmt();
ContinueStmtContext *continueStmt();
ReturnStmtContext *returnStmt();
virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
};
StmtContext* stmt();
class AssignStmtContext : public antlr4::ParserRuleContext {
public:
AssignStmtContext(antlr4::ParserRuleContext *parent, size_t invokingState);
virtual size_t getRuleIndex() const override;
LValContext *lVal();
antlr4::tree::TerminalNode *ASSIGN();
ExpContext *exp();
antlr4::tree::TerminalNode *SEMICOLON();
virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
};
AssignStmtContext* assignStmt();
class ExpStmtContext : public antlr4::ParserRuleContext {
public:
ExpStmtContext(antlr4::ParserRuleContext *parent, size_t invokingState);
virtual size_t getRuleIndex() const override;
antlr4::tree::TerminalNode *SEMICOLON();
ExpContext *exp();
virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
};
ExpStmtContext* expStmt();
class ConditionStmtContext : public antlr4::ParserRuleContext {
public:
ConditionStmtContext(antlr4::ParserRuleContext *parent, size_t invokingState);
virtual size_t getRuleIndex() const override;
antlr4::tree::TerminalNode *IF_KW();
antlr4::tree::TerminalNode *L_PAREN();
CondContext *cond();
antlr4::tree::TerminalNode *R_PAREN();
std::vector<StmtContext *> stmt();
StmtContext* stmt(size_t i);
antlr4::tree::TerminalNode *ELSE_KW();
virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
};
ConditionStmtContext* conditionStmt();
class WhileStmtContext : public antlr4::ParserRuleContext {
public:
WhileStmtContext(antlr4::ParserRuleContext *parent, size_t invokingState);
virtual size_t getRuleIndex() const override;
antlr4::tree::TerminalNode *WHILE_KW();
antlr4::tree::TerminalNode *L_PAREN();
CondContext *cond();
antlr4::tree::TerminalNode *R_PAREN();
StmtContext *stmt();
virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
};
WhileStmtContext* whileStmt();
class BreakStmtContext : public antlr4::ParserRuleContext {
public:
BreakStmtContext(antlr4::ParserRuleContext *parent, size_t invokingState);
virtual size_t getRuleIndex() const override;
antlr4::tree::TerminalNode *BREAK_KW();
antlr4::tree::TerminalNode *SEMICOLON();
virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
};
BreakStmtContext* breakStmt();
class ContinueStmtContext : public antlr4::ParserRuleContext {
public:
ContinueStmtContext(antlr4::ParserRuleContext *parent, size_t invokingState);
virtual size_t getRuleIndex() const override;
antlr4::tree::TerminalNode *CONTINUE_KW();
antlr4::tree::TerminalNode *SEMICOLON();
virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
};
ContinueStmtContext* continueStmt();
class ReturnStmtContext : public antlr4::ParserRuleContext {
public:
ReturnStmtContext(antlr4::ParserRuleContext *parent, size_t invokingState);
virtual size_t getRuleIndex() const override;
antlr4::tree::TerminalNode *RETURN_KW();
antlr4::tree::TerminalNode *SEMICOLON();
ExpContext *exp();
virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
};
ReturnStmtContext* returnStmt();
class ExpContext : public antlr4::ParserRuleContext {
public:
ExpContext(antlr4::ParserRuleContext *parent, size_t invokingState);
virtual size_t getRuleIndex() const override;
AddExpContext *addExp();
virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
};
ExpContext* exp();
class CondContext : public antlr4::ParserRuleContext {
public:
CondContext(antlr4::ParserRuleContext *parent, size_t invokingState);
virtual size_t getRuleIndex() const override;
LOrExpContext *lOrExp();
virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
};
CondContext* cond();
class LValContext : public antlr4::ParserRuleContext {
public:
LValContext(antlr4::ParserRuleContext *parent, size_t invokingState);
virtual size_t getRuleIndex() const override;
antlr4::tree::TerminalNode *IDENT();
std::vector<antlr4::tree::TerminalNode *> L_BRACKT();
antlr4::tree::TerminalNode* L_BRACKT(size_t i);
std::vector<ExpContext *> exp();
ExpContext* exp(size_t i);
std::vector<antlr4::tree::TerminalNode *> R_BRACKT();
antlr4::tree::TerminalNode* R_BRACKT(size_t i);
virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
};
LValContext* lVal();
class PrimaryExpContext : public antlr4::ParserRuleContext {
public:
PrimaryExpContext(antlr4::ParserRuleContext *parent, size_t invokingState);
virtual size_t getRuleIndex() const override;
antlr4::tree::TerminalNode *L_PAREN();
ExpContext *exp();
antlr4::tree::TerminalNode *R_PAREN();
LValContext *lVal();
NumberContext *number();
virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
};
PrimaryExpContext* primaryExp();
class NumberContext : public antlr4::ParserRuleContext {
public:
NumberContext(antlr4::ParserRuleContext *parent, size_t invokingState);
virtual size_t getRuleIndex() const override;
IntConstContext *intConst();
virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
};
NumberContext* number();
class IntConstContext : public antlr4::ParserRuleContext {
public:
IntConstContext(antlr4::ParserRuleContext *parent, size_t invokingState);
virtual size_t getRuleIndex() const override;
antlr4::tree::TerminalNode *DECIMAL_CONST();
antlr4::tree::TerminalNode *OCTAL_CONST();
antlr4::tree::TerminalNode *HEXADECIMAL_CONST();
virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
};
IntConstContext* intConst();
class UnaryExpContext : public antlr4::ParserRuleContext {
public:
UnaryExpContext(antlr4::ParserRuleContext *parent, size_t invokingState);
virtual size_t getRuleIndex() const override;
PrimaryExpContext *primaryExp();
CalleeContext *callee();
UnaryOpContext *unaryOp();
UnaryExpContext *unaryExp();
virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
};
UnaryExpContext* unaryExp();
class CalleeContext : public antlr4::ParserRuleContext {
public:
CalleeContext(antlr4::ParserRuleContext *parent, size_t invokingState);
virtual size_t getRuleIndex() const override;
antlr4::tree::TerminalNode *IDENT();
antlr4::tree::TerminalNode *L_PAREN();
antlr4::tree::TerminalNode *R_PAREN();
FuncRParamsContext *funcRParams();
virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
};
CalleeContext* callee();
class UnaryOpContext : public antlr4::ParserRuleContext {
public:
UnaryOpContext(antlr4::ParserRuleContext *parent, size_t invokingState);
virtual size_t getRuleIndex() const override;
antlr4::tree::TerminalNode *PLUS();
antlr4::tree::TerminalNode *MINUS();
antlr4::tree::TerminalNode *NOT();
virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
};
UnaryOpContext* unaryOp();
class FuncRParamsContext : public antlr4::ParserRuleContext {
public:
FuncRParamsContext(antlr4::ParserRuleContext *parent, size_t invokingState);
virtual size_t getRuleIndex() const override;
std::vector<ParamContext *> param();
ParamContext* param(size_t i);
std::vector<antlr4::tree::TerminalNode *> COMMA();
antlr4::tree::TerminalNode* COMMA(size_t i);
virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
};
FuncRParamsContext* funcRParams();
class ParamContext : public antlr4::ParserRuleContext {
public:
ParamContext(antlr4::ParserRuleContext *parent, size_t invokingState);
virtual size_t getRuleIndex() const override;
ExpContext *exp();
antlr4::tree::TerminalNode *STRING();
virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
};
ParamContext* param();
class MulExpContext : public antlr4::ParserRuleContext {
public:
MulExpContext(antlr4::ParserRuleContext *parent, size_t invokingState);
virtual size_t getRuleIndex() const override;
std::vector<UnaryExpContext *> unaryExp();
UnaryExpContext* unaryExp(size_t i);
std::vector<MulOpContext *> mulOp();
MulOpContext* mulOp(size_t i);
virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
};
MulExpContext* mulExp();
class MulOpContext : public antlr4::ParserRuleContext {
public:
MulOpContext(antlr4::ParserRuleContext *parent, size_t invokingState);
virtual size_t getRuleIndex() const override;
antlr4::tree::TerminalNode *MUL();
antlr4::tree::TerminalNode *DIV();
antlr4::tree::TerminalNode *MOD();
virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
};
MulOpContext* mulOp();
class AddExpContext : public antlr4::ParserRuleContext {
public:
AddExpContext(antlr4::ParserRuleContext *parent, size_t invokingState);
virtual size_t getRuleIndex() const override;
std::vector<MulExpContext *> mulExp();
MulExpContext* mulExp(size_t i);
std::vector<AddOpContext *> addOp();
AddOpContext* addOp(size_t i);
virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
};
AddExpContext* addExp();
class AddOpContext : public antlr4::ParserRuleContext {
public:
AddOpContext(antlr4::ParserRuleContext *parent, size_t invokingState);
virtual size_t getRuleIndex() const override;
antlr4::tree::TerminalNode *PLUS();
antlr4::tree::TerminalNode *MINUS();
virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
};
AddOpContext* addOp();
class RelExpContext : public antlr4::ParserRuleContext {
public:
RelExpContext(antlr4::ParserRuleContext *parent, size_t invokingState);
virtual size_t getRuleIndex() const override;
std::vector<AddExpContext *> addExp();
AddExpContext* addExp(size_t i);
std::vector<RelOpContext *> relOp();
RelOpContext* relOp(size_t i);
virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
};
RelExpContext* relExp();
class RelOpContext : public antlr4::ParserRuleContext {
public:
RelOpContext(antlr4::ParserRuleContext *parent, size_t invokingState);
virtual size_t getRuleIndex() const override;
antlr4::tree::TerminalNode *LT();
antlr4::tree::TerminalNode *GT();
antlr4::tree::TerminalNode *LE();
antlr4::tree::TerminalNode *GE();
virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
};
RelOpContext* relOp();
class EqExpContext : public antlr4::ParserRuleContext {
public:
EqExpContext(antlr4::ParserRuleContext *parent, size_t invokingState);
virtual size_t getRuleIndex() const override;
std::vector<RelExpContext *> relExp();
RelExpContext* relExp(size_t i);
std::vector<EqOpContext *> eqOp();
EqOpContext* eqOp(size_t i);
virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
};
EqExpContext* eqExp();
class EqOpContext : public antlr4::ParserRuleContext {
public:
EqOpContext(antlr4::ParserRuleContext *parent, size_t invokingState);
virtual size_t getRuleIndex() const override;
antlr4::tree::TerminalNode *EQ();
antlr4::tree::TerminalNode *NEQ();
virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
};
EqOpContext* eqOp();
class LAndExpContext : public antlr4::ParserRuleContext {
public:
LAndExpContext(antlr4::ParserRuleContext *parent, size_t invokingState);
virtual size_t getRuleIndex() const override;
std::vector<EqExpContext *> eqExp();
EqExpContext* eqExp(size_t i);
std::vector<antlr4::tree::TerminalNode *> AND();
antlr4::tree::TerminalNode* AND(size_t i);
virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
};
LAndExpContext* lAndExp();
class LOrExpContext : public antlr4::ParserRuleContext {
public:
LOrExpContext(antlr4::ParserRuleContext *parent, size_t invokingState);
virtual size_t getRuleIndex() const override;
std::vector<LAndExpContext *> lAndExp();
LAndExpContext* lAndExp(size_t i);
std::vector<antlr4::tree::TerminalNode *> OR();
antlr4::tree::TerminalNode* OR(size_t i);
virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
};
LOrExpContext* lOrExp();
class ConstExpContext : public antlr4::ParserRuleContext {
public:
ConstExpContext(antlr4::ParserRuleContext *parent, size_t invokingState);
virtual size_t getRuleIndex() const override;
AddExpContext *addExp();
virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override;
};
ConstExpContext* constExp();
// By default the static state used to implement the parser is lazily initialized during the first
// call to the constructor. You can call this function if you wish to initialize the static state
// ahead of time.
static void initialize();
private:
};
} // namespace antlrSysY

118
include/SysYVisitor.h Normal file
View File

@ -0,0 +1,118 @@
// Generated from SysY.g4 by ANTLR 4.12.0
#pragma once
#include "antlr4-runtime.h"
#include "SysYParser.h"
namespace antlrSysY {
/**
* This class defines an abstract visitor for a parse tree
* produced by SysYParser.
*/
class SysYVisitor : public antlr4::tree::AbstractParseTreeVisitor {
public:
/**
* Visit parse trees produced by SysYParser.
*/
virtual std::any visitProgram(SysYParser::ProgramContext *context) = 0;
virtual std::any visitCompUnit(SysYParser::CompUnitContext *context) = 0;
virtual std::any visitDecl(SysYParser::DeclContext *context) = 0;
virtual std::any visitConstDecl(SysYParser::ConstDeclContext *context) = 0;
virtual std::any visitBType(SysYParser::BTypeContext *context) = 0;
virtual std::any visitConstDef(SysYParser::ConstDefContext *context) = 0;
virtual std::any visitConstInitVal(SysYParser::ConstInitValContext *context) = 0;
virtual std::any visitVarDecl(SysYParser::VarDeclContext *context) = 0;
virtual std::any visitVarDef(SysYParser::VarDefContext *context) = 0;
virtual std::any visitInitVal(SysYParser::InitValContext *context) = 0;
virtual std::any visitFuncDef(SysYParser::FuncDefContext *context) = 0;
virtual std::any visitFuncType(SysYParser::FuncTypeContext *context) = 0;
virtual std::any visitFuncFParams(SysYParser::FuncFParamsContext *context) = 0;
virtual std::any visitFuncFParam(SysYParser::FuncFParamContext *context) = 0;
virtual std::any visitBlock(SysYParser::BlockContext *context) = 0;
virtual std::any visitBlockItem(SysYParser::BlockItemContext *context) = 0;
virtual std::any visitStmt(SysYParser::StmtContext *context) = 0;
virtual std::any visitAssignStmt(SysYParser::AssignStmtContext *context) = 0;
virtual std::any visitExpStmt(SysYParser::ExpStmtContext *context) = 0;
virtual std::any visitConditionStmt(SysYParser::ConditionStmtContext *context) = 0;
virtual std::any visitWhileStmt(SysYParser::WhileStmtContext *context) = 0;
virtual std::any visitBreakStmt(SysYParser::BreakStmtContext *context) = 0;
virtual std::any visitContinueStmt(SysYParser::ContinueStmtContext *context) = 0;
virtual std::any visitReturnStmt(SysYParser::ReturnStmtContext *context) = 0;
virtual std::any visitExp(SysYParser::ExpContext *context) = 0;
virtual std::any visitCond(SysYParser::CondContext *context) = 0;
virtual std::any visitLVal(SysYParser::LValContext *context) = 0;
virtual std::any visitPrimaryExp(SysYParser::PrimaryExpContext *context) = 0;
virtual std::any visitNumber(SysYParser::NumberContext *context) = 0;
virtual std::any visitIntConst(SysYParser::IntConstContext *context) = 0;
virtual std::any visitUnaryExp(SysYParser::UnaryExpContext *context) = 0;
virtual std::any visitCallee(SysYParser::CalleeContext *context) = 0;
virtual std::any visitUnaryOp(SysYParser::UnaryOpContext *context) = 0;
virtual std::any visitFuncRParams(SysYParser::FuncRParamsContext *context) = 0;
virtual std::any visitParam(SysYParser::ParamContext *context) = 0;
virtual std::any visitMulExp(SysYParser::MulExpContext *context) = 0;
virtual std::any visitMulOp(SysYParser::MulOpContext *context) = 0;
virtual std::any visitAddExp(SysYParser::AddExpContext *context) = 0;
virtual std::any visitAddOp(SysYParser::AddOpContext *context) = 0;
virtual std::any visitRelExp(SysYParser::RelExpContext *context) = 0;
virtual std::any visitRelOp(SysYParser::RelOpContext *context) = 0;
virtual std::any visitEqExp(SysYParser::EqExpContext *context) = 0;
virtual std::any visitEqOp(SysYParser::EqOpContext *context) = 0;
virtual std::any visitLAndExp(SysYParser::LAndExpContext *context) = 0;
virtual std::any visitLOrExp(SysYParser::LOrExpContext *context) = 0;
virtual std::any visitConstExp(SysYParser::ConstExpContext *context) = 0;
};
} // namespace antlrSysY

8
scripts/antlr4-gen.sh Executable file
View File

@ -0,0 +1,8 @@
#!/bin/bash
mkdir -p build/antlr-gen
mkdir -p include
mkdir -p src
java -jar ./tools/antlr-4.12.0-complete.jar -no-listener -visitor -Dlanguage=Cpp -package antlrSysY -o build/antlr-gen SysY.g4
cp build/antlr-gen/*.cpp src/
cp build/antlr-gen/*.h include/

View File

@ -0,0 +1,15 @@
#!/bin/bash
mkdir -pv build/antlr4-cpp-runtime
unzip unzip tools/antlr4-cpp-runtime-4.12.0-source.zip -d build/antlr4-cpp-runtime
cd build/antlr4-cpp-runtime
mkdir build && mkdir run && cd build
cmake ..
make -j`nproc`
DESTDIR=../run make install
cd ../run
cd ../run/usr/local/include
sudo cp -r antlr4-runtime /usr/local/include
cd ../lib
sudo cp -r * /usr/local/lib
sudo ldconfig

9
src/SysYBaseVisitor.cpp Normal file
View File

@ -0,0 +1,9 @@
// Generated from SysY.g4 by ANTLR 4.12.0
#include "SysYBaseVisitor.h"
using namespace antlrSysY;

235
src/SysYLexer.cpp Normal file
View File

@ -0,0 +1,235 @@
// Generated from SysY.g4 by ANTLR 4.12.0
#include "SysYLexer.h"
using namespace antlr4;
using namespace antlrSysY;
using namespace antlr4;
namespace {
struct SysYLexerStaticData final {
SysYLexerStaticData(std::vector<std::string> ruleNames,
std::vector<std::string> channelNames,
std::vector<std::string> modeNames,
std::vector<std::string> literalNames,
std::vector<std::string> symbolicNames)
: ruleNames(std::move(ruleNames)), channelNames(std::move(channelNames)),
modeNames(std::move(modeNames)), literalNames(std::move(literalNames)),
symbolicNames(std::move(symbolicNames)),
vocabulary(this->literalNames, this->symbolicNames) {}
SysYLexerStaticData(const SysYLexerStaticData&) = delete;
SysYLexerStaticData(SysYLexerStaticData&&) = delete;
SysYLexerStaticData& operator=(const SysYLexerStaticData&) = delete;
SysYLexerStaticData& operator=(SysYLexerStaticData&&) = delete;
std::vector<antlr4::dfa::DFA> decisionToDFA;
antlr4::atn::PredictionContextCache sharedContextCache;
const std::vector<std::string> ruleNames;
const std::vector<std::string> channelNames;
const std::vector<std::string> modeNames;
const std::vector<std::string> literalNames;
const std::vector<std::string> symbolicNames;
const antlr4::dfa::Vocabulary vocabulary;
antlr4::atn::SerializedATNView serializedATN;
std::unique_ptr<antlr4::atn::ATN> atn;
};
::antlr4::internal::OnceFlag sysylexerLexerOnceFlag;
SysYLexerStaticData *sysylexerLexerStaticData = nullptr;
void sysylexerLexerInitialize() {
assert(sysylexerLexerStaticData == nullptr);
auto staticData = std::make_unique<SysYLexerStaticData>(
std::vector<std::string>{
"CONST_KW", "INT_KW", "VOID_KW", "IF_KW", "ELSE_KW", "WHILE_KW", "BREAK_KW",
"CONTINUE_KW", "RETURN_KW", "IDENT", "DECIMAL_CONST", "OCTAL_CONST",
"HEXADECIMAL_CONST", "STRING", "REGULAR_CHAR", "ESC", "PLUS", "MINUS",
"NOT", "MUL", "DIV", "MOD", "ASSIGN", "EQ", "NEQ", "LT", "GT", "LE",
"GE", "AND", "OR", "L_PAREN", "R_PAREN", "L_BRACE", "R_BRACE", "L_BRACKT",
"R_BRACKT", "COMMA", "SEMICOLON", "DOUBLE_QUOTE", "WS", "LINE_COMMENT",
"MULTILINE_COMMENT"
},
std::vector<std::string>{
"DEFAULT_TOKEN_CHANNEL", "HIDDEN"
},
std::vector<std::string>{
"DEFAULT_MODE"
},
std::vector<std::string>{
"", "'const'", "'int'", "'void'", "'if'", "'else'", "'while'", "'break'",
"'continue'", "'return'", "", "", "", "", "", "'+'", "'-'", "'!'",
"'*'", "'/'", "'%'", "'='", "'=='", "'!='", "'<'", "'>'", "'<='",
"'>='", "'&&'", "'||'", "'('", "')'", "'{'", "'}'", "'['", "']'",
"','", "';'", "'\"'"
},
std::vector<std::string>{
"", "CONST_KW", "INT_KW", "VOID_KW", "IF_KW", "ELSE_KW", "WHILE_KW",
"BREAK_KW", "CONTINUE_KW", "RETURN_KW", "IDENT", "DECIMAL_CONST",
"OCTAL_CONST", "HEXADECIMAL_CONST", "STRING", "PLUS", "MINUS", "NOT",
"MUL", "DIV", "MOD", "ASSIGN", "EQ", "NEQ", "LT", "GT", "LE", "GE",
"AND", "OR", "L_PAREN", "R_PAREN", "L_BRACE", "R_BRACE", "L_BRACKT",
"R_BRACKT", "COMMA", "SEMICOLON", "DOUBLE_QUOTE", "WS", "LINE_COMMENT",
"MULTILINE_COMMENT"
}
);
static const int32_t serializedATNSegment[] = {
4,0,41,281,6,-1,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6,7,
6,2,7,7,7,2,8,7,8,2,9,7,9,2,10,7,10,2,11,7,11,2,12,7,12,2,13,7,13,2,14,
7,14,2,15,7,15,2,16,7,16,2,17,7,17,2,18,7,18,2,19,7,19,2,20,7,20,2,21,
7,21,2,22,7,22,2,23,7,23,2,24,7,24,2,25,7,25,2,26,7,26,2,27,7,27,2,28,
7,28,2,29,7,29,2,30,7,30,2,31,7,31,2,32,7,32,2,33,7,33,2,34,7,34,2,35,
7,35,2,36,7,36,2,37,7,37,2,38,7,38,2,39,7,39,2,40,7,40,2,41,7,41,2,42,
7,42,1,0,1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,2,1,2,1,2,1,2,1,2,1,3,
1,3,1,3,1,4,1,4,1,4,1,4,1,4,1,5,1,5,1,5,1,5,1,5,1,5,1,6,1,6,1,6,1,6,1,
6,1,6,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,8,1,8,1,8,1,8,1,8,1,8,1,8,
1,9,1,9,1,9,4,9,142,8,9,11,9,12,9,143,3,9,146,8,9,1,10,1,10,1,10,4,10,
151,8,10,11,10,12,10,152,3,10,155,8,10,1,11,1,11,1,11,4,11,160,8,11,11,
11,12,11,161,3,11,164,8,11,1,12,1,12,1,12,1,12,3,12,170,8,12,1,12,4,12,
173,8,12,11,12,12,12,174,1,13,1,13,5,13,179,8,13,10,13,12,13,182,9,13,
1,13,1,13,1,14,1,14,3,14,188,8,14,1,15,1,15,1,15,1,15,3,15,194,8,15,1,
16,1,16,1,17,1,17,1,18,1,18,1,19,1,19,1,20,1,20,1,21,1,21,1,22,1,22,1,
23,1,23,1,23,1,24,1,24,1,24,1,25,1,25,1,26,1,26,1,27,1,27,1,27,1,28,1,
28,1,28,1,29,1,29,1,29,1,30,1,30,1,30,1,31,1,31,1,32,1,32,1,33,1,33,1,
34,1,34,1,35,1,35,1,36,1,36,1,37,1,37,1,38,1,38,1,39,1,39,1,40,4,40,251,
8,40,11,40,12,40,252,1,40,1,40,1,41,1,41,1,41,1,41,5,41,261,8,41,10,41,
12,41,264,9,41,1,41,1,41,1,42,1,42,1,42,1,42,5,42,272,8,42,10,42,12,42,
275,9,42,1,42,1,42,1,42,1,42,1,42,2,180,273,0,43,1,1,3,2,5,3,7,4,9,5,
11,6,13,7,15,8,17,9,19,10,21,11,23,12,25,13,27,14,29,0,31,0,33,15,35,
16,37,17,39,18,41,19,43,20,45,21,47,22,49,23,51,24,53,25,55,26,57,27,
59,28,61,29,63,30,65,31,67,32,69,33,71,34,73,35,75,36,77,37,79,38,81,
39,83,40,85,41,1,0,8,3,0,65,90,95,95,97,122,4,0,48,57,65,90,95,95,97,
122,1,0,49,57,1,0,48,57,1,0,48,55,3,0,48,57,65,70,97,102,3,0,9,10,13,
13,32,32,2,0,10,10,13,13,292,0,1,1,0,0,0,0,3,1,0,0,0,0,5,1,0,0,0,0,7,
1,0,0,0,0,9,1,0,0,0,0,11,1,0,0,0,0,13,1,0,0,0,0,15,1,0,0,0,0,17,1,0,0,
0,0,19,1,0,0,0,0,21,1,0,0,0,0,23,1,0,0,0,0,25,1,0,0,0,0,27,1,0,0,0,0,
33,1,0,0,0,0,35,1,0,0,0,0,37,1,0,0,0,0,39,1,0,0,0,0,41,1,0,0,0,0,43,1,
0,0,0,0,45,1,0,0,0,0,47,1,0,0,0,0,49,1,0,0,0,0,51,1,0,0,0,0,53,1,0,0,
0,0,55,1,0,0,0,0,57,1,0,0,0,0,59,1,0,0,0,0,61,1,0,0,0,0,63,1,0,0,0,0,
65,1,0,0,0,0,67,1,0,0,0,0,69,1,0,0,0,0,71,1,0,0,0,0,73,1,0,0,0,0,75,1,
0,0,0,0,77,1,0,0,0,0,79,1,0,0,0,0,81,1,0,0,0,0,83,1,0,0,0,0,85,1,0,0,
0,1,87,1,0,0,0,3,93,1,0,0,0,5,97,1,0,0,0,7,102,1,0,0,0,9,105,1,0,0,0,
11,110,1,0,0,0,13,116,1,0,0,0,15,122,1,0,0,0,17,131,1,0,0,0,19,145,1,
0,0,0,21,154,1,0,0,0,23,163,1,0,0,0,25,169,1,0,0,0,27,176,1,0,0,0,29,
187,1,0,0,0,31,193,1,0,0,0,33,195,1,0,0,0,35,197,1,0,0,0,37,199,1,0,0,
0,39,201,1,0,0,0,41,203,1,0,0,0,43,205,1,0,0,0,45,207,1,0,0,0,47,209,
1,0,0,0,49,212,1,0,0,0,51,215,1,0,0,0,53,217,1,0,0,0,55,219,1,0,0,0,57,
222,1,0,0,0,59,225,1,0,0,0,61,228,1,0,0,0,63,231,1,0,0,0,65,233,1,0,0,
0,67,235,1,0,0,0,69,237,1,0,0,0,71,239,1,0,0,0,73,241,1,0,0,0,75,243,
1,0,0,0,77,245,1,0,0,0,79,247,1,0,0,0,81,250,1,0,0,0,83,256,1,0,0,0,85,
267,1,0,0,0,87,88,5,99,0,0,88,89,5,111,0,0,89,90,5,110,0,0,90,91,5,115,
0,0,91,92,5,116,0,0,92,2,1,0,0,0,93,94,5,105,0,0,94,95,5,110,0,0,95,96,
5,116,0,0,96,4,1,0,0,0,97,98,5,118,0,0,98,99,5,111,0,0,99,100,5,105,0,
0,100,101,5,100,0,0,101,6,1,0,0,0,102,103,5,105,0,0,103,104,5,102,0,0,
104,8,1,0,0,0,105,106,5,101,0,0,106,107,5,108,0,0,107,108,5,115,0,0,108,
109,5,101,0,0,109,10,1,0,0,0,110,111,5,119,0,0,111,112,5,104,0,0,112,
113,5,105,0,0,113,114,5,108,0,0,114,115,5,101,0,0,115,12,1,0,0,0,116,
117,5,98,0,0,117,118,5,114,0,0,118,119,5,101,0,0,119,120,5,97,0,0,120,
121,5,107,0,0,121,14,1,0,0,0,122,123,5,99,0,0,123,124,5,111,0,0,124,125,
5,110,0,0,125,126,5,116,0,0,126,127,5,105,0,0,127,128,5,110,0,0,128,129,
5,117,0,0,129,130,5,101,0,0,130,16,1,0,0,0,131,132,5,114,0,0,132,133,
5,101,0,0,133,134,5,116,0,0,134,135,5,117,0,0,135,136,5,114,0,0,136,137,
5,110,0,0,137,18,1,0,0,0,138,146,7,0,0,0,139,141,7,0,0,0,140,142,7,1,
0,0,141,140,1,0,0,0,142,143,1,0,0,0,143,141,1,0,0,0,143,144,1,0,0,0,144,
146,1,0,0,0,145,138,1,0,0,0,145,139,1,0,0,0,146,20,1,0,0,0,147,155,7,
2,0,0,148,150,7,2,0,0,149,151,7,3,0,0,150,149,1,0,0,0,151,152,1,0,0,0,
152,150,1,0,0,0,152,153,1,0,0,0,153,155,1,0,0,0,154,147,1,0,0,0,154,148,
1,0,0,0,155,22,1,0,0,0,156,164,5,48,0,0,157,159,5,48,0,0,158,160,7,4,
0,0,159,158,1,0,0,0,160,161,1,0,0,0,161,159,1,0,0,0,161,162,1,0,0,0,162,
164,1,0,0,0,163,156,1,0,0,0,163,157,1,0,0,0,164,24,1,0,0,0,165,166,5,
48,0,0,166,170,5,120,0,0,167,168,5,48,0,0,168,170,5,88,0,0,169,165,1,
0,0,0,169,167,1,0,0,0,170,172,1,0,0,0,171,173,7,5,0,0,172,171,1,0,0,0,
173,174,1,0,0,0,174,172,1,0,0,0,174,175,1,0,0,0,175,26,1,0,0,0,176,180,
3,79,39,0,177,179,3,29,14,0,178,177,1,0,0,0,179,182,1,0,0,0,180,181,1,
0,0,0,180,178,1,0,0,0,181,183,1,0,0,0,182,180,1,0,0,0,183,184,3,79,39,
0,184,28,1,0,0,0,185,188,3,31,15,0,186,188,9,0,0,0,187,185,1,0,0,0,187,
186,1,0,0,0,188,30,1,0,0,0,189,190,5,92,0,0,190,194,5,34,0,0,191,192,
5,92,0,0,192,194,5,92,0,0,193,189,1,0,0,0,193,191,1,0,0,0,194,32,1,0,
0,0,195,196,5,43,0,0,196,34,1,0,0,0,197,198,5,45,0,0,198,36,1,0,0,0,199,
200,5,33,0,0,200,38,1,0,0,0,201,202,5,42,0,0,202,40,1,0,0,0,203,204,5,
47,0,0,204,42,1,0,0,0,205,206,5,37,0,0,206,44,1,0,0,0,207,208,5,61,0,
0,208,46,1,0,0,0,209,210,5,61,0,0,210,211,5,61,0,0,211,48,1,0,0,0,212,
213,5,33,0,0,213,214,5,61,0,0,214,50,1,0,0,0,215,216,5,60,0,0,216,52,
1,0,0,0,217,218,5,62,0,0,218,54,1,0,0,0,219,220,5,60,0,0,220,221,5,61,
0,0,221,56,1,0,0,0,222,223,5,62,0,0,223,224,5,61,0,0,224,58,1,0,0,0,225,
226,5,38,0,0,226,227,5,38,0,0,227,60,1,0,0,0,228,229,5,124,0,0,229,230,
5,124,0,0,230,62,1,0,0,0,231,232,5,40,0,0,232,64,1,0,0,0,233,234,5,41,
0,0,234,66,1,0,0,0,235,236,5,123,0,0,236,68,1,0,0,0,237,238,5,125,0,0,
238,70,1,0,0,0,239,240,5,91,0,0,240,72,1,0,0,0,241,242,5,93,0,0,242,74,
1,0,0,0,243,244,5,44,0,0,244,76,1,0,0,0,245,246,5,59,0,0,246,78,1,0,0,
0,247,248,5,34,0,0,248,80,1,0,0,0,249,251,7,6,0,0,250,249,1,0,0,0,251,
252,1,0,0,0,252,250,1,0,0,0,252,253,1,0,0,0,253,254,1,0,0,0,254,255,6,
40,0,0,255,82,1,0,0,0,256,257,5,47,0,0,257,258,5,47,0,0,258,262,1,0,0,
0,259,261,8,7,0,0,260,259,1,0,0,0,261,264,1,0,0,0,262,260,1,0,0,0,262,
263,1,0,0,0,263,265,1,0,0,0,264,262,1,0,0,0,265,266,6,41,0,0,266,84,1,
0,0,0,267,268,5,47,0,0,268,269,5,42,0,0,269,273,1,0,0,0,270,272,9,0,0,
0,271,270,1,0,0,0,272,275,1,0,0,0,273,274,1,0,0,0,273,271,1,0,0,0,274,
276,1,0,0,0,275,273,1,0,0,0,276,277,5,42,0,0,277,278,5,47,0,0,278,279,
1,0,0,0,279,280,6,42,0,0,280,86,1,0,0,0,15,0,143,145,152,154,161,163,
169,174,180,187,193,252,262,273,1,6,0,0
};
staticData->serializedATN = antlr4::atn::SerializedATNView(serializedATNSegment, sizeof(serializedATNSegment) / sizeof(serializedATNSegment[0]));
antlr4::atn::ATNDeserializer deserializer;
staticData->atn = deserializer.deserialize(staticData->serializedATN);
const size_t count = staticData->atn->getNumberOfDecisions();
staticData->decisionToDFA.reserve(count);
for (size_t i = 0; i < count; i++) {
staticData->decisionToDFA.emplace_back(staticData->atn->getDecisionState(i), i);
}
sysylexerLexerStaticData = staticData.release();
}
}
SysYLexer::SysYLexer(CharStream *input) : Lexer(input) {
SysYLexer::initialize();
_interpreter = new atn::LexerATNSimulator(this, *sysylexerLexerStaticData->atn, sysylexerLexerStaticData->decisionToDFA, sysylexerLexerStaticData->sharedContextCache);
}
SysYLexer::~SysYLexer() {
delete _interpreter;
}
std::string SysYLexer::getGrammarFileName() const {
return "SysY.g4";
}
const std::vector<std::string>& SysYLexer::getRuleNames() const {
return sysylexerLexerStaticData->ruleNames;
}
const std::vector<std::string>& SysYLexer::getChannelNames() const {
return sysylexerLexerStaticData->channelNames;
}
const std::vector<std::string>& SysYLexer::getModeNames() const {
return sysylexerLexerStaticData->modeNames;
}
const dfa::Vocabulary& SysYLexer::getVocabulary() const {
return sysylexerLexerStaticData->vocabulary;
}
antlr4::atn::SerializedATNView SysYLexer::getSerializedATN() const {
return sysylexerLexerStaticData->serializedATN;
}
const atn::ATN& SysYLexer::getATN() const {
return *sysylexerLexerStaticData->atn;
}
void SysYLexer::initialize() {
::antlr4::internal::call_once(sysylexerLexerOnceFlag, sysylexerLexerInitialize);
}

3780
src/SysYParser.cpp Normal file

File diff suppressed because it is too large Load Diff

9
src/SysYVisitor.cpp Normal file
View File

@ -0,0 +1,9 @@
// Generated from SysY.g4 by ANTLR 4.12.0
#include "SysYVisitor.h"
using namespace antlrSysY;

Binary file not shown.