有没有不适合使用flex/lex作为词法分析器的语言?(摘自知乎)
本问题及解答摘自本人知乎 http://www.zhihu.com/people/chaos-xie http://www.zhihu.com/question/29922657
感谢知乎网友的回答!现将问题及可能的解答记录如下:
有没有不适合使用flex/lex作为词法分析器的语言?
Javascript 正则表达式字面量和除法操作符的二义性, 很难用 lex 解决, 一般只用 lex 做很少很少的事情, 然后把真正含义的辨清延迟到 parse 阶段.
有一个用 lex 中判断 / 含义的方案, 主要是通过保存前一个 token 状态来做判断, 你感受一下它的复杂度:
`//` 总是辨认为行注释开始
如果符号是 `/` 或者 `/=`, 并且前一个 token 是下列 token 之一, 那它就是除法运算符:
]
Identifier Number RegularExpression String
class false null private protected public super this true
get include set
如果前一个 token 是下列 token 之一, 那它就是正则表达式的开始:
! != !== # % %= & && &&= &= ( * *= + += , - -= ->
. .. ... / /= : :: ; < << <<= <= = == === > >= >> >>= >>> >>>=
? @ [ ^ ^= ^^ ^^= { | |= || ||= ~
abstract break case catch const continue debugger default delete do else enum
export extends final finally for function goto if implements import in instanceof
interface is namespace native new package return static switch synchronized
throw throws transient try typeof use var volatile while with
但是它依然判断不了 前一个 token 是 ) } 的情况...
if (true) /a/g ---> 正则表达式
(x+y)/2 ---> 除法
{}/a/g ---> 正则表达式
+{}/a/g ---> 除法
所以得添加一个状态栈来判断右括号是控制结构 if / for / while 的括号还是表达式的括号.
再加一个状态栈来判断右大括号是 block 结束还是 object literal 的结束.
但是它依然判断不了前一个 token 是 ++ 或 -- 的情况
a++/a/g ---> 除法
RegExp.prototype.foo = 3
++/a/g.foo ---> 正则表达式
所以还得判断前面的 ++ 到底是后缀运算符, 还是前缀运算符...
至此你的 lexer 充满了一堆非常复杂的状态... 你会思考人生的价值, 怀疑 lex 到底有啥意义, 为什么不直接用一个 scannerless 的 parser 解决这个变态的语言?
eta的答案所提到的问题还是相对比较简单的,只要你把bison当lex用就可以轻松解决,所有的那些状态都embed在你的文法里面了。主要标准就是,当你需要一个表达式而此时你看到的是/的时候,如果他不是注释,那就肯定是正则表达式。
Chaobs 评论 vczh:
我明白你和Zete的意思了,这就是说有些记号的含义只有到了语法分析阶段才能消除二义性。我暂时还没有考虑去实现一个C++的词法、语法分析器,也没有考虑去实现函数式语言的分析,不过我会考虑去做一个语义分析和语法分析同时做的例子的。
杨个毛 评论 Chaobs:
真正复杂的问题是bison搞不定的,譬如说C++需要语义分析和语法分析同时做,让语义分析的结果来指导语法分析到底要选择哪条grammar rule来resolve conflict。
有没有不适合使用flex/lex作为词法分析器的语言?(摘自知乎)的更多相关文章
- Flex 国际化(中英语言适配)
原文地址:http://www.cnblogs.com/meteoric_cry/archive/2011/01/13/1934404.html(由于此贴时间久远,已做微调) 1.新建Flex Pro ...
- Flex Builder 4.6切换语言
一.修改Flex builder 1.用无格式编辑器打开FlashBuilder.ini 2.把zh_CN替换成"en_US" 二.修改MyEclipse插件 1.用无格式编辑器打 ...
- 编译原理实战——使用Lex/Flex进行编写一个有一定词汇量的词法分析器
编译原理实战--使用Lex/Flex进行编写一个有一定词汇量的词法分析器 by steve yu 2019.9.30 参考文档:1.https://blog.csdn.net/mist14/artic ...
- Flex & Bison 开始
Flex 与 Bison 是为编译器和解释器的编程人员特别设计的工具: Flex 用于词法分析(lexical analysis,或称 scanning),把输入分割成一个个有意义的词块,称为记号(t ...
- DarkStone - 跨平台移动应用开发之 Flex 的崛起
我的好友Ds 发布一个flex的消息.我帮忙转发 DarkStone - 跨平台移动应用开发之 Flex 的崛起 (2013-08-20 22:28:32) 此文章由 周戈 (DarkSton ...
- Flex的正则表达式匹配速度与手工代码的比较
flex是一个词法分析器生成器,它是编译器和解释器编程人员的常用工具之一.flex的程序主要由一系列带有指令(称为动作代码)的正则表达式组成.在匹配输入时,flex会将所有的正则表达式翻译成确定性有穷 ...
- [转载] 如何使用Lex/YACC
原文: http://segmentfault.com/a/1190000000396608?hmsr=toutiao.io&utm_medium=toutiao.io&utm_sou ...
- Windows下lex 与 yacc的使用
Windows下lex 与 yacc的使用 首先 下载下载flex和bison.网址是http://pan.baidu.com/s/1dDlfiW5 选择下载就好了,下载后解压到你电脑中的任一盘中. ...
- 从不同的角度分析Flex的优缺点
从不同的角度分析Flex的优缺点 技术角度: (1)具备了RIA时代富客户端的优点(C/S+B/S) (2)支持多种服务器语言(JAVA..NET.PHP)及主流框架(Spring.Hibernate ...
随机推荐
- ABP问题记录
按照<Asp.NET Core2.0与 EF的ABP框架入门视频教程>(https://ke.qq.com/course/287301)下载了3.9版本的ABP,开始学习,下面记录遇到的问 ...
- 使用vba doc转docx
创建vbs文件,doctodocx.vbs内容如下: '创建一个word对象 set wApp=CreateObject("word.Application") '获取文件传递到参 ...
- html5中event获取data和class
获取data和class var tare=$(e.relatedTarget).data("id");var tar=event.target;console.log(tare) ...
- Android学习笔记_4_单元测试
在实际开发中,开发android软件的过程需要不断地进行测试.而使用Junit测试框架,侧是正规Android开发的必用技术,在Junit中可以得到组件,可以模拟发送事件和检测程序处理的正确性. 1. ...
- 菜鸟崛起 DB Chapter 2 MySQL 5.6的概述与安装
在上文菜鸟崛起 DB Chapter 1 数据库概述我们初步认识了数据库,也知道市面上常见的几种数据库,下面我们就针对常见的MySQL数据库展开对DataBase的探讨. 2.1 MySQL介绍 M ...
- Xcode 9.0 报错, Safe Area Layout Guide Before IOS 9.0
Xcode 9.0 新建工程报错 xcode Safe Area Layout Guide Before IOS 9.0 如下图,在Builds for 选择iOS9.0 and Later,不勾选U ...
- UML绘制活动图--客户来电咨询活动图
选择Logic View–>New–>Activity Diagram 修改NewActivity为客户来电咨询 选择初始状态和终止状态(下图中上面是Start State,下面是End ...
- PostgreSQL数据库的安装
1 总体规划 操作系统 CentOS Linux release 7.5.1804 处理器 1 内存 4G 硬盘 38G 主机名称 chenzx IP地址 192.168.56.8 1.1 用户组和用 ...
- Eclipse build时间太长,无法忍受,完美解决方案,Eclipse 编译太卡,耗时太长
目前开发使用了Eclipse ,每次报错的时候都会build,,每次build的时间都很长,接近10秒左右,好难受呀.. 刚开始一直以为是项目内容多导致的,但是想想之前做的项目,无论再多,也都是秒级的 ...
- iOS中出现"Check dependenciesWarning: The Copy Bundle Resources build phase contains this target's Info.plist file..."的解决办法A
出现场景 项目中移除info.plist ,后来又重新拖拽回来,同时勾选了Copy items if needed 解决办法 1.删除(删除时选择Remove Reference) 2.重新添加i ...