LLVM-编译器结构

一:前端

#include <iostream>
#include <algorithm>
#include "llvm/ADT/StringRef.h"
#include "llvm/Support/MemoryBuffer.h"class Lexer;class Token{friend class Lexer;
public:enum TokenKind: unsigned short{eoi, //end of inputunknown, //error of inputident, //[a-zA-Z]number,//[0-9]comma, //,colon, //:plus, //+minus, //-start, //'*'slash, //'/'l_paren, //'('r_paren, //')'KW_with, //with};
private:TokenKind  Kind;llvm::StringRef Text;
public:TokenKind getKind() const {return Kind; }llvm::StringRef getText() const {return Text; }bool is(TokenKind K) const {return Kind ==K; }bool isOneOf(TokenKind K1, TokenKind K2) const {return is(K1) || is(K2); }template<typename... Ts> bool isOneOf(TokenKind K1, TokenKind K2, Ts... Ks) const { return is(K1)||isOneof(K2, Ks...);}
};class Lexer{const char *BufferStart;const char *BufferPtr;public:Lexer(const llvm::StringRef &Buffer) {BufferStart = Buffer.begin();BufferPtr = BufferStart;}void next(Token &token){while(*BufferPtr != '\0' && std::iswspace(*BufferPtr)){++BufferPtr;}if(!*BufferPtr){token.Kind = Token::eoi;return;}if(std::isalpha(*BufferPtr)){const char *end = BufferPtr + 1;while(std::isalpha(*end)){++end;}llvm::StringRef Name(BufferPtr, end - BufferPtr);Token::TokenKind kind = Name == "with" ? Token::KW_with : Token::ident;fromToken(token, end, kind);return;}else if (std::isdigit(*BufferPtr)){const char *end = BufferPtr + 1;while(std::isdigit(*end)){++end;}fromToken(token, end, Token::number);return;}else {switch(*BufferPtr){case ',': token.Kind = Token::comma; break;case ':': token.Kind = Token::colon; break;case '+': token.Kind = Token::plus; break;case '-': token.Kind = Token::minus; break;case '*': token.Kind = Token::start; break;case '/': token.Kind = Token::slash; break;case '(': token.Kind = Token::l_paren; break;case ')': token.Kind = Token::r_paren; break;default: token.Kind = Token::unknown; break;}fromToken(token, BufferPtr + 1, token.Kind);return;}}
private:void fromToken(Token &Result, const char *TokenEnd, Token::TokenKind Kind){Result.Kind = Kind;Result.Text = llvm::StringRef(BufferPtr, TokenEnd - BufferPtr);BufferPtr = TokenEnd;}
};int main()
{/*with a, b: a * (4 + b)with a: a * 3*/std::cout << "Welcome to the " << __FILE__ <<std::endl;
}//CMakeLists.txt 
/*
cmake_minimum_required(VERSION 3.16.0)set(NAME "learn_llvm")
project(${NAME})set(CMAKE_CXX_STANDARD 20) # this does nothing for MSVC, use target_compile_options below
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS ON)
set(CMAKE_BUILD_TYPE Debug)find_package(LLVM REQUIRED CONFIG)message(STATUS "Found LLVM ${LLVM_PACKAGE_VERSION}")
message(STATUS "Using LLVMConfig.cmake in: ${LLVM_DIR}")# Set your project compile flags.
# E.g. if using the C++ header files
# you will need to enable C++11 support
# for your compiler.include_directories(${LLVM_INCLUDE_DIRS})
message(STATUS ${LLVM_INCLUDE_DIRS})
separate_arguments(LLVM_DEFINITIONS_LIST NATIVE_COMMAND ${LLVM_DEFINITIONS})
add_definitions(${LLVM_DEFINITIONS_LIST})# Now build our tools
set(SOURCE main.cpp)
add_executable(${NAME} ${SOURCE})# Find the libraries that correspond to the LLVM components
# that we wish to use
llvm_map_components_to_libnames(llvm_libs support core irreader)# Link against LLVM libraries
target_link_libraries(${NAME} ${llvm_libs})
*/

二:中端

三:后端

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/39447.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【0299】Postgres内核之哈希表(Hash Tables)

