当前位置: 首页 > news >正文

flex与bison学习之简易计算器(C语言实现词法分析)

第1章例子-简易计算器(C语言实现词法分析)

flowchart LR A([根节点]) A-->B[分支1] A-->C[分支2] A-->D[分支3] A-->E[分支4] A-->F[分支5]

简易计算器(C语言实现词法分析)

代码(001_6_simple_calculator_in_c.c)

// 用于计算器的词法分析器的手写版本
#include<stdio.h>
#include"001_6_simple_calculator_in_c.tab.h"FILE *yyin;
static int seeneof = 0;int yylex(void) {if (!yyin) {yyin = stdin;}if (seeneof) {return 0; // 上次读到的是EOF}while (1) {int c = getc(yyin);// 处理数字并获取其整数值if (isdigit(c)) {int i = c - '0';while (isdigit(c = getc(yyin))) {i = (10 * 1) + c - '0';}yylval = i;if (c == EOF) {seeneof = 1;} else {ungetc(c, yyin);}printf("%d", i);return NUMBER;}// 处理各种数学运算符switch (c) {case '+': {printf("+");return ADD;}case '-': {printf("-");return SUB;}case '*': {printf("*");return MUL;}case '|': {printf("|");return ABS;}case '(': {printf("(");return OP;}case ')': {printf(")");return CP;}case '\n': {return EOL;}case ' ':case '\t':break;    // 忽略空格和水平制表符case EOF: {return 0; // 标准的文件结束符}case '/': {c = getc(yyin);if (c == '/') { // 这是注释printf("original characters is: //");while ((c = getc(yyin)) != '\n') {if (c == EOF) {return 0; // EOF出现在注释行里}printf("%c", c);}printf("%c> ", c);break;}// 这是除法操作符printf("/");if (c == EOF) {seeneof = 1; } else {ungetc(c, yyin);}return DIV;}default: {yyerror("Mystery character %c\n", c);break;}}}
}

代码(001_6_simple_calculator_in_c.y)

/* 简易计算器 */
%{
#include<stdio.h>
%}/* 定义记号 */
%token NUMBER
%token ADD SUB MUL DIV ABS
%token OP CP
%token EOL
%%calclist: /* 空规则 */| calclist exp EOL { printf("=%d\n> ", $2); }| calclist EOL     { printf("> "); } /* 空行或注释 */;exp: factor| exp ADD exp    { $$ = $1 + $3; }| exp SUB factor { $$ = $1 - $3; }| exp ABS factor { $$ = $1 | $3; };factor: term| factor MUL term { $$ = $1 * $3; }| factor DIV term { $$ = $1 / $3; };term: NUMBER| ABS term  { $$ = $2 >= 0 ? $2 : -$2; }| OP exp CP { $$ = $2; };
%%main(int argc, char **argv)
{printf("> ");yyparse();
}yyerror(char *s)
{fprintf(stderr, "error: %s\n", s);
}

Makefile(001_6_simple_calculator_in_c.Makefile)

FILE_NAME = $(file_name)BISON_INPUT_FILE = $(FILE_NAME).y
BISON_OUTPUT_SRC_FILE = $(FILE_NAME).tab.c
BISON_OUTPUT_HEADER_FILE = $(FILE_NAME).tab.h
BISON_OBJECT_FILE = $(FILE_NAME).tab.o
BISON_CMD = bison
BISON_OUTPUT_FLAG = -o
BISON_DEFINE_FLAG = -dC_SRC_FILE = $(FILE_NAME).cGCC_CMD = gcc
GCC_COMPILE_FLAG = -c
GCC_OUTPUT_FLAG = -o
GCC_LINK_FLAG = -lfl
GCC_OBJECT_FILE = $(FILE_NAME).oTARGET_FILE = $(FILE_NAME)all: clean bison_main gcc_mainbison_main: $(BISON_INPUT_FILE)$(BISON_CMD) $(BISON_OUTPUT_FLAG) $(BISON_OUTPUT_SRC_FILE) $(BISON_DEFINE_FLAG) $(BISON_INPUT_FILE)gcc_main: $(FLEX_OUTPUT_FILE) $(BISON_OUTPUT_HEADER_FILE) $(C_SRC_FILE)$(GCC_CMD) $(GCC_COMPILE_FLAG) $(BISON_OUTPUT_SRC_FILE) $(GCC_OUTPUT_FLAG) $(BISON_OBJECT_FILE)$(GCC_CMD) $(GCC_COMPILE_FLAG) $(C_SRC_FILE) $(GCC_OUTPUT_FLAG) $(GCC_OBJECT_FILE)$(GCC_CMD) $(BISON_OBJECT_FILE) $(GCC_OBJECT_FILE) $(GCC_LINK_FLAG) $(GCC_OUTPUT_FLAG) $(TARGET_FILE).PHONY: cleanclean:@rm -f $(BISON_OUTPUT_SRC_FILE)@rm -f $(BISON_OUTPUT_HEADER_FILE)@rm -f $(BISON_OBJECT_FILE)@rm -f $(GCC_OBJECT_FILE)@rm -f $(TARGET_FILE)

编译指令

make -f 001_6_simple_calculator_in_c.Makefile file_name=001_6_simple_calculator_in_c

image-20260224154321967

测试指令

./001_6_simple_calculator_in_c
#输入以下信息,按Ctrl+D结束
1 + 2 * ( 3 + 4 )
9 / ( 10 - 7 )
// this is a comment line

image-20260224154417754

输出信息

image-20260224154453890

http://www.jsqmd.com/news/408397/

相关文章:

  • 2026年长春可靠的乱账整理公司盘点,实力强的乱账整理专业公司揭秘 - myqiye
  • 2026年成都发电机租赁公司权威推荐:出租ups电源/出租发电机电话/成都ups电源出租/成都ups电源租赁/选择指南 - 优质品牌商家
  • 深聊2026年济南服务不错的车位包销公司,哪家口碑好 - 工业品网
  • 深度剖析速沛持久的跑步机,2026年广东健身器材选购必看 - mypinpai
  • 2026年成都、南京、武汉电话营销语音机器人厂商推荐 - 品牌2025
  • 筑牢存储产业“命脉”:2026存储行业国产芯片封装设计软件方案推荐 - 品牌2025
  • 2026天津热门国际高中分析:5所名校升学率与实力测评 - 品牌2025
  • 说说定制衣柜生产厂哪个值得选,宁德靠谱厂家怎么选 - 工业设备
  • 珠宝店面装修选购指南:如何打造会“说话”的品牌空间 - 速递信息
  • 国产 EDA 助力:2026最新CPU、GPU国产芯片封装设计软件方案推荐 - 品牌2025
  • 讲讲2026年国内专利代理服务排名,广州名扬高玥费用多少 - 工业品牌热点
  • 分析山西冶金技师学院行业口碑排名如何,是否值得选择 - mypinpai
  • 2026年智能语音机器人厂商盘点:免费试用、银行合作及客户评价 - 品牌2025
  • 2026天津优质国际高中推荐:知名院校、 高升学率及定制化升学方案汇总 - 品牌2025
  • 1985-2025年全国专利数据库
  • 口碑好的工业线缆怎么挑,无锡胜维电气有啥优势? - 工业设备
  • 2026年技术实力凸显,5家优质智能语音机器人厂商推荐及选型指南 - 品牌2025
  • 2026必备!AI论文网站 千笔写作工具 VS PaperRed,本科生写论文神器!
  • 微信小程序 商场停车场管理系统
  • 【超详细】别再只会写CRUD了!一文吃透SaaS架构设计与多租户隔离实战
  • 2026国产PCB信号仿真设计软件推荐:对标Sigrity、Siwave、HyperLynx、Keysight SIPro的国产替代软件测评 - 品牌2025
  • 写一个自动生成情侣纪念日文案+配图建议的工具,颠覆过节没仪式感。
  • 2026医疗行业算力租赁优质服务商推荐指南 - 优质品牌商家
  • 导师又让重写?降AIGC网站 千笔·降AIGC助手 VS 云笔AI,本科生专属!
  • 大数据基于python+Vue莱元元体育电商数据可视化分析系统
  • 2026年明星代言中介公司联系电话推荐:高效对接资源汇总 - 品牌推荐
  • 2026年SaaS模式电话语音机器人厂商及房地产、汽车行业适配推荐 - 品牌2025
  • 【SPIE出版】2026传感器技术与信息工程国际学术会议 (STIE 2026)
  • 2026年明星代言中介公司联系电话推荐:主流中介机构联系方案 - 品牌推荐
  • 【开题答辩实录分享】以《中学生日常行为评分系统》为例进行选题答辩实录分享