忘记密码   免费注册 查看新帖 | 论坛精华区

ChinaUnix.net

  平台 论坛 博客 认证专区 大话IT HPC论坛 徽章 文库 沙龙 自测 下载 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
最近访问板块 发新帖
查看: 1585 | 回复: 1

lex规则能否指定读取2进制数字的规则? [复制链接]

论坛徽章:
2
2015年迎新春徽章
日期:2015-03-04 10:16:532015元宵节徽章
日期:2015-03-06 15:53:22
发表于 2016-09-19 15:56 |显示全部楼层
本帖最后由 cdsfiui 于 2016-09-19 15:58 编辑

例如我们的文本格式可以区分字母和数字。数字12开头的称为Head,34开头的称为Tail,文本格式的lex可以写成


Head:12
Content:[A-Za-z]*
Tail:34


那么12abc34xyz12可以解释为


Head Content Tail Content Head Content
--------------------------------------------------
而我的需求是,把输入当成字节流:
遇0x01 0x02就判定为Head, 遇到0x03 0x04就判定为Tail,其余的和上面的例子相同。


问题: 这个lex的正则表达式规则应该怎么写?


其实我的问题就在于lex的规则如何处理2进制值的情况,而不是文本的情况。
希望我表述清楚了。谢谢。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
发表于 2016-09-19 18:08 |显示全部楼层
回复 1# cdsfiui

其实我的问题就在于lex的规则如何处理2进制值的情况,而不是文本的情况。


直接用 \xXX 的方式匹配值为 XX 的字节嘛。


  1. %option noyywrap

  2. %{
  3. #include <stdio.h>
  4. int o = 0, a = 0, b = 0, c = 0;
  5. %}

  6. a        \x01
  7. b        \x02
  8. c        \x03

  9. %%

  10. {a}        { a++; }
  11. {b}        { b++; }
  12. {c}        { c++; }
  13. .        { o++; }

  14. %%

  15. int main() {
  16.         yyin = stdin;
  17.         yylex();
  18.         printf("o = %d, a = %d, b = %d, c = %d\n", o, a, b, c);
  19. }

复制代码


$ echo -ne '\x01\x02\x03' | ./a.out
o = 0, a = 1, b = 1, c = 1


评分

参与人数 1信誉积分 +10 收起 理由
cdsfiui + 10 很给力!

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP