关于lex中正则表达式区分减号和负号(正后顾不可用)
来源:互联网 发布:ubuntu卸载搜狗拼音 编辑:程序博客网 时间:2024/05/21 17:50
1. 减号和负号区别解释
减号是一种运算符,负号是数字的特质,两者不能混为一谈。
例如: a=a-10和a-=-10,前者是减号 是运算符,后者是表示这是一个负数,小于零。
2.利用正则式的正后顾解决
最初的想法是利用正则式中的后顾解决这个问题。先来科普一下正前瞻和正后顾:
正前瞻:假设要匹配单词my ,要求紧随其后的单词是friend,要达到这个目的,便使用正前瞻。
(?i)my (?=friend)
(?i)的意思是不区分大小写;实际匹配是,会寻找后面跟着单词friend的my,而且被标亮的只有my
正后顾:正后顾会查看左边的内容,与正前瞻的方向相反。语法为:
(?i)(?<=my) friend
意思是查找前面是单词my的friend单词,这个时候匹配的是friend,被标亮的也是friend,而且前面没有my的friend单词不会被标亮。
分析:
①若为减号:则基本形式为a-b;a-10;10-a;抽象为一般形式为:(变量|常量)-(变量|常量)。操作符减号前后应该有两个操作数;
②若为负号:则基本形式为a=-10;a+=-10;a-=-10;a+=(-10);-10+a;抽象为一般形式为:(运算符|分界符|NULL)(负数)
窃以为:lex不支持正前瞻和正后顾
3.解决方法
本人小白,用了一上午想办法查资料来解决这个问题,都没有搞定,也没有看到相关lex中使用正后顾的资料。只好在动作里进行自动分离。
第一个是预定义里定义代码:特别定义出来减号和负号
fuhao ["="|"+="|"("](-([0-9])+)jianhao {chars}+(-([0-9])+)第二是在识别动作里进行分离:
//输出格式为23 (4,abd){jianhao} { //假设a = abc-10 count++;//自定义单词计数变量 printf("%d\t(4,",count);//先输出(4, for(i=0;yytext[i]!='-';i++)//输出减号之前的abc printf("%c",yytext[i]); printf(")\n");//输出 ) count++; printf("%d\t(4,'%c')\n",count,yytext[i++]);//输出减号 count++; printf("%d\t(3,",count);//输出(3, for(;i<yyleng;i++) printf("%c",yytext[i]);//输出10 printf(")\n"); } {fuhao} { //假设 a+=-10 count++; if(yytext[0]=='=')printf("%d\t(4,'%c')\n",count,yytext[0]);//a=-10 输出运算符和分界符之类的 else if (yytext[0]=='(')printf("%d\t(5,'%c')\n",count,yytext[0]);//a=b*(-10) else if (yytext[0]=='+=')printf("%d\t(5,'%c%c')\n",count,yytext[0],yytext[1]);//a+=-10 count++; printf("%d\t(3,",count);//输出23 (3, for(i=2;i<yyleng;i++)//继续输出 printf("%c",yytext[i]); printf(")\n"); }方法比较low,简单易懂,代码不完善,有错误和新想法欢迎交流
1 0
- 关于lex中正则表达式区分减号和负号(正后顾不可用)
- 正则表达式前瞻与后顾
- 只能输入带正负号的整数和小数的正则表达式
- 关于博客中第(13)个公式正负号的问题
- 正则表达式:特殊字符之“-”(减号)
- 正则表达式不区分大小写
- C# 用正则表达式判断字符串是否全是数字、小数点、正负号组成等
- C# 用正则表达式判断字符串是否全是数字、小数点、正负号组成等
- 正则表达式详解(贪婪与懒惰、前瞻与后顾、后向引用等)
- 不区分大小写的模式,在正则表达式的最后正斜杠后面添加一个字符“i”,比如/cat/i
- Lex正则表达式
- lex 正则表达式
- C++tr1正则表达式不区分大小写
- JAVA正则表达式不区分大小写
- python中整数除法的正负号
- 关于姿态旋转矩阵中的正负号和旋转方向问题
- Lex的简单入门和正则表达式基础
- Oracle中不区分大小写查询使用正则表达式函数REGEXP_LIKE
- 50-100
- 软件里的alpha版和beta版是什么意思?
- Android编码规范
- 堆、堆栈与数据结构中的堆
- [svn] 解决SVN冲突攻略(手册)
- 关于lex中正则表达式区分减号和负号(正后顾不可用)
- javascript判断IE浏览器最简单的方法
- 设计模式(一):工厂模式FactoryMethod(创建型模式)
- elasticsearch由于数据特别长而找不到数据
- 语音识别博客
- iOS关于自动布局(Autolayout)SizeClass
- 100-150
- mac下不能卸载和升级numpy的解决办法
- CodeForces A. Wet Shark and Odd and Even