0. 哈希表(Hash Tables) 哈希表是 一种用于存储键值对的数据结构。与使用索引号访问元素的基本数组不同,哈希表使用键来查找表条目。这使得数据管理对于用户来说更易于管理,因为按属性对数据条目进行分类比按它们在一个巨大的列表中的数量更容易。 在 C++ 中,我们将哈希…

B站大课堂-自动化精品视频(个人存档)

基础知识 工业通信协议 Modbus 施耐德研发&#xff0c;有基于以太网的 ModbusTCP 协议和使用 485/232 串口通信的 ModbusRTU/ASCII。 Modbus 协议面世较早、协议简洁高效、商用免费、功能灵活、实现简单&#xff0c;是目前应用最广泛的现场总线协议。 我的笔记里边有一些推荐…

89.格雷编码

题目描述 89. 格雷编码 n 位格雷码序列 是一个由 2n 个整数组成的序列&#xff0c;其中&#xff1a; 每个整数都在范围 [0, 2n - 1] 内&#xff08;含 0 和 2n - 1&#xff09;第一个整数是 0一个整数在序列中出现 不超过一次每对 相邻 整数的二进制表示 恰好一位不同 &…

【error】针对Windows 11家庭版用户启用组策略编辑器

启用组策略编辑器&#xff1a; 如果使用的是Windows 11家庭版&#xff0c;可以通过以下步骤启用组策略编辑器&#xff1a; 新建一个文本文件&#xff0c;将扩展名改为**.bat**&#xff08;如EnableGPEdit.bat&#xff09;。 在文件中输入以下批处理代码&#xff08;根据系统实际…

Linux源码阅读笔记10-进程NICE案例分析2

set_user_nice set_user_nice函数功能&#xff1a;设置某一进程的NICE值&#xff0c;其NICE值的计算是根据进程的静态优先级&#xff08;task_struct->static_prio&#xff09;&#xff0c;直接通过set_user_nice函数更改进程的静态优先级。 内核源码 void set_user_nice…

wpf界面和net web界面的相同和不同点

WPF&#xff08;Windows Presentation Foundation&#xff09;界面和.NET Web界面的相同点和不同点可以从多个维度来进行分析和归纳。以下是对这两个界面技术的详细比较&#xff1a; 相同点 .NET框架支持&#xff1a; WPF和.NET Web界面&#xff08;如ASP.NET&#xff09;都构建…

黄子韬vs徐艺洋卫生间风波

【热搜爆点】黄子韬VS徐艺洋&#xff1a;卫生间风波背后的职场与友情界限探讨在这个充满欢笑与意外的综艺时代&#xff0c;《跟我出游吧》再次以它独有的魅力&#xff0c;引爆了一个既尴尬又引人深思的话题——“黄子韬要上徐艺洋的卫生间&#xff1f;”这不仅仅是一句简单的调…

汽车IVI中控开发入门及进阶(三十四):i.MX linux BSP

开发板: 汽车IVI中控开发入门及进阶(三十三):i.MX linux开发之开发板-CSDN博客 linux 开发项目: 汽车IVI中控开发入门及进阶(三十二):i.MX linux开发之Yocto-CSDN博客 前言: 有了开发板,linux BSP编译项目yocto,接下来就可以在i.MX平台上构建和安装i.MX Linux …

[Labview] Excel读表 输出表单中选中的单元格内容

简而言之 循环外 是读取excel文件&#xff0c;并写入labview表格 循环内 会输出表格中被选中的单元格内容 调用节点&#xff1a;点到行列 事件结构中的另两个事件 如果需要改写单元格内容并储存替换Excel&#xff0c;可见这篇&#xff1a;[Labview] 改写表格内容并储存覆盖Ex…

k8s 中间件

1. zookeeper 是的&#xff0c;Zookeeper 和 Kafka 经常一起使用&#xff0c;Zookeeper 在 Kafka 中扮演了关键角色。以下是 Zookeeper 和 Kafka 在实际项目中的结合使用及其作用的详细说明。 项目背景 假设我们有一个分布式数据处理系统&#xff0c;该系统需要高吞吐量的实…

