方舟编译器源码分析(三)

2021SC@SDUSC

 今天分析的是src/mapleall/maple_driver/src/as_compiler.cpp ·中as_compiler.cpp.

该c++文件包含了include文件中compiler.h 和file_utils.h两个头文件。

compiler.h中定义了诸多string类型的常量。

const std::string kBinNameNone = "";
const std::string kBinNameJbc2mpl = "jbc2mpl";
const std::string kBinNameCpp2mpl = "mplfe";
const std::string kBinNameClang = "clang";
const std::string kBinNameDex2mpl = "dex2mpl";
const std::string kBinNameMplipa = "mplipa";
const std::string kBinNameMe = "me";
const std::string kBinNameMpl2mpl = "mpl2mpl";
const std::string kBinNameMplcg = "mplcg";
const std::string kBinNameMapleComb = "maplecomb";
const std::string kBinNameLd = "ld";
const std::string kMachine = "aarch64-";
const std::string kVendor = "unknown-";
const std::string kOperatingSystem = "linux-gnu-";
const std::string kGccFlag = "gcc";
const std::string kGppFlag = "g++";
const std::string kAsFlag = "as";
const std::string kBinNameAs = kMachine + kOperatingSystem + kAsFlag;
const std::string kBinNameGcc = kMachine + kOperatingSystem + kGccFlag;
const std::string kBinNameGpp = kMachine + kOperatingSystem + kGppFlag;
std::string AsCompiler::GetBinPath(const MplOptions&) const {
#ifdef ANDROID
  return "prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin/";
#else
  return std::string(std::getenv(kMapleRoot)) + "/tools/gcc-linaro-7.5.0/bin/";
#endif
}

首先判断是否为安卓设备,返回一个string类型的路径。

const std::string &AsCompiler::GetBinName() const {
  return kBinNameAs;
}

DefaultOption AsCompiler::GetDefaultOptions(const MplOptions&) const {
  DefaultOption defaultOptions = { nullptr, 0 };
  return defaultOptions;
}

std::string AsCompiler::GetInputFileName(const MplOptions &options) const {
  return options.GetOutputFolder() + options.GetOutputName() + ".s";
}

void AsCompiler::GetTmpFilesToDelete(const MplOptions &mplOptions, std::vector<std::string> &tempFiles) const {
  tempFiles.push_back(mplOptions.GetOutputFolder() + mplOptions.GetOutputName() + ".o");
}

std::unordered_set<std::string> AsCompiler::GetFinalOutputs(const MplOptions &mplOptions) const {
  auto finalOutputs = std::unordered_set<std::string>();
  (void)finalOutputs.insert(mplOptions.GetOutputFolder() + mplOptions.GetOutputName() + ".o");
  return finalOutputs;
}
const std::string &AsCompiler::GetBinName() const {
  return kBinNameAs;
}

getBinName()方法,返回在compiler.h中定义的常量kBinNameAs

DefaultOption AsCompiler::GetDefaultOptions(const MplOptions&) const {
  DefaultOption defaultOptions = { nullptr, 0 };
  return defaultOptions;
}

getDefaultOptions()方法,传入一个MplOptions类型的变量,定义一个key为nullptr,length为0的DefaultOption型变量defaultOptions,返回defaultOptions。

std::string AsCompiler::GetInputFileName(const MplOptions &options) const {
  return options.GetOutputFolder() + options.GetOutputName() + ".s";
}

getInputFileName()方法,传入一个MplOptions类型的变量options,调用MplOptions类的方法getOutputFolder()和getOutputName()。返回一个string类型的变量。

void AsCompiler::GetTmpFilesToDelete(const MplOptions &mplOptions, std::vector<std::string> &tempFiles) const {
  tempFiles.push_back(mplOptions.GetOutputFolder() + mplOptions.GetOutputName() + ".o");
}

getTmpFilesToDelete()方法,传入一个MplOptions类型的变量mplOptions以及一个string类型的向量tempFiles,对于mplOptions,调用MplOptions类的方法getOutputFolder()和getOutputName(),与“.o”构成字符串,添加到tempFiles。

std::unordered_set<std::string> AsCompiler::GetFinalOutputs(const MplOptions &mplOptions) const {
  auto finalOutputs = std::unordered_set<std::string>();
  (void)finalOutputs.insert(mplOptions.GetOutputFolder() + mplOptions.GetOutputName() + ".o");
  return finalOutputs;
}

getFinalOutputs()方法,传入一个MplOptions类型的变量mplOptions,定义一个无序set容器finalOutputs,对于mplOptions,调用MplOptions类的方法getOutputFolder()和getOutputName(),与“.o”构成字符串,添加到finalOutputs。返回finalOutputs。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这个编译器的源代码是我原先为了完成编译原理实验课作业而写的,所以只具有教学价值,现在发出来和大家共享 ;-)<br/><br/>和网上流传的版本不同,它从文法开始,一直做到了符号表的实现. 想实现自己的编译器的话,只需在把Initializtion.h中的文法修改为自己的即可.<br/><br/>工程结构:<br/>Initializtion.h 初始化文法,便于进一步进行分析,它为构造GRAMMAR类提供了信息.其中默认非终极符用<>括上,修改时需要注意.<br/>Grammar.cpp Grammar.h 定义了文法GRAMMAR类,它通过initializtion.h的信息建立文法的内部表示。<br/>LL1_Analyser.cpp LL1_Analyser.h 定义了LL1分析器,即LL1_Analyser类.<br/>LL1_Recognizer.cpp LL1_Recognizer.h 为LL1语法分析驱动器,可以通过文法,TOKEN序列和LL1分析表,判定语法是否正确,同时驱动动作.<br/>Rec_Parse.cpp Rec_Pares.h 实现了递归下降分析器Rec_Parse类, 递归下降的思想和LL1驱动器一样,不过是把压栈改成调用自己,而把弹栈改成返回.<br/>Scanner.cpp Scanner.h 实现了词法分析器,可以将程序变为TOKEN序列. 扫描的源程序文件路径也在这里被定义(默认为.//demo.txt)<br/>Action.cpp Action.h 实现了语义栈的操作,_Action类定义了动作符号所对应的动作.<br/>SymTable.cpp SymTable.h 实现了符号表的建立和输出.<br/><br/>希望大家能通过该程序对STL和编译原理有更深刻的理解,Have Fun and Good Luck!<br/><br/> -- David.Morre
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值