Linux C编译器从零开发二

自定义分词器
test.c
#include <ctype.h>
#include <stdarg.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>typedef enum {TK_PUNCT, // PunctuatorsTK_NUM,   // Numeric literalsTK_EOF,   // End-of-file markers
} TokenKind;// Token type
typedef struct Token Token;
struct Token {TokenKind kind; // Token kindToken *next;    // Next tokenint val;        // If kind is TK_NUM, its valuechar *loc;      // Token locationint len;        // Token length
};// Input string
static char *current_input;// Reports an error and exit.
static void error(char *fmt, ...) {va_list ap;va_start(ap, fmt);vfprintf(stderr, fmt, ap);fprintf(stderr, "\n");exit(1);
}// Reports an error location and exit.
static void verror_at(char *loc, char *fmt, va_list ap) {int pos = loc - current_input;fprintf(stderr, "%s\n", current_input);fprintf(stderr, "%*s", pos, ""); // print pos spaces.fprintf(stderr, "^ ");vfprintf(stderr, fmt, ap);fprintf(stderr, "\n");exit(1);
}static void error_at(char *loc, char *fmt, ...) {va_list ap;va_start(ap, fmt);verror_at(loc, fmt, ap);
}static void error_tok(Token *tok, char *fmt, ...) {va_list ap;va_start(ap, fmt);verror_at(tok->loc, fmt, ap);
}// Consumes the current token if it matches `s`.
static bool equal(Token *tok, char *op) {return memcmp(tok->loc, op, tok->len) == 0 && op[tok->len] == '\0';
}// Ensure that the current token is `s`.
static Token *skip(Token *tok, char *s) {if (!equal(tok, s))error_tok(tok, "expected '%s'", s);return tok->next;
}// Ensure that the current token is TK_NUM.
static int get_number(Token *tok) {if (tok->kind != TK_NUM)error_tok(tok, "expected a number");return tok->val;
}// Create a new token.
static Token *new_token(TokenKind kind, char *start, char *end) {Token *tok = calloc(1, sizeof(Token));tok->kind = kind;tok->loc = start;tok->len = end - start;return tok;
}// Tokenize `current_input` and returns new tokens.
static Token *tokenize(void) {char *p = current_input;Token head = {};Token *cur = &head;while (*p) {// Skip whitespace characters.if (isspace(*p)) {p++;continue;}// Numeric literalif (isdigit(*p)) {cur = cur->next = new_token(TK_NUM, p, p);char *q = p;cur->val = strtoul(p, &p, 10);cur->len = p - q;continue;}// Punctuatorif (*p == '+' || *p == '-') {cur = cur->next = new_token(TK_PUNCT, p, p + 1);p++;continue;}error_at(p, "invalid token");}cur = cur->next = new_token(TK_EOF, p, p);return head.next;
}int main(int argc, char **argv) {if (argc != 2)error("%s: invalid number of arguments", argv[0]);current_input = argv[1];Token *tok = tokenize();printf("  .globl main\n");printf("main:\n");// The first token must be a numberprintf("  mov $%d, %%rax\n", get_number(tok));tok = tok->next;// ... followed by either `+ <number>` or `- <number>`.while (tok->kind != TK_EOF) {if (equal(tok, "+")) {printf("  add $%d, %%rax\n", get_number(tok->next));tok = tok->next->next;continue;}tok = skip(tok, "-");printf("  sub $%d, %%rax\n", get_number(tok));tok = tok->next;}printf("  ret\n");return 0;
}
 编译
cc -o test test.c
./test "1 +2  +3"  > tmp.s
cc -o tmp tmp.s
./tmp
echo $?
错误处理

./test "1 + 2 * +3"  > tmp.s
1 + 2 * +3
      ^ invalid token


创作不易,小小的支持一下吧!

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

手把手带你搞定用户权限控制 | 纯干货

在实际的软件项目开发过程中&#xff0c;用户权限控制可以说是所有运营系统中必不可少的一个重点功能&#xff0c;根据业务的复杂度&#xff0c;设计的时候可深可浅&#xff0c;但无论怎么变化&#xff0c;设计的思路基本都是围绕着用户、角色、菜单这三个部分展开。 如何设计…

RAG工作流在高效信息检索中的应用

介绍 RAG&#xff08;Retrieval Augmented Generation&#xff09;是一种突破知识限制、整合外部数据并增强上下文理解的方法。 由于其高效地整合外部数据而无需持续微调&#xff0c;RAG的受欢迎程度正在飙升。 让我们来探索RAG如何克服LLM的挑战&#xff01; LLM知识限制大…

简单的心电图信号分割方法

代码很简单&#xff0c;很容易看懂。 import pandas as pdimport matplotlib.pyplot as plt #headers [Name, Age, Marks]df pd.read_csv(samples-folder/samples2.csv) dfdf.drop(0)dfdf.drop(1)# print(df) if(len(df.columns) 3): df.columns [sample interval, sig…

自定义注解获取属性对应枚举的翻译值

平时在开发的时候难免会遇到枚举来翻译类&#xff0c;于是写一个自定义注解来在开发的时候自动翻译枚举的值 相关代码如下&#xff1a; Target(ElementType.FIELD) Retention(RetentionPolicy.RUNTIME) Documented JacksonAnnotationsInside public interface EnumShow {/*** …

web错题(1)

action属性是form标签的必须属性&#xff0c;用于指定表单提交时表单数据将被发往哪里 dir能够指定文本显示方向的属性 可以产生下拉列表的标记时<select> multiple属性设为true&#xff0c;表示输入字段可以选择多个值 lable标签的for属性可以把lable绑定到另一个元…

meilisearch,老版本的文档

Elasticsearch 做为老牌搜索引擎&#xff0c;功能基本满足&#xff0c;但复杂&#xff0c;重量级&#xff0c;适合大数据量。 MeiliSearch 设计目标针对数据在 500GB 左右的搜索需求&#xff0c;极快&#xff0c;单文件&#xff0c;超轻量。 所以&#xff0c;对于中小型项目来说…

Unity 之通过自定义协议从浏览器启动本地应用程序

内容将会持续更新&#xff0c;有错误的地方欢迎指正&#xff0c;谢谢! Unity 之通过自定义协议从浏览器启动本地应用程序 TechX 坚持将创新的科技带给世界&#xff01; 拥有更好的学习体验 —— 不断努力&#xff0c;不断进步&#xff0c;不断探索 TechX —— 心探索、心进…

PHP框架详解- symfony框架

GPT-4 (OpenAI) Symfony 是一个用 PHP 语言编写的开放源代码的 web 应用框架。Symfony 提供了一组可重用的组件和一个标准化、可扩展的框架&#xff0c;用于构建 web 应用、API、微服务等。它跟其他流行 PHP 框架&#xff08;比如 Laravel&#xff09;一样&#xff0c;旨在加快…

Servlet接口实现

项目搭建 pom文件引入依赖与打包配置。 <dependencies><!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId>…

java:spring actuator添加自定义endpoint

# 项目代码资源&#xff1a; 可能还在审核中&#xff0c;请等待。。。 https://download.csdn.net/download/chenhz2284/89437274 # 项目代码 【pom.xml】 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId&…

探索C嘎嘎的奇妙世界:第四关---引用与内联函数

1 引用: 引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&#xff0c;编译器不会为引用变量开辟内存空间&#xff0c;它和它引用的变量共用同一块内存空间。 #include<iostream> using namespace std;int main() {int a 0;// 引用&#xff1a;…

分数计算 初级题目

今天继续更题。今天的题目是《第五单元 分数的加减法》初级题目。 定位&#xff1a;题目较为初级&#xff0c;适合预习 参考答案&#xff1a;CACCADACAABACBBCDBCB

Linux文本处理三剑客+正则表达式

Linux文本处理常用的3个命令&#xff0c;脚本或者文本处理任务中会用到。这里做个整理。 三者的功能都是处理文本&#xff0c;但侧重点各不相同&#xff0c;grep更适合单纯的查找或匹配文本&#xff0c;sed更适合编辑匹配到的文本&#xff0c;awk更适合格式化文本&#xff0c;对…

【数据结构】第十六弹---C语言实现希尔排序

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1、希尔排序( 缩小增量排序 ) 1.1、预排序实现 1.2、希尔排序代码实现 1.3、代码测试 1.4、时空复杂度分析 1.5、性能比较 总结 上一弹我们…

2024年【四川省安全员C证】考试题及四川省安全员C证考试资料

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 四川省安全员C证考试题是安全生产模拟考试一点通总题库中生成的一套四川省安全员C证考试资料&#xff0c;安全生产模拟考试一点通上四川省安全员C证作业手机同步练习。2024年【四川省安全员C证】考试题及四川省安全员…

SUSTAINABILITY,SCIESSCI双检期刊还能投吗?

本期&#xff0c;小编给大家介绍的是一本MDPI出版社旗下SCIE&SSCI双检“毕业神刊”——SUSTAINABILITY。据悉&#xff0c;早在2024年1月&#xff0c;ElSEVIER旗下的Scopus数据库已暂停收录检索期刊SUSTAINABILITY所发表文章&#xff0c;同时重新评估是否继续收录该期刊。随…

Carsim高级开发:VS Connect通讯开发指南

文章目录 前言一、VS Connect 概念引入二、VS Connect 通讯框架三、Carsim 工程配置1、车辆模型配置2、procedure配置3、Run Control配置4、受控车辆名称配置 四、VS Connect Server代码1、打开Sln工程2、代码修改 五、VS Connect Client代码1、函数的调用关系2、carsim_variab…

BetterZip 5软件安装包下载+安装教程

BetterZip是一款功能强大的Mac解/压缩软件&#xff0c;可以满足用户对文件压缩、解压、加密和保护等方面的需求。以下是关于BetterZip软件的主要功能、特点和使用方法的详细介绍&#xff0c;以及对其用户友好度、稳定性和安全性的评价。 安 装 包 获 取 地 址: BetterZip 5-安…

配置完eslint没有用?

当你使用 npx eslint --init 生成配置文件后 你也配置好了.prettierrc 当你在代码写一点小问题的时候 发现eslint没有进行检查 原因是你生成的 .eslintrc.js中没有加上这个配置 extends: [.....plugin:prettier/recommended],加上以后重启vscode你会发现

基于flask的网站如何使用https加密通信-问题记录

文章目录 项目场景&#xff1a;问题1问题描述原因分析解决步骤解决方案 问题2问题描述原因分析解决方案 参考文章 项目场景&#xff1a; 项目场景&#xff1a;基于flask的网站使用https加密通信一文中遇到的问题记录 问题1 问题描述 使用下面的命令生成自签名的SSL/TLS证书和…