iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言设计实现扫描器的自动机的示例详解
  • 663
分享到

C语言设计实现扫描器的自动机的示例详解

C语言实现扫描器C语言扫描器 2022-12-28 12:12:47 663人浏览 八月长安
摘要

目录题目内容思路代码题目内容 内容: 1.设计扫描器的自动机; 2.设计翻译、生成Token的算法; 3.编写代码并上机调试运行通过。 要求: 扫描器可识别的单词包括:关键字、界符、

题目内容

内容:

1.设计扫描器的自动机;

2.设计翻译、生成Token的算法

3.编写代码并上机调试运行通过。

要求:

扫描器可识别的单词包括:关键字、界符、标识符和常整型数。

其中关键字表、界符表、标识符表、常整数表如下:

关键字表K(1int 2void 3break 4float 5while 6do 7struct 8coust 9case 10for 11return 12if 13Default 14else)

界符表 P(1 - 2 / 3 ( 4 ) 5 -- 6<= 7< 8+ 9* 10> 11= 12, 13; 14++ 15 { 16 } 17 ' 18 " )

标识符表I (1 2 3 4 5 6 7 8 9 10 11 12 13 14)

常整数表C(1 2 3 4 5 6 7 8 9 10 11 12 13 14)

【输入形式】

源程序文件。

【输出形式】

(1)相应单词的Token序列;

(2)标识符表,常数表。

测试用例1】

输入:x10=x+y1*120+10;

输出:

Token序列:(I 1)(P 11)等等

标识符表:x10 x y1

常数表:120 10

思路

题目中的输出形式是:(1)相应单词的Token序列;(2)标识符表,常数表。因此,我们可以在上述代码中调整输出的格式。

对于 Token 序列的输出,我们可以将其格式化为如下形式:

Token序列:(<单词种类>, <单词内容>)

例如:(KEYWord, int)(IDENTIFIER, x)(DELIMITER, =)(INTEGER, 10)

对于标识符表和常整数表的输出,我们可以将其格式化为如下形式:

标识符表: x y

常整数表: 10 20

为了实现这种输出格式,我们可以在输出 Token 序列之后,再输出标识符表和常整数表。

代码

#include <stdio.h>
#include <string.h>
#include <ctype.h>
 
// 定义单词种类
typedef enum {
  KEYWORD,   // 关键字
  DELIMITER, // 界符
  IDENTIFIER,// 标识符
  INTEGER    // 常整型数
} TokenType;
 
// 关键字表
char *keywords[] = {
  "int", "void", "break", "float", "while", "do",
  "struct", "const", "case", "for", "return", "if",
  "default", "else"
};
 
// 界符表
char delimiters[] = {
  '-', '/', '(', ')', '--', '<=', '<', '+', '*', '>',
  '=', ',', ';', '++', '{', '}', '\'', '"'
};
 
// 标识符表
char *identifiers[100];
int identifier_count = 0;
 
// 常整数表
int integers[100];
int integer_count = 0;
 
// Token 序列
struct Token {
  TokenType type; // 单词种类
  char *lexeme;   // 单词内容
  int value;      // 单词值
} tokens[100];
int token_count = 0;
 
// 读入的源程序
char source[100];
int source_pos = 0;
 
// 读入下一个字符
char get_char() {
  return source[source_pos++];
}
 
// 跳过空白符
void skip_space() {
  while (isspace(source[source_pos])) source_pos++;
}
 
// 读入单词
void get_token() {
  skip_space();
 
  char ch = get_char();
 
  // 如果是字母,则读入单词
  if (isalpha(ch)) {
    int lexeme_pos = 0;
    char lexeme[100];
    while (isalpha(ch) || isdigit(ch)) {
      lexeme[lexeme_pos++] = ch;
      ch = get_char();
    }
    lexeme[lexeme_pos] = '\0';
    source_pos--; // 将最后读入的非字母或数字字符放回去
 
    // 判断是否为关键字
for (int i = 0; i < 14; i++) {
if (strcmp(keywords[i], lexeme) == 0) {
tokens[token_count].type = KEYWORD;
tokens[token_count].lexeme = lexeme;
token_count++;
return;
}
}
 
 
// 如果不是关键字,则加入标识符表
identifiers[identifier_count] = lexeme;
tokens[token_count].type = IDENTIFIER;
tokens[token_count].lexeme = lexeme;
tokens[token_count].value = identifier_count;
identifier_count++;
token_count++;
return;
}
 
// 如果是数字,则读入常整数
if (isdigit(ch)) {
int value = 0;
while (isdigit(ch)) {
value = value * 10 + (ch - '0');
ch = get_char();
}
source_pos--; // 将最后读入的非数字字符放回去
 
 
// 加入常整数表
integers[integer_count] = value;
tokens[token_count].type = INTEGER;
tokens[token_count].value = value;
integer_count++;
token_count++;
return;
}
 
// 如果是界符,则读入界符
for (int i = 0; i < 18; i++) {
if (delimiters[i] == ch) { 
// 加入 Token 序列
tokens[token_count].type = DELIMITER;
tokens[token_count].lexeme = ch;
token_count++;
return;
}
}
}
 
int main() {
// 读入源程序
scanf("%s", source);
 
// 读入 Token 序列
while (source_pos < strlen(source)) {
get_token();
}
 
// 输出 Token 序列
for (int i = 0; i < token_count; i++) {
if (tokens[i].type == KEYWORD) {
printf("(KEYWORD, %s)\n", tokens[i].lexeme);
} else if (tokens[i].type == IDENTIFIER) {
printf("(IDENTIFIER, %s)\n", tokens[i].lexeme);
} else if (tokens[i].type == INTEGER) {
printf("(INTEGER, %d)\n", tokens[i].value);
} else if (tokens[i].type == DELIMITER) {
printf("(DELIMITER, %c)\n", tokens[i].lexeme);
}
}
 
// 输出标识符表
printf("\nIdentifier Table:\n");
for (int i = 0; i < identifier_count; i++) {
printf("%s\n", identifiers[i]);
}
 
// 输出常整数表
printf("\nInteger Table:\n");
for (int i = 0; i < integer_count; i++) {
printf("%d\n", integers[i]);
}
 
return 0;
}

到此这篇关于C语言设计实现扫描器的自动机的示例详解的文章就介绍到这了,更多相关C语言扫描器内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C语言设计实现扫描器的自动机的示例详解

本文链接: https://www.lsjlt.com/news/176050.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C语言设计实现扫描器的自动机的示例详解
    目录题目内容思路代码题目内容 内容: 1.设计扫描器的自动机; 2.设计翻译、生成Token的算法; 3.编写代码并上机调试运行通过。 要求: 扫描器可识别的单词包括:关键字、界符、...
    99+
    2022-12-28
    C语言实现扫描器 C语言 扫描器
  • springboot自动扫描添加的BeanDefinition源码实例详解
    1. springboot启动过程中,首先会收集需要加载的bean的定义,作为BeanDefinition对象,添加到BeanFactory中去。 由于BeanFactory中只有g...
    99+
    2024-04-02
  • C语言实现栈的示例详解
    目录前言一. 什么是栈二. 使用什么来实现栈三. 栈的实现3.1 头文件3.2 函数实现3.3 完整代码四. 栈的用处前言 前一段时间,我们试着用C语言实现了数据结构中的顺序表,单链...
    99+
    2024-04-02
  • C语言实现队列的示例详解
    目录前言一. 什么是队列二. 使用什么来实现栈三. 队列的实现3.1头文件3.2 函数的实现四.完整代码前言 前一段时间,我们试着用C语言实现了数据结构中的顺序表,单链表,双向循环链...
    99+
    2024-04-02
  • C语言实现阶乘的示例详解
    目录前言1.阶乘实现1.1理论步骤1.2实践结果2.连续乘层相加实现2.1理论步骤2.2实践结果前言 在现实中,我们做数学题总会遇到阶乘问题,这在计算机中也不例外。 那我们应该怎么实...
    99+
    2024-04-02
  • C语言实现扫雷游戏的示例分析
    这篇文章给大家分享的是有关C语言实现扫雷游戏的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一,创建菜单先明确要做什么,选择合适的语句来对想法进行实现:test.c   vo...
    99+
    2023-06-29
  • 基于C语言扫雷游戏的设计与实现
    目录1 引言2 相关工作3 本文方法4 结果与分析5 总结整体代码1 引言 伴随着信息技术的快速发展,近年来,人们的生活已经离不开计算机。生活娱乐几乎都是在计算机上进行的。其中的扫雷...
    99+
    2024-04-02
  • C语言实现扫雷小游戏的示例代码
    目录一、扫雷1.演示效果2.完整代码二、代码解析1.初始化雷盘2.打印雷盘3.布置雷4.排雷5.游戏函数主体6.菜单函数7.头文件、宏定义及主函数一、扫雷 扫雷小游戏主要是利用字符数...
    99+
    2022-11-13
    C语言扫雷游戏 C语言 扫雷 C语言 游戏
  • C语言实现单元测试的示例详解
    目录前沿使用前提测试框架如下测试方法编写文件验证前沿 单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。对于单元测试中单元的含义,一般来说,要根据实际...
    99+
    2024-04-02
  • C语言实现爆炸展开的扫雷详解
    目录游戏介绍游戏功能实现1.主菜单:2.初始化雷盘3.打印雷盘4.布置雷5.玩家开始排查雷6.小菜单7.排查位置周围的八个坐标有几个雷8.使用递归爆炸式展开9.标记功能10.取消标记...
    99+
    2024-04-02
  • C#实现自定义动画鼠标的示例详解
    目录实践过程效果代码实践过程 效果 代码 public partial class Form1 : Form { public Form1() { ...
    99+
    2022-12-20
    C#自定义动画鼠标 C# 动画鼠标 C# 鼠标
  • C语言实现经典扫雷小游戏的示例代码
    目录一、游戏简介二、游戏实现1.初始化棋盘2.打印棋盘3.布置雷4.排查雷三、源文件1.game.h2.game.c3.Test.c一、游戏简介 游戏初始界面有两个选择,选项&ldq...
    99+
    2022-11-13
    C语言扫雷游戏 C语言 扫雷 C语言 游戏
  • C语言实现经典windows游戏扫雷的示例代码
    目录1. 前言2. 准备工作3. 设计思路4. 定义数组5. 初始化6. 打印7. 布置雷8. 排查雷9. 完整代码game.hgame.ctest.c1. 前言 大家好,我是努力学...
    99+
    2022-11-13
    C语言扫雷游戏 C语言 扫雷 C语言 游戏
  • C#实现获取机器码的示例详解
    目录实践过程效果代码实践过程 效果 代码 public partial class Form1 : Form { public Form1() { ...
    99+
    2022-12-30
    C#获取机器码 C# 机器码
  • SpringBoot实现自定义启动器的示例详解
    目录开发步骤测试自定义启动器启动器支持多Druid和C3P0开发步骤 1.创建启动器项目 添加启动器相关依赖创建属性配置类创建自动配置类编写自动配置文件(spring.factori...
    99+
    2023-01-12
    SpringBoot自定义启动器 SpringBoot 启动器
  • C语言实现冒泡排序算法的示例详解
    目录1. 问题描述2. 问题分析3. 算法设计动图演示4. 程序设计设计一设计二结论5. 流程框架6. 代码实现7. 问题拓展1. 问题描述 对N个整数(数据由键盘输入)进行升序排列...
    99+
    2024-04-02
  • C语言实现生成新春福字的示例详解
    目录主要代码字面量以及数据结构定义一个回调函数,刷新福字应用初始化程序主程序效果展示快新年了,支付宝扫福活动又开始了,每次都要百度找福,这次不想找了,自己写一个程序生成各种字体的福字...
    99+
    2024-04-02
  • C语言实现动态链表的示例代码
    目录结构体定义已经函数声明函数实现创建一个链表判断链表是否为空获得链表中节点的个数在某个特定的位置插入一个元素获得指定下标的节点的元素删除一个节点链表逆序链表的清空链表的销毁链表的遍...
    99+
    2024-04-02
  • C语言完数的实现示例
    C语言中的完数指的是一个正整数,它的所有因子(除了它本身)的和等于它本身。例如,6 就是一个完数,因为 6 的因子包括 1、2、3,它们的和恰好等于 6。 在 C语言中,判断一个数是...
    99+
    2023-05-20
    C语言完数
  • C语言实现24点游戏计算器的示例代码
    目录前言一、项目的创建标二、项目的编写三、项目的调试结果前言 24点游戏计算器的规则如下 24点是一种益智游戏,24点是把4个整数(一般是正整数)通过加减乘除以及括号运算,使最后的计...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作