本文延续
上一篇blog,对语法解析问题做一点点思考。注意,本文的角度仅仅是从轻量级解析方面考虑,也就是说不考虑像语言的编译器或解释器那样要完整精确地将源码解析为AST。轻量级解析的目标应用是诸如语法高亮、预处理、lint、语法糖衣或简单的语言扩展之类。
因此讨论顺序也比较特殊,从注释开始。在上述处理中一般会要排除注释。
通常语言可能支持两种comments,单行comments和多行comments。
单行comments是从一个特定符号组合开始,到换行符结束。常见的单行comments包括:
// comments
# comments
-- comments
' comments
rem comments
多行comments是从一个特定符号组合开始到一个特定符号组合结束。多行comments要考虑是否允许嵌套(通常是不允许嵌套的)。常见的多行comments包括:
/* comments */
<!-- comments -->
" comments "
再次是字符串源文本(string literal)。最常见的就是引号包围的部分。需要注意的是几点:
1. 特殊字符的escape,如\"、\'还有\\。
2. 可能会支持某种字符表达方式,例如\unnnn。有时这种表达法可能不限于字符串源文本而是整个源代码。
3. 某些特殊形式的字符串源文本,例如允许内插变量的(如"x=${x}"),无escape的(如@"c:\test"),跨行的(如"""...""")等。
语言的语法格式通常会包含一些特殊符号,例如EOS(如“;”)、block(如“{}”)等,然而在根据这些符号进行解析时,必须排除comments和string literal中的这些符号。但是comments所用符号和string literal的定界符本身也可能包含于string literal和comments中。比如一个包含注释定界符的字符串"/*"。
许多语言还支持正则表达式源文本(regex literal)。这使得情况更复杂。注意由于正则源文本常常用/regex/形式包围,需要与除法符号区分开来。这存在一个很严重的问题,因为判断是否适用于除法,还是适用于正则,可能要用到语义的信息。因此,为了保证轻量级,我们可能要做一些折衷。
comments、string literal和regex literal等是语言中的特殊构造,它们可能包含大量字符,包括语言的保留字和用于定界的标点符号等。而且它们往往可以包含对方的定界符,如在comments中的string literal开始符号就不再产生string literal了,而string literal中的comments起始符号也不再产生comments了。
排除了它们之后,剩下的就是语言本身用到的特殊符号。
首先是EOS(语句结束符)。大体可以分为三类:
一类是以特殊符号为结束符,例如C-style的“;”。
一类是以EOL(行结束符)为结束符,有时也允许同时采用EOS。比如Python。
一类是没有明确的EOS,最有名的就是JavaScript,其次如Groovy。
其次是代码块。大体是三类:
一类是以符号表示,如C-style的花括号结构。
另一类是以关键字表示,如begin end。
还有一类是以缩进表示,如Python。
再次是语言的保留字。包括关键字、特定的literal(如true、false)等。
注意,有些关键字并不总是关键字,而是可以在上下文中充当一般的标识符。
其他特殊构造包括各种literal,如数字源文本、数组、映射表、元组等。
最后,有些场景存在多种语言嵌套的情况。例如HTML会嵌套CSS、脚本等。有些语言则支持内嵌XML literal(如E4X)或内嵌其他语言(如LINQ、SQLJ?)。这些情况可能会很复杂,轻量级的解析方法很可能无法应对。
分享到:
相关推荐
SpringBoot+Mybatis+SpringSecurity+Bootstrap+Layui开发java web轻量级小巧视频网站系统 项目描述 PC端+手机端模式自适应 支持本地资源视频文件上传在线播放,同时支持在线资源链接上传(ed2k、迅雷、等资源)...
有任何使用问题欢迎随时与博主沟通,第一时间进行解答!Linux系统是一个免费使用和自由传播的类Unix操作系统,基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它继承了Unix以网络为核心的设计思想...
基于学员的上述反馈和疑问,同时考虑到OAuth2是微服务架构的重要环节,我决定带领大家分析一个轻量级OAuth2服务器(项目名Gravitee)的设计和实现,让大家深入理解OAuth2服务的原理和实现,同时解答大家的一些疑问。...
探讨了流分析技术在汇编代码理解中的应用,并在Linux平台上实现了一个轻量级汇编代码结构化表示工具BESTAR。该系统利用控制流和数据流分析技术识别通用控制结构,分析程序执行流,重构表达式和函数,发现数据依赖...
Pig:一种轻量级的脚本语言,在处理半结构化数据上拥有非常高的性能,为用户提供多种接口 Hive:数据仓库工具,在使用类SQL查询分析时显示是极高的性能,由Facebook贡献,定义了简单的类SQL查询语言 Sqoop:于在...
相比之下,文心一言则是国内百度开发的轻量级自然语言生成模型,它主要采用了基于循环神经网络的架构。因此,从基础技术上来看,GPT-4拥有更加先进和成熟的技术架构,能够更好地应对复杂的自然语言生成任务。 差距...
JSON(JavaScript Object Notation, JS对象简谱)是一种轻量级的数据交换格式。它基于 ECMAScript(European Computer Manufacturers Association, 欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言...
Mark Lavin(马克·拉 温) 著,侯荣涛,吴磊 译《轻量级 Django》 ,中国电力出版社,2016.10 课 程 简 介 Python 因其功能强大、简单易学、开发成本低廉,已成为深受广大应用程序 开发人员喜爱的 程序设计语言之一...
Anaconda是用于科学计算(数据科学,机器学习应用程序,大规模数据处理,预测分析等)的Python和R编程语言的免费开源发行版,旨在简化软件包的管理和部署。 与Virtualenv一样,Anaconda也使用创建环境的概念来隔离...
它的轻量级开发设计思想是如何实现的? Spring产品级的IoC容器是如何作为一个完整的系统实现并运行的?它如何启动?如何完成Bean的解析和载入?又如何实现Bean的生命周期管理? Spring如何简捷地在JVM上实现AOP...
它的轻量级开发设计思想是如何实现的? Spring产品级的IoC容器是如何作为一个完整的系统实现并运行的?它如何启动?如何完成Bean的解析和载入?又如何实现Bean的生命周期管理? Spring如何简捷地在JVM上实现...
它的轻量级开发设计思想是如何实现的? Spring产品级的IoC容器是如何作为一个完整的系统实现并运行的?它如何启动?如何完成Bean的解析和载入?又如何实现Bean的生命周期管理? Spring如何简捷地在JVM上实现AOP...
它的轻量级开发设计思想是如何实现的? Spring产品级的IoC容器是如何作为一个完整的系统实现并运行的?它如何启动?如何完成Bean的解析和载入?又如何实现Bean的生命周期管理? Spring如何简捷地在JVM上实现AOP...
JavaScript,是一种轻量级的解释型编程语言; jQuery,使用户能更方便地处理HTML documents、events、实现动画效果,并且方便地为网站提供AJAX交互; Bootstrap 是快速开发 Web 应用程序的前端工具包。它是一个 CSS...
采用Netbeans、Eclipse、Oracle、Tomcat 等作为开发工具,在持久层使用轻量级ORM 开源框架Hibernate 技术,结合DAO 设计模式。用Spring 的IOC 和AOP 技术对持 久层和业务逻辑层对象进行管理,为web 应用提供事务管理...
JSON(Javascript Object Notation)是一种轻量级的数据交换语言,以文字为基础,具有自我描述性且易于让人阅读。尽管JSON是JavaScript的一个子集,但JSON是独立于语言的文本格式,并且采用了类似于C语言家族的一些...
它的轻量级开发设计思想是如何实现的? spring产品级的ioc容器是如何作为一个完整的系统实现并运行的?它如何启动?如何完成bean的解析和载入?又如何实现bean的生命周期管理? spring如何简捷地在jvm上实现aop...
它的轻量级开发设计思想是如何实现的? spring产品级的ioc容器是如何作为一个完整的系统实现并运行的?它如何启动?如何完成bean的解析和载入?又如何实现bean的生命周期管理? spring如何简捷地在jvm上实现...
根据 Linux 操作系统的特性,选择以 Web 界面形式实现软件应用程序功能,选择 Python 的轻量级Web 服务器 Django。将检测功能的软件集成到 Web 当中,并将 Web 部署到Raspberry Pi 上。根据 Python 语言的优势并结合...