本文延续
上一篇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?)。这些情况可能会很复杂,轻量级的解析方法很可能无法应对。
分享到:
相关推荐
"Python-小明NLP"就是这样一款专为中文设计的轻量级自然语言处理工具,它旨在简化开发者在处理中文文本时的复杂性,提供一系列实用的功能,如中文分词、词性标注、文本纠错、文本转拼音以及情感分析等。 首先,我们...
《轻量级Java EE企业应用实战(第三版)》是一本深入浅出的教程,旨在帮助读者掌握在企业环境中使用Java EE进行轻量级开发的技术和实践。这本书涵盖了从基础到进阶的多个主题,包括Java语言核心、Servlet、JSP、JDBC...
本项目聚焦于轻量级的C++实现的HTTP服务器(httpserver)和HTTP客户端(httpclient),利用mongoose库作为基础,为开发者提供了一种简单且高效的方法来添加HTTP功能,而无需依赖如libcurl这样的大型库。 HTTP(超...
HTML(HyperText Markup Language)是构建网页的基础语言,它的轻量级后台模板为开发者提供了快速构建用户界面的框架。这种模板通常包含了一系列预设计的布局结构和组件,以简化开发流程,提高工作效率。 轻量级...
标题中的“用golang实现的一个轻量级noSQL数据库,支持redis命令的一个常用小子集”表明,这是一个基于Golang编程语言构建的轻量级非关系型数据库(NoSQL)系统,它部分兼容Redis命令。这通常意味着该数据库系统提供...
#### 三、《轻量级J2EE企业应用实战第三版》主要内容解析 - **书籍简介**:本书全面介绍了轻量级J2EE框架的理论基础及实际应用案例,旨在帮助读者掌握如何利用这些框架快速搭建企业级应用。 - **章节概览**: - **...
JSON作为一种轻量级的数据交换格式,不仅因其简洁性和易读性而在软件开发领域内得到了广泛的应用,还因其强大的灵活性和兼容性而成为了许多现代技术的基础。无论是构建Web服务还是处理数据,JSON都是一个不可或缺的...
Oracle Database 10g Express Edition(Oracle10g轻量级版)是Oracle公司推出的一款专为学习、开发和小型业务系统设计的轻量级数据库管理系统。它在保持Oracle核心功能的同时,降低了资源需求和成本,使其成为初学者...
ZincSearch,作为一个轻量级的搜索引擎,旨在为那些寻求替代Elasticsearch但对资源需求较低的用户提供解决方案。Elasticsearch是一款强大的分布式全文搜索引擎,广泛应用于大数据分析和实时搜索,但其资源消耗相对较...
《基于H-ui前端框架构建的轻量级后台模板解析与应用》 在信息化时代,高效、易用且具有优秀用户体验的后台管理系统对于企业运营至关重要。本文将深入探讨以H-ui前端框架为基础开发的轻量级网站后台模板,帮助开发者...
“一款轻量级的FLEX MVC开发框架”指的是该资源提供了一个针对Adobe Flex应用的轻量级模型-视图-控制器(MVC)架构的开发框架。Flex是基于ActionScript 3的开放源代码SDK,用于构建富互联网应用程序(RIA)。MVC模式...
《互联网轻量级SSM框架解密:Spring、Spring MVC、MyBatis源码深度剖析》以SSM 的核心代码剖析为基础,突破Java Web 研发瓶颈的束缚,选取Spring、SpringMVC 和MyBatis 框架中易于理解的版本,深入剖析了其中各个...
总之,这套源码为Java EE开发者提供了一个全面的学习资源,通过实际操作和分析,可以深入了解轻量级Java EE应用的开发流程,提高解决实际问题的能力。对于想要深入理解和运用Struts 2、Spring 3和Hibernate的开发者...
3. 高扩展性:通过模块化设计,轻量级HttpServer允许开发者轻松添加新功能,如动态语言支持、路由处理等。 4. 易于部署和管理:由于其小巧的特性,部署和管理轻量级HttpServer相对简单,适合个人项目或者团队开发...
在本文中,我们将深入探讨如何使用C++语言和TinyHTTP源码实现一个轻量级的Web服务器,以处理HTTP协议中的GET和POST请求。这个项目是适合初学者的,可以帮助他们理解网络编程的基础,特别是HTTP协议和服务器端的实现...
1. **关系结构**:指轻量级工作流引擎采用的关系数据库作为数据存储和处理的基础。关系数据库以其成熟的数据管理和事务处理能力,为工作流引擎提供了稳定的数据支持。关系结构强调的是数据之间的关联性,通过表格...
本压缩包"轻量级开发框架源码.zip"显然包含了C#语言的一个轻量级开发框架的源代码。让我们深入探讨一下这个主题,了解轻量级开发框架的概念、C#开发框架的特点以及源码分析的重要性。 轻量级开发框架,通常是指那些...
总结,基于Qt的轻量级HTTP服务器是一个结合了C++语言、网络编程和Qt库的项目,它提供了构建高效、灵活服务器的基础。通过深入学习和实践,开发者可以掌握网络服务器开发的核心技术,并能将其应用到其他类似项目中。
在本项目中,我们将探讨如何使用C++语言来实现一个轻量级的XML数据库系统。XML(eXtensible Markup Language)是一种数据交换格式,广泛应用于数据存储和传输。C++,作为一种强大的编程语言,提供了丰富的库和工具来...
MiniDom作为一个基于C语言的轻量级高效XML编解码器,不仅解决了C语言环境中缺乏易用XML解析器的问题,还在性能和功能方面取得了显著提升。通过采用DOM模型和Expat解析器的技术组合,MiniDom成功地实现了对XML文档的...