Java知识点整理 17 — 消灭魔法值

一. 什么是魔法值 魔法值通常是指在编写代码时凭空出现的数字或字符串&#xff0c;如果没有注释&#xff0c;无法直接判断其代表的含义&#xff0c;必须通过分析代码上下文才能明白。 魔法值会严重降低代码可读性与可维护性。在一个周期相对较长的项目中&#xff0c;很可能后…

隐私信息管理体系认证:守护个人信息,筑牢隐私防线

在数字化浪潮汹涌的当下&#xff0c;个人信息安全问题愈发凸显其重要性。随着互联网技术的飞速发展&#xff0c;我们的隐私信息如同裸露在阳光下的沙滩&#xff0c;稍有不慎就可能被不法分子窃取或滥用。因此&#xff0c;构建一个完善的隐私信息管理体系&#xff0c;成为了保障…

UI(四)布局

文章目录 10、Navigator——路由器组件11、Pannel——可滑动面板12、Refresh——刷新组件13、RelativeContainer——相对布局组件14、Scroll——可滚动容器15、SideBarContainer——侧边栏容器16、Stack——堆叠容器17、Swiper——滑动块视图容器18、Tabs和TabContent——页签和…

vue为啥监听不了@scroll

哈喽 大家好 我在vue中写了一个滚动scroll监听事件 然后滚动鼠标 发现进不来我的方法断点 原因&#xff1a; 事件绑定错误&#xff1a;确保你使用scroll正确绑定到了可滚动容器上。 事件冒泡&#xff1a;滚动事件可能被封装在某些组件内部&#xff0c;导致不会冒泡到父元素上…

鸿蒙开发Ability Kit(程序访问控制):【使用粘贴控件】

使用粘贴控件 粘贴控件是一种特殊的系统安全控件&#xff0c;它允许应用在用户的授权下无提示地读取剪贴板数据。 在应用集成粘贴控件后&#xff0c;用户点击该控件&#xff0c;应用读取剪贴板数据时不会弹窗提示。可以用于任何应用需要读取剪贴板的场景&#xff0c;避免弹窗…

Android中的适配器,你知道是做什么的吗?

&#x1f604;作者简介&#xff1a; 小曾同学.com,一个致力于测试开发的博主⛽️&#xff0c;主要职责&#xff1a;测试开发、CI/CD&#xff0c;日常还会涉及Android开发工作。 如果文章知识点有错误的地方&#xff0c;还请大家指正&#xff0c;让我们一起学习&#xff0c;一起…

时间复利效应才是人生的催化剂

在追求成功的道路上&#xff0c;许多人都在寻找捷径。然而&#xff0c;真正的捷径并非不劳而获的幻想&#xff0c;而是通过长期坚持在某一领域深耕细作&#xff0c;享受时间复利效应带来的巨大收益。本文将探讨如何选择合适的领域并长期坚持下去&#xff0c;以实现成功。 时间…

DpEasy社区版1.4.1 | 针对托管账号进行功能完善

DpEasy 数据库特权账号管理平台社区版 1.4.1 已上线&#xff01; 本次版本&#xff0c;主要针对托管账号做了新增功能和部分优化。具体如下&#xff1a; | 支持密码纠正 当出现 DpEasy 平台上的托管账号密码与实际账号密码不一致的情况&#xff0c;可以通过「密码纠正」进行…

如何养成爱自己的习惯:吸引世间美好,改变命运

在这个快节奏、高压力的时代&#xff0c;我们常常被各种事务所困扰&#xff0c;内心难以得到真正的宁静。然而&#xff0c;古老的智慧告诉我们&#xff0c;“静”是宇宙万物的根源&#xff0c;是生命恢复的根本。本文将探讨如何养成“静”的习惯&#xff0c;从而吸引世间美好&a…

Elasticsearch集群部署(上)

目录 前言 一. 环境准备 二. 实施部署 三. 安装配置head监控插件 &#xff08;只在第一台es部署&#xff09; 四. Kibana部署&#xff08;当前还是在第一台es部署&#xff09; 五. 安装配置Nginx反向代理 六. Logstash部署与测试 前言 1. Elasticsearch&#xff1a; 是…