c - C:对字符串进行标记,将逗号计为标记
问题描述
作为练习,我必须编写一个非常简单的组装处理器的汇编程序。该处理器具有带有零个、一个或两个操作数的指令。例如:
HELLO: add r7, B
在这条指令中,HELLO
是在这一行定义的标签,是add
指令助记符,r7
意思是“寄存器#7”,并且B
是对其他地方定义的标签的引用。
此行必须分解为以下标记:
((LABELDEF "HELLO") (INSTRUCTION "add") (REGISTERREF 7) (COMMA) (LABELREF "B"))
给我带来麻烦的是操作数之间的逗号。根据规范,逗号可能会或可能不会被两边的空格包围。(与 末尾的冒号相反HELLO:
,它必须与标签相邻。)我认为必须将逗号解析为单独的标记,因为它是语法的强制性部分,不能被视为空格.
我想出了几个实现选项:
- 正则表达式:显而易见的选择,但正则表达式不是标准 C 库的一部分,并且作业说我不能使用任何其他库。
strtok()
: 在连续的记号之间需要一些分隔符(例如' '
,'\t'
),在逗号和它之前和之后的操作数之间可能不存在。sscanf()
:除非我遗漏了某些东西,否则%s
说明符只会在看到空格时停止读取,同样,当有两个用逗号分隔的操作数时,空格可能不存在。- 前两个选项的某种组合或变体。
- 自定义状态机:需要比前面的选项更多的代码,而且我的日程安排非常紧张。
您认为最好的选择是什么?你能分享一下你在类似项目中的经验吗?
解决方案
推荐阅读
- c# - WPF按钮未在悬停时应用所有属性
- arrays - 如何编写一个函数,该函数采用一行文本,并将每个单词保存在指向 char 指针的指针中并返回该指针
- objective-c - 如何将 UISwitch 添加到特定的 UIScrollView?
- javascript - 如何使用javascript将名称增加的字段添加到表单中?
- c# - c# - 替换扩展的 ascii 字符
- android - Android 上的 Agora 原始音频
- vim - 如何在插入模式下重新映射 Vim 中的箭头键?
- python - 如何仅在一个区域中制作可滚动文本?Python Kivy
- vba - 通过 VBA Webdriver 检查类 html 的样式
- html - Jquery单击事件使列表中的a标签突出显示