forked from PuqiAR/Fig-TreeWalker
command -v(--version) support. ast typeName method now returns magic_enum::enum_name
This commit is contained in:
@@ -1,3 +0,0 @@
|
|||||||
# Intro
|
|
||||||
|
|
||||||
> Fig is a modern
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
* [Home](/)
|
|
||||||
* [Guide](guide.md "The greatest guide in the world")
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8">
|
|
||||||
<title>The Fig Programming Language</title>
|
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
|
|
||||||
<meta name="description" content="Description">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0">
|
|
||||||
<link rel="stylesheet" href="//cdn.jsdelivr.net/npm/docsify@4/lib/themes/vue.css">
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div id="app">加载中 Loading... 🥰</div>
|
|
||||||
<script>
|
|
||||||
window.$docsify = {
|
|
||||||
loadSidebar: true
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
<!-- Docsify v4 -->
|
|
||||||
<script src="//cdn.jsdelivr.net/npm/docsify@4"></script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
# 简介
|
|
||||||
|
|
||||||
> Fig 是一个现代、简单的语言
|
|
||||||
@@ -52,37 +52,37 @@ namespace Fig::Ast
|
|||||||
ContinueSt,
|
ContinueSt,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const std::unordered_map<AstType, FString> astTypeToString{
|
// static const std::unordered_map<AstType, FString> astTypeToString{
|
||||||
/* Base Class */
|
// /* Base Class */
|
||||||
{AstType::_AstBase, FString(u8"Ast")},
|
// {AstType::_AstBase, FString(u8"Ast")},
|
||||||
{AstType::StatementBase, FString(u8"Statement")},
|
// {AstType::StatementBase, FString(u8"Statement")},
|
||||||
{AstType::ExpressionBase, FString(u8"Expression")},
|
// {AstType::ExpressionBase, FString(u8"Expression")},
|
||||||
/* Expression */
|
// /* Expression */
|
||||||
{AstType::ValueExpr, FString(u8"ValueExpr")},
|
// {AstType::ValueExpr, FString(u8"ValueExpr")},
|
||||||
{AstType::LambdaExpr, FString(u8"LambdaExpr")},
|
// {AstType::LambdaExpr, FString(u8"LambdaExpr")},
|
||||||
{AstType::UnaryExpr, FString(u8"UnaryExpr")},
|
// {AstType::UnaryExpr, FString(u8"UnaryExpr")},
|
||||||
{AstType::BinaryExpr, FString(u8"BinaryExpr")},
|
// {AstType::BinaryExpr, FString(u8"BinaryExpr")},
|
||||||
{AstType::TernaryExpr, FString(u8"TernaryExpr")},
|
// {AstType::TernaryExpr, FString(u8"TernaryExpr")},
|
||||||
|
|
||||||
{AstType::InitExpr, FString(u8"InitExpr")},
|
// {AstType::InitExpr, FString(u8"InitExpr")},
|
||||||
|
|
||||||
/* Statement */
|
// /* Statement */
|
||||||
{AstType::BlockStatement, FString(u8"BlockStatement")},
|
// {AstType::BlockStatement, FString(u8"BlockStatement")},
|
||||||
|
|
||||||
{AstType::VarDefSt, FString(u8"VarSt")},
|
// {AstType::VarDefSt, FString(u8"VarSt")},
|
||||||
{AstType::FunctionDefSt, FString(u8"FunctionDefSt")},
|
// {AstType::FunctionDefSt, FString(u8"FunctionDefSt")},
|
||||||
{AstType::StructSt, FString(u8"StructSt")},
|
// {AstType::StructSt, FString(u8"StructSt")},
|
||||||
{AstType::ImplementSt, FString(u8"ImplementSt")},
|
// {AstType::ImplementSt, FString(u8"ImplementSt")},
|
||||||
|
|
||||||
{AstType::IfSt, FString(u8"IfSt")},
|
// {AstType::IfSt, FString(u8"IfSt")},
|
||||||
{AstType::ElseSt, FString(u8"ElseSt")},
|
// {AstType::ElseSt, FString(u8"ElseSt")},
|
||||||
{AstType::ElseIfSt, FString(u8"ElseIfSt")},
|
// {AstType::ElseIfSt, FString(u8"ElseIfSt")},
|
||||||
{AstType::VarAssignSt, FString(u8"VarAssignSt")},
|
// {AstType::VarAssignSt, FString(u8"VarAssignSt")},
|
||||||
{AstType::WhileSt, FString(u8"WhileSt")},
|
// {AstType::WhileSt, FString(u8"WhileSt")},
|
||||||
{AstType::ReturnSt, FString(u8"ReturnSt")},
|
// {AstType::ReturnSt, FString(u8"ReturnSt")},
|
||||||
{AstType::BreakSt, FString(u8"BreakSt")},
|
// {AstType::BreakSt, FString(u8"BreakSt")},
|
||||||
{AstType::ContinueSt, FString(u8"ContinueSt")},
|
// {AstType::ContinueSt, FString(u8"ContinueSt")},
|
||||||
};
|
// };
|
||||||
|
|
||||||
struct AstAddressInfo
|
struct AstAddressInfo
|
||||||
{
|
{
|
||||||
@@ -111,7 +111,9 @@ namespace Fig::Ast
|
|||||||
|
|
||||||
virtual FString typeName()
|
virtual FString typeName()
|
||||||
{
|
{
|
||||||
return astTypeToString.at(type);
|
return FString::fromStringView(
|
||||||
|
FStringView::fromBasicStringView(magic_enum::enum_name(type))
|
||||||
|
);
|
||||||
}
|
}
|
||||||
virtual FString toString()
|
virtual FString toString()
|
||||||
{
|
{
|
||||||
|
|||||||
18
src/main.cpp
18
src/main.cpp
@@ -71,7 +71,12 @@ int main(int argc, char **argv)
|
|||||||
{
|
{
|
||||||
argparse::ArgumentParser program("Fig Interpreter", Fig::Core::VERSION.data());
|
argparse::ArgumentParser program("Fig Interpreter", Fig::Core::VERSION.data());
|
||||||
program.add_argument("source")
|
program.add_argument("source")
|
||||||
.help("source file to be interpreted");
|
.help("source file to be interpreted")
|
||||||
|
.default_value(std::string(""));
|
||||||
|
program.add_argument("-v", "--version")
|
||||||
|
.help("get the version of Fig Interpreter")
|
||||||
|
.default_value(false)
|
||||||
|
.implicit_value(true);
|
||||||
// interpreter
|
// interpreter
|
||||||
|
|
||||||
try
|
try
|
||||||
@@ -83,8 +88,17 @@ int main(int argc, char **argv)
|
|||||||
std::cerr << e.what() << '\n';
|
std::cerr << e.what() << '\n';
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
if (program.get<bool>("--version"))
|
||||||
|
{
|
||||||
|
std::print("Fig Interpreter version {}\n", Fig::Core::VERSION);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
Fig::FString sourcePath(program.get<std::string>("source"));
|
Fig::FString sourcePath(program.get<std::string>("source"));
|
||||||
|
if (sourcePath.empty())
|
||||||
|
{
|
||||||
|
std::cerr << "No source file provided.\n";
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
std::ifstream file(sourcePath.toBasicString());
|
std::ifstream file(sourcePath.toBasicString());
|
||||||
if (!file.is_open())
|
if (!file.is_open())
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user