CN112363706A - 一种嵌套组合的预处理方法及设备 - Google Patents

一种嵌套组合的预处理方法及设备 Download PDF

Info

Publication number
CN112363706A
CN112363706A CN202011312279.9A CN202011312279A CN112363706A CN 112363706 A CN112363706 A CN 112363706A CN 202011312279 A CN202011312279 A CN 202011312279A CN 112363706 A CN112363706 A CN 112363706A
Authority
CN
China
Prior art keywords
token
source code
abstract syntax
attribute
array
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CN202011312279.9A
Other languages
English (en)
Inventor
王娇娇
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Shanghai Yueyi Network Information Technology Co Ltd
Original Assignee
Shanghai Yueyi Network Information Technology Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Shanghai Yueyi Network Information Technology Co Ltd filed Critical Shanghai Yueyi Network Information Technology Co Ltd
Priority to CN202011312279.9A priority Critical patent/CN112363706A/zh
Publication of CN112363706A publication Critical patent/CN112363706A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code

Abstract

本申请的目的是提供一种嵌套组合的预处理方法及设备,本申请首先获取待处理的源代码及其中的所有字符串;之后,对所述源代码及其中的所有字符串进行解析,得到所述源代码对应的抽象语法树;接着,递归遍历所述抽象语法树,以完成对所述抽象语法树进行转换,得到对应的抽象语法数组及其对应的数组结构信息;最后,基于所述抽象语法数组对应的数组结构信息,对所述抽象语法数组进行遍历并拼接,生成目标层叠样式表CSS代码,实现了通过解析、转换及生成代码来实现对源代码的预处理,使得在对源代码进行预处理的过程中,不仅效率高、灵活、维护成本低,还减少预处理过程中的出错率和编译失败率。

Description

一种嵌套组合的预处理方法及设备
技术领域
本申请涉及计算机领域,尤其涉及一种嵌套组合的预处理方法及设备。
背景技术
在项目开发中有很多层叠样式表(Cascading Style Sheets,CSS)样式文件需要管理,文件合并压缩打包等底层构建,但是CSS没有相关的业务循环、判断,不能公用变量,那么在多模块开发使用相同模板公用样式处理上存在一定的代码冗余。在进行管理时,采用自动化的工具可以简化工作,正确配置好任务后,任务运行器就会自动帮你完成大部分工作。其中,CSS的预处理器主要有:LESS、Sass、Stylus;其中,LESS的基本语法属于CSS风格,Sass、Stylus相比之下激进一些,利用缩进、空格和换行来减少需要输入的字符,Sass、Stylus同时也兼容CSS风格代码。比如,用Stylus写法声明两个变量,然后通过换行缩进定义选择器和样式,代码如下:
Figure BDA0002790177540000011
以上代码的写法存在以下缺点:强制缩进换行,由于缩进空格数的不一致,就会导致程序解析失败或执行错误。
发明内容
本申请的一个目的是提供一种嵌套组合的预处理方法及设备,不仅效率高、灵活、维护成本低,还减少预处理过程中的出错率和编译失败率。
根据本申请的一个方面,提供了一种嵌套组合的预处理方法,其中,所述方法包括:
获取待处理的源代码及其中的所有字符串;
对所述源代码及其中的所有字符串进行解析,得到所述源代码对应的抽象语法树;
递归遍历所述抽象语法树,以完成对所述抽象语法树进行转换,得到对应的抽象语法数组及其对应的数组结构信息;
基于所述抽象语法数组对应的数组结构信息,对所述抽象语法数组进行遍历并拼接,生成目标层叠样式表CSS代码。
进一步地,上述方法中,所述对所述源代码及其中的所有字符串进行解析,得到所述源代码对应的抽象语法树,包括:
对所述源代码及其中的所有字符串进行词法分析,得到所述源代码对应的令牌数组及其中的每个令牌对应的令牌对象结构信息;
基于每个所述令牌对应的令牌对象结构信息,对所述源代码对应的令牌数组进行语法分析,得到所述源代码对应的抽象语法树。
进一步地,上述方法中,所述对所述源代码及其中的所有字符串进行词法分析,得到所述源代码对应的令牌数组及其中的每个令牌对应的令牌对象结构信息,包括:
对所述源代码中的所有字符串进行分类,得到至少一种类型的令牌及每种类型的令牌对应的判断条件和解析方式;
基于每种类型的令牌对应的判断条件和解析方式,对所述源代码进行逐行逐个单词的词法分析,得到所述源代码对应的令牌数组及其中的每个令牌对应的令牌对象结构信息;
其中,每个所述令牌对应的令牌对象结构信息包括令牌类型、令牌字符内容及记录的缩进空格数。
进一步地,上述方法中,所述对所述源代码中的所有字符串进行分类,得到至少一种类型的令牌,包括:
将所述源代码中的所有字符串拆分成至少一种类型的令牌,
其中,所述令牌的类型包括变量、变量值、选择器、属性及属性值,所述属性值和所述变量合并成一类进行处理,所述变量拆分成变量定义和变量引用。
进一步地,上述方法中,所述基于每个所述令牌对应的令牌对象结构信息,对所述源代码对应的令牌数组进行语法分析,得到所述源代码对应的抽象语法树,包括:
构建一个根节点,在所述根节点的属性中添加选择器节点属性;其中,所述选择器节点属性包含当前选择器的样式属性与值组成的对象属性,和子选择器节点属性;所述当前选择器的样式属性与值组成的对象属性用于指示选择器与属性之间的层级关系,所述子选择器节点属性用于指示选择器与选择器之前的层级关系;
基于每个所述令牌对应的令牌对象结构信息,按照先进先出的方式遍历所述源代码对应的令牌数组,得到所述源代码对应的抽象语法树。
进一步地,上述方法中,所述基于每个所述令牌对应的令牌对象结构信息,按照先进先出的方式遍历所述源代码对应的令牌数组,得到所述源代码对应的抽象语法树,包括:
基于每个所述令牌对应的令牌对象结构信息,按照先进先出的方式遍历所述源代码对应的令牌数组,当遇到变量时,将所述变量的变量名和对应的值存入到缓存对象中;
当遇到属性时,将所述属性插入到当前的选择器节点的所述当前选择器的样式属性与值组成的对象属性中;
当遇到值和变量引用时,将所述值和所述变量引用插入到当前的选择器节点的所述当前选择器的样式属性与值组成的对象属性中的最后一个对象的所述令牌字符内容中,其中,所述变量引用在插入之前,需借助所述缓存对象的变量值进行替换;
当遇到选择器节点时,向所述选择器节点的父选择器节点的所述选择器节点属性中插入并将指针指向被插入的节点,同时,将所述被插入的节点添加至用于存储遍历路径的数组中,以得到所述源代码对应的抽象语法树。
进一步地,上述方法中,所述递归遍历所述抽象语法树,以完成对所述抽象语法树进行转换,得到对应的抽象语法数组及其对应的数组结构信息,包括:
递归遍历所述抽象语法树;
在遍历所述抽象语法树中的树节点时,记录当前遍历路路径;
基于所述当前遍历路径,将所述选择器进行拼接,并将所述属性值和所述变量值的值的类型的节点进行拼接,以完成对所述抽象语法树进行转换,得到对应的抽象语法数组及其对应的数组结构信息;
其中,所述数组结构信息中的每个元素对象包括两个属性参数,分别为当前规则的选择器和数组,所述数组中包含所述属性和所述值。
进一步地,上述方法中,所述基于所述抽象语法数组对应的数组结构信息,对所述抽象语法数组进行遍历并拼接,生成目标层叠样式表CSS代码,包括:
基于所述抽象语法数组对应的数组结构信息,对所述抽象语法数组进行遍历,并将所述选择器、所述属性及所述值拼接成字符串,生成所述目标层叠样式表CSS代码。
根据本申请的另一方面,还提供了一种非易失性存储介质,其上存储有计算机可读指令,所述计算机可读指令可被处理器执行时,使所述处理器实现如上述嵌套组合的预处理方法。
根据本申请的另一方面,还提供了一种嵌套组合的预处理设备,其中,该设备包括:
一个或多个处理器;
计算机可读介质,用于存储一个或多个计算机可读指令,
当所述一个或多个计算机可读指令被所述一个或多个处理器执行,使得所述一个或多个处理器实现如上述嵌套组合的预处理方法。
与现有技术相比,本申请首先获取待处理的源代码及其中的所有字符串;之后,对所述源代码及其中的所有字符串进行解析,得到所述源代码对应的抽象语法树;接着,递归遍历所述抽象语法树,以完成对所述抽象语法树进行转换,得到对应的抽象语法数组及其对应的数组结构信息;最后,基于所述抽象语法数组对应的数组结构信息,对所述抽象语法数组进行遍历并拼接,生成目标层叠样式表CSS代码,实现了通过解析、转换及生成代码来实现对源代码的预处理,使得在对源代码进行预处理的过程中,不仅效率高、灵活、维护成本低,还减少预处理过程中的出错率和编译失败率。
附图说明
通过阅读参照以下附图所作的对非限制性实施例所作的详细描述,本申请的其它特征、目的和优点将会变得更明显:
图1示出根据本申请一个方面的一种嵌套组合的预处理方法的流程示意图;
图2示出根据本申请一个方面的一种嵌套组合的预处理方法中的预处理过程的工作示意图。
附图中相同或相似的附图标记代表相同或相似的部件。
具体实施方式
下面结合附图对本申请作进一步详细描述。
在本申请一个典型的配置中,终端、服务网络的设备和可信方均包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括非暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
如图1所示,本申请一个方面的一种嵌套组合的预处理方法的流程示意图,所述方法包括步骤S11、步骤S12、步骤S13及步骤S14,其中,具体包括如下步骤:
步骤S11,获取待处理的源代码及其中的所有字符串;
步骤S12,对所述源代码及其中的所有字符串进行解析,得到所述源代码对应的抽象语法树;
步骤S13,递归遍历所述抽象语法树,以完成对所述抽象语法树进行转换,得到对应的抽象语法数组及其对应的数组结构信息;
步骤S14,基于所述抽象语法数组对应的数组结构信息,对所述抽象语法数组进行遍历并拼接,生成目标层叠样式表CSS代码。
通过上述步骤S11至步骤S14,实现了通过解析、转换及生成代码来实现对源代码的预处理,使得在对源代码进行预处理的过程中,不仅效率高、灵活、维护成本低,还减少预处理过程中的出错率和编译失败率。
本申请的实施例中,对源代码进行精简的预处理实现包括:用空格和换行符替代花括号、冒号、分号,支持选择器嵌套组合及支持以“$”符号开头的变量定义和使用。在经过预处理后生成的目标CSS代码,为5条样式规则,其中,第1条和第5条样式规则是最简单的,使用1个选择器,定义了1条样式属性,第2条规则多用了一个标签选择器,样式属性值为多个字符串组成,第3条规则使用了类选择器;第4条规则增加了属性选择器,并且样式属性增加为2条,其中,依序分别为如下样式规则:
div{color:darkkhaki;}
div p{border:1px solid lightgreen;}
div.a-b{background-color:lightyellow;}
div.a-b[data]{padding:15px;font-size:12px;}
.d-ib{display:inline-block;}
例如,如图2所示,对源代码进行预处理的工作包括解析、转换及生成代码,其中,解析包括词法分析和语法分析,下面对解析、转换及生成代码进行初步解释说明:
首先,解析包括词法分析和语法分析,其中,词法分析就是将接收到的源代码转换成令牌,所有的令牌组成令牌数组,完成词法分析过程的函数或工具被称之为词法分析器(Tokenizer或Lexer),其中,所述令牌由一些代码语句碎片生成,它们可以是数字、标签、标点符号、运算符,或者其他任何东西;将代码令牌化之后会进入语法分析,语法分析过程会将之前生成的令牌转换成一种带有令牌关系描述的抽象表示,这种抽象的表示称之为抽象语法树(Abstract Syntax Tree,AST),完成语法分析过程的函数或工具被称为语法分析器(Parser),其中,所述抽象语法树通常是一个深度嵌套的对象,这种数据结构不仅更贴合代码逻辑,在后面的操作效率方面相对于令牌数组也更有优势。
其次,在解析完成之后,就是转换,即把抽象语法树AST拿过来然后做一些修改,完成对AST进行转换的转换过程的函数或工具被称之为转换器(Transformer);在转换过程中,AST中的树节点可以被修改和删除,也可以新增节点,对树节点进行修改、删除及新增的根本目的就是为了后续进行代码生成时更加方便。
最后,编译器的最后一步就是根据转换后的AST(即抽象语法数组)来生成目标CSS代码,在代码生成过程中做的事情有时候会和转换过程重叠,但是代码生成最主要的部分还是根据转换后的AST来输出代码,完成代码生成的过程的函数或工具被称之为代码生成器(Generator)。其中,代码生成有几种不同的工作方式,有些编译器将会重用之前生成的令牌,有些会创建独立代码表示,以便于线性地输出代码,但是,下面的实施例中,本申请还是着重于使用之前生成好的AST。当然,代码生成器必须知道如何“打印”转换后的AST中所有类型的节点,然后递归地调用自身,直到所有代码都被打印到一个很长的字符串中,以生成目标CSS代码,实现对源代码的预处理。
进一步地,所述步骤S12对所述源代码及其中的所有字符串进行解析,得到所述源代码对应的抽象语法树,具体包括:
首先,对所述源代码及其中的所有字符串进行词法分析,得到所述源代码对应的令牌数组及其中的每个令牌对应的令牌对象结构信息,实现了将源代码及其中的所有字符串拆分成不同类型的令牌及每个令牌对应的令牌对象结构信息;之后,基于每个所述令牌对应的令牌对象结构信息,对所述源代码对应的令牌数组进行语法分析,得到所述源代码对应的抽象语法树,实现了将词法分析中生成的令牌转换成一种带有令牌关系描述的抽象表示,即抽象语法树,使得通过词法分析和语法分析实现了对源代码及其中的所有字符串的解析。
进一步地,所述步骤S12中的对所述源代码及其中的所有字符串进行词法分析,得到所述源代码对应的令牌数组及其中的每个令牌对应的令牌对象结构信息,包括:
对所述源代码中的所有字符串进行分类,得到至少一种类型的令牌及每种类型的令牌对应的判断条件和解析方式;
基于每种类型的令牌对应的判断条件和解析方式,对所述源代码进行逐行逐个单词的词法分析,得到所述源代码对应的令牌数组及其中的每个令牌对应的令牌对象结构信息;
其中,每个所述令牌对应的令牌对象结构信息包括令牌类型、令牌字符内容及记录的缩进空格数。
例如,在进行步骤S12中的词法分析之前,首先要考虑源代码中的所有字符串可以被拆分成多少种类型的令牌,然后再确定每种类型的令牌的判断条件及解析方式,即需要对源代码中的所有字符串进行分类,来得到一种或多种类型的令牌,当然,不同类型的令牌对应不同的判断条件和解析方式。在对源代码中的所有字符串进行分类时,可以将所述源代码中的所有字符串拆分成一种或多种类型的令牌,在本申请一优选实施例中,通过分析待预处理的源代码,可以将字符串分为变量、变量值、选择器、属性及属性值5种类型的令牌,其中,所述属性值和所述变量可以合并成一类进行处理,为了方便后续的语法分析,所述变量可以拆分成变量定义和变量引用。
由于缩进会对语法分析产生影响,样式规则缩进空格数决定了属于哪个选择器,所以要加入令牌对象,因此,每个令牌对应的令牌对象结构信息如下:type属性表示令牌类型,value属性表示存储的令牌字符内容,indent属性表示记录的缩进空格数:
其中,在步骤S12中的词法分析将源代码中的所有字符串分解成为令牌(token)数组,在该令牌数组中的每个token对应为一个json对象,其中,每个令牌对应的令牌对象结构信息如下:
Figure BDA0002790177540000101
然后,根据不同类型的令牌确定对应的判断条件,其中,确定各种类型的令牌的判断条件为如下:
variableDef,以“$”符号开头,该行前面无其他非空字符串;
variableRef,以“$”符号开头,该行前面有非空字符串;
selector,独占一行,该行无其他非空字符串;
property,以字母开头,该行前面无其他非空字符串;
value,非该行第一个字符串,且该行第一个字符串为property或variableDef类型。
最后,再来确定每种类型的令牌对应的解析方式,实现对不同类型的令牌的判断条件和解析方式的确定。
其中,现有的进行词法分析可以逐个字符进行解析判断,考虑到源代码换行符和空格缩进会影响后续的语法解析,所以可以考虑对所述源代码进行逐行逐个单词的词法分析,其中,词法分析代码如下所示:
Figure BDA0002790177540000102
Figure BDA0002790177540000111
Figure BDA0002790177540000121
在步骤S12中完成对源代码及其中的所有字符串进行词法分析后,还需要对源代码进行语法分析,其中,所述步骤S12基于每个所述令牌对应的令牌对象结构信息,对所述源代码对应的令牌数组进行语法分析,得到所述源代码对应的抽象语法树,具体包括:
构建一个根节点,在所述根节点的属性中添加选择器节点属性;其中,所述选择器节点属性包含当前选择器的样式属性与值组成的对象属性,和子选择器节点属性;所述当前选择器的样式属性与值组成的对象属性用于指示选择器与属性之间的层级关系,所述子选择器节点属性用于指示选择器与选择器之前的层级关系;
基于每个所述令牌对应的令牌对象结构信息,按照先进先出的方式遍历所述源代码对应的令牌数组,得到所述源代码对应的抽象语法树。
例如,在进行词法分析后,下面在语法分析中进一步说明如何将词法分析中生成的令牌数组转化成抽象语法树,树结构相对于令牌数组而言,最大的特点是具有层级关系,如选择器与选择器、选择器与属性都存在层级关系,那么本申请可以分别通过children属性和rules属性来描述这两类层级关系,当然,要判断层级关系需要借助缩进空格数,所以树节点需要增加一个属性设置为indent属性。
考虑到构建树时可能会产生回溯,设置一个数组来记录当前构建路径;当遇到非父子关系的节点时,沿着当前路径往上找到其父节点;为了简化树结构,可以将变量值进行替换,从而减少变量节点。其中,构建的抽象语法树(AST)可以写成如下结构:
首先定义一个根节点,在根节点的children属性中添加选择器节点,选择器节点相对令牌而言增加了2个属性:分别为rules属性和children属性,其中,rules属性为存储当前选择器的样式属性和值组成的对象属性,用于指示选择器与属性之间的层级关系,其中,值以字符串数组的形式进行存储;children属性为子选择器节点属性,用于指示选择器与选择器之前的层级关系。即,抽象语法树(AST)的结构为:
Figure BDA0002790177540000131
Figure BDA0002790177540000141
由于考虑到一个属性的值可能会由多个令牌组成,比如border属性的值由“1px”“solid”“$borderColor”3个令牌组成,所以将value属性设置为字符串数组。
进一步地,在进行抽象语法树的构建过程中,所述步骤S12中的基于每个所述令牌对应的令牌对象结构信息,按照先进先出的方式遍历所述源代码对应的令牌数组,得到所述源代码对应的抽象语法树,具体包括:
基于每个所述令牌对应的令牌对象结构信息,按照先进先出的方式遍历所述源代码对应的令牌数组,当遇到变量时,将所述变量的变量名和对应的值存入到缓存对象中;当遇到属性时,将所述属性插入到当前的选择器节点的所述当前选择器的样式属性与值组成的对象属性(即rules属性)中;当遇到值和变量引用时,将所述值和所述变量引用插入到当前的选择器节点的所述当前选择器的样式属性与值组成的对象属性(即rules属性)中的最后一个对象的所述令牌字符内容中,其中,所述变量引用在插入之前,需借助所述缓存对象的变量值进行替换;当遇到选择器节点时,向所述选择器节点的父选择器节点的所述选择器节点属性(即children属性)中插入并将指针指向被插入的节点,同时,将所述被插入的节点添加至用于存储遍历路径的数组中,以得到所述源代码对应的抽象语法树。其中,步骤S12中的语法分析涉及的代码如下:
Figure BDA0002790177540000142
Figure BDA0002790177540000151
Figure BDA0002790177540000161
Figure BDA0002790177540000171
Figure BDA0002790177540000181
进一步地,所述步骤S13递归遍历所述抽象语法树,以完成对所述抽象语法树进行转换,得到对应的抽象语法数组及其对应的数组结构信息,包括:
递归遍历所述抽象语法树;
在遍历所述抽象语法树中的树节点时,记录当前遍历路路径;
基于所述当前遍历路径,将所述选择器进行拼接,并将所述属性值和所述变量值的值的类型的节点进行拼接,以完成对所述抽象语法树进行转换,得到对应的抽象语法数组及其对应的数组结构信息;
其中,所述数组结构信息中的每个元素对象包括两个属性参数,分别为当前规则的选择器和数组,所述数组中包含所述属性和所述值。
例如,由上面提供的目标CSS代码的结构可以看出,该目标CSS代码更像是一个由一条条样式规则组成的数组,所以本申请考虑将抽象语法树转换成抽象语法数组。在转换过程中,在遍历树节点时,需要记录当前遍历路径,以方便选择器的拼接;同时,可以考虑将“值”类型的节点(比如变量值和属性值等)拼接在一起。最后形成如下的抽象语法数组的数组结构信息,所述数组结构信息中的每个元素对象包括两个属性参数,分别为selector属性和rules属性,该selector属性为当前规则的选择器,该rules属性为数组,所述数组中包含属性property和值value,其中,为了方便后续的代码生成,将抽象语法树转换成如下的抽象语法数组的数组结构信息为:
Figure BDA0002790177540000191
在步骤S13中,递归遍历抽象语法树,遍历时完成选择器的拼接以及属性值的拼接,最终,返回一个与CSS样式规则相对应的数组,即抽象语法数组,其中,所述步骤S13中的转换过程的具体代码实现如下:
Figure BDA0002790177540000192
Figure BDA0002790177540000201
通过函数递归遍历树,然后重新拼接选择器和属性的值,最终返回抽象语法数组的数组结构信息,实现将源代码对应的抽象语法树转换成对应的抽象语法数组。
进一步地,所述步骤S14基于所述抽象语法数组对应的数组结构信息,对所述抽象语法数组进行遍历并拼接,生成目标层叠样式表CSS代码,具体包括:
基于所述抽象语法数组对应的数组结构信息,对所述抽象语法数组进行遍历,并将所述选择器、所述属性及所述值拼接成字符串,生成所述目标层叠样式表CSS代码。
例如,在步骤S13中转换成了抽象语法数组后,需要在步骤S14中基于抽象语法树进行代码的生成,其中,生成代码就只需要通过map操作对抽象语法数组进行遍历,然后将选择器、属性及值拼接成字符串返回。其中,生成的目标CSS代码的样式规则为:
Figure BDA0002790177540000211
实现了基于所述抽象语法数组对应的数组结构信息,对所述抽象语法数组进行遍历,并将所述选择器、所述属性及所述值拼接成字符串,生成所述目标层叠样式表CSS代码。
根据本申请的另一方面,还提供了一种非易失性存储介质,其上存储有计算机可读指令,所述计算机可读指令可被处理器执行时,使所述处理器实现如上述嵌套组合的预处理方法。
根据本申请的另一方面,还提供了一种嵌套组合的预处理设备,其中,该设备包括:
一个或多个处理器;
计算机可读介质,用于存储一个或多个计算机可读指令,
当所述一个或多个计算机可读指令被所述一个或多个处理器执行,使得所述一个或多个处理器实现如上述用户设备端的嵌套组合的预处理方法。
在此,所述嵌套组合的预处理设备中的各实施例的详细内容,具体可参见上述嵌套组合的预处理方法的实施例的对应部分,在此,不再赘述。
综上所述,本申请通过本申请首先获取待处理的源代码及其中的所有字符串;之后,对所述源代码及其中的所有字符串进行解析,得到所述源代码对应的抽象语法树;接着,递归遍历所述抽象语法树,以完成对所述抽象语法树进行转换,得到对应的抽象语法数组及其对应的数组结构信息;最后,基于所述抽象语法数组对应的数组结构信息,对所述抽象语法数组进行遍历并拼接,生成目标层叠样式表CSS代码,实现了通过解析、转换及生成代码来实现对源代码的预处理,使得在对源代码进行预处理的过程中,不仅效率高、灵活、维护成本低,还减少预处理过程中的出错率和编译失败率。
需要注意的是,本申请可在软件和/或软件与硬件的组合体中被实施,例如,可采用专用集成电路(ASIC)、通用目的计算机或任何其他类似硬件设备来实现。在一个实施例中,本申请的软件程序可以通过处理器执行以实现上文所述步骤或功能。同样地,本申请的软件程序(包括相关的数据结构)可以被存储到计算机可读记录介质中,例如,RAM存储器,磁或光驱动器或软磁盘及类似设备。另外,本申请的一些步骤或功能可采用硬件来实现,例如,作为与处理器配合从而执行各个步骤或功能的电路。
另外,本申请的一部分可被应用为计算机程序产品,例如计算机程序指令,当其被计算机执行时,通过该计算机的操作,可以调用或提供根据本申请的方法和/或技术方案。而调用本申请的方法的程序指令,可能被存储在固定的或可移动的记录介质中,和/或通过广播或其他信号承载媒体中的数据流而被传输,和/或被存储在根据所述程序指令运行的计算机设备的工作存储器中。在此,根据本申请的一个实施例包括一个装置,该装置包括用于存储计算机程序指令的存储器和用于执行程序指令的处理器,其中,当该计算机程序指令被该处理器执行时,触发该装置运行基于前述根据本申请的多个实施例的方法和/或技术方案。
对于本领域技术人员而言,显然本申请不限于上述示范性实施例的细节,而且在不背离本申请的精神或基本特征的情况下,能够以其他的具体形式实现本申请。因此,无论从哪一点来看,均应将实施例看作是示范性的,而且是非限制性的,本申请的范围由所附权利要求而不是上述说明限定,因此旨在将落在权利要求的等同要件的含义和范围内的所有变化涵括在本申请内。不应将权利要求中的任何附图标记视为限制所涉及的权利要求。此外,显然“包括”一词不排除其他单元或步骤,单数不排除复数。装置权利要求中陈述的多个单元或装置也可以由一个单元或装置通过软件或者硬件来实现。第一,第二等词语用来表示名称,而并不表示任何特定的顺序。

Claims (10)

1.一种嵌套组合的预处理方法,其中,所述方法包括:
获取待处理的源代码及其中的所有字符串;
对所述源代码及其中的所有字符串进行解析,得到所述源代码对应的抽象语法树;
递归遍历所述抽象语法树,以完成对所述抽象语法树进行转换,得到对应的抽象语法数组及其对应的数组结构信息;
基于所述抽象语法数组对应的数组结构信息,对所述抽象语法数组进行遍历并拼接,生成目标层叠样式表CSS代码。
2.根据权利要求1所述的方法,其中,所述对所述源代码及其中的所有字符串进行解析,得到所述源代码对应的抽象语法树,包括:
对所述源代码及其中的所有字符串进行词法分析,得到所述源代码对应的令牌数组及其中的每个令牌对应的令牌对象结构信息;
基于每个所述令牌对应的令牌对象结构信息,对所述源代码对应的令牌数组进行语法分析,得到所述源代码对应的抽象语法树。
3.根据权利要求2所述的方法,其中,所述对所述源代码及其中的所有字符串进行词法分析,得到所述源代码对应的令牌数组及其中的每个令牌对应的令牌对象结构信息,包括:
对所述源代码中的所有字符串进行分类,得到至少一种类型的令牌及每种类型的令牌对应的判断条件和解析方式;
基于每种类型的令牌对应的判断条件和解析方式,对所述源代码进行逐行逐个单词的词法分析,得到所述源代码对应的令牌数组及其中的每个令牌对应的令牌对象结构信息;
其中,每个所述令牌对应的令牌对象结构信息包括令牌类型、令牌字符内容及记录的缩进空格数。
4.根据权利要求3所述的方法,其中,所述对所述源代码中的所有字符串进行分类,得到至少一种类型的令牌,包括:
将所述源代码中的所有字符串拆分成至少一种类型的令牌,
其中,所述令牌的类型包括变量、变量值、选择器、属性及属性值,所述属性值和所述变量合并成一类进行处理,所述变量拆分成变量定义和变量引用。
5.根据权利要求4所述的方法,其中,所述基于每个所述令牌对应的令牌对象结构信息,对所述源代码对应的令牌数组进行语法分析,得到所述源代码对应的抽象语法树,包括:
构建一个根节点,在所述根节点的属性中添加选择器节点属性;其中,所述选择器节点属性包含当前选择器的样式属性与值组成的对象属性,和子选择器节点属性;所述当前选择器的样式属性与值组成的对象属性用于指示选择器与属性之间的层级关系,所述子选择器节点属性用于指示选择器与选择器之前的层级关系;
基于每个所述令牌对应的令牌对象结构信息,按照先进先出的方式遍历所述源代码对应的令牌数组,得到所述源代码对应的抽象语法树。
6.根据权利要求5所述的方法,其中,所述基于每个所述令牌对应的令牌对象结构信息,按照先进先出的方式遍历所述源代码对应的令牌数组,得到所述源代码对应的抽象语法树,包括:
基于每个所述令牌对应的令牌对象结构信息,按照先进先出的方式遍历所述源代码对应的令牌数组,当遇到变量时,将所述变量的变量名和对应的值存入到缓存对象中;
当遇到属性时,将所述属性插入到当前的选择器节点的所述当前选择器的样式属性与值组成的对象属性中;
当遇到值和变量引用时,将所述值和所述变量引用插入到当前的选择器节点的所述当前选择器的样式属性与值组成的对象属性中的最后一个对象的所述令牌字符内容中,其中,所述变量引用在插入之前,需借助所述缓存对象的变量值进行替换;
当遇到选择器节点时,向所述选择器节点的父选择器节点的所述选择器节点属性中插入并将指针指向被插入的节点,同时,将所述被插入的节点添加至用于存储遍历路径的数组中,以得到所述源代码对应的抽象语法树。
7.根据权利要求6所述的方法,其中,所述递归遍历所述抽象语法树,以完成对所述抽象语法树进行转换,得到对应的抽象语法数组及其对应的数组结构信息,包括:
递归遍历所述抽象语法树;
在遍历所述抽象语法树中的树节点时,记录当前遍历路路径;
基于所述当前遍历路径,将所述选择器进行拼接,并将所述属性值和所述变量值的值的类型的节点进行拼接,以完成对所述抽象语法树进行转换,得到对应的抽象语法数组及其对应的数组结构信息;
其中,所述数组结构信息中的每个元素对象包括两个属性参数,分别为当前规则的选择器和数组,所述数组中包含所述属性和所述值。
8.根据权利要求7所述的方法,其中,所述基于所述抽象语法数组对应的数组结构信息,对所述抽象语法数组进行遍历并拼接,生成目标层叠样式表CSS代码,包括:
基于所述抽象语法数组对应的数组结构信息,对所述抽象语法数组进行遍历,并将所述选择器、所述属性及所述值拼接成字符串,生成所述目标层叠样式表CSS代码。
9.一种非易失性存储介质,其上存储有计算机可读指令,所述计算机可读指令可被处理器执行时,使所述处理器实现如权利要求1至8中任一项所述的方法。
10.一种嵌套组合的预处理设备,其中,该设备包括:
一个或多个处理器;
计算机可读介质,用于存储一个或多个计算机可读指令,
当所述一个或多个计算机可读指令被所述一个或多个处理器执行,使得所述一个或多个处理器实现如权利要求1至8中任一项所述的方法。
CN202011312279.9A 2020-11-20 2020-11-20 一种嵌套组合的预处理方法及设备 Pending CN112363706A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202011312279.9A CN112363706A (zh) 2020-11-20 2020-11-20 一种嵌套组合的预处理方法及设备

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202011312279.9A CN112363706A (zh) 2020-11-20 2020-11-20 一种嵌套组合的预处理方法及设备

Publications (1)

Publication Number Publication Date
CN112363706A true CN112363706A (zh) 2021-02-12

Family

ID=74534385

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202011312279.9A Pending CN112363706A (zh) 2020-11-20 2020-11-20 一种嵌套组合的预处理方法及设备

Country Status (1)

Country Link
CN (1) CN112363706A (zh)

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112860264A (zh) * 2021-03-30 2021-05-28 中国工商银行股份有限公司 一种抽象语法树重构方法及装置
CN112966198A (zh) * 2021-02-25 2021-06-15 平安壹钱包电子商务有限公司 级联样式表数据生成方法、系统、计算机设备及存储介质
CN112989731A (zh) * 2021-03-22 2021-06-18 湖南大学 一种基于抽象语法树的集成电路建模获取方法及系统

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102681932A (zh) * 2012-01-19 2012-09-19 于秀山 一种检测软件异常输入处理正确性的方法
CN110543297A (zh) * 2018-05-28 2019-12-06 北京京东尚科信息技术有限公司 用于生成源码的方法和装置
CN110795099A (zh) * 2019-09-03 2020-02-14 五八有限公司 一种页面样式转换方法、装置、终端设备及存储介质
CN111240684A (zh) * 2020-01-03 2020-06-05 北京字节跳动网络技术有限公司 一种js代码的裁剪方法、装置、介质和电子设备

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102681932A (zh) * 2012-01-19 2012-09-19 于秀山 一种检测软件异常输入处理正确性的方法
CN110543297A (zh) * 2018-05-28 2019-12-06 北京京东尚科信息技术有限公司 用于生成源码的方法和装置
CN110795099A (zh) * 2019-09-03 2020-02-14 五八有限公司 一种页面样式转换方法、装置、终端设备及存储介质
CN111240684A (zh) * 2020-01-03 2020-06-05 北京字节跳动网络技术有限公司 一种js代码的裁剪方法、装置、介质和电子设备

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
JS-EVEN-JS: "从零实现一个Sass预处理器", pages 1 - 20, Retrieved from the Internet <URL:https://segmentfault.com/a/1190000022883668?utm_source=tag-newest> *

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112966198A (zh) * 2021-02-25 2021-06-15 平安壹钱包电子商务有限公司 级联样式表数据生成方法、系统、计算机设备及存储介质
CN112989731A (zh) * 2021-03-22 2021-06-18 湖南大学 一种基于抽象语法树的集成电路建模获取方法及系统
CN112989731B (zh) * 2021-03-22 2023-10-13 湖南大学 一种基于抽象语法树的集成电路建模获取方法及系统
CN112860264A (zh) * 2021-03-30 2021-05-28 中国工商银行股份有限公司 一种抽象语法树重构方法及装置
CN112860264B (zh) * 2021-03-30 2024-02-09 中国工商银行股份有限公司 一种抽象语法树重构方法及装置

Similar Documents

Publication Publication Date Title
Grune et al. Modern compiler design
CN112363706A (zh) 一种嵌套组合的预处理方法及设备
US20180150742A1 (en) Source code bug prediction
RU2610241C2 (ru) Способ и система синтеза текста на основе извлеченной информации в виде rdf-графа с использованием шаблонов
Meduna Elements of compiler design
US8769516B2 (en) Systems and methods for automated support for repairing input model errors
US20160306736A1 (en) Translation verification testing
US20080097744A1 (en) Context-free grammar
CN109471634B (zh) 源代码格式的检查方法及设备
US8478953B2 (en) Buffer snapshots from unmodifiable data piece tables
CN116627429B (zh) 一种汇编代码生成方法、装置及电子设备和存储介质
CN106843878A (zh) 一种模型生成方法和系统
CN108595334B (zh) 一种计算Java程序动态切片的方法、装置及可读存储介质
US20070168813A1 (en) System and methods for authoring domain specific rule-driven data generators
Lasser et al. CoStar: a verified ALL (*) parser
CN112699642B (zh) 复杂医疗文书的索引提取方法及装置、介质及电子设备
CN115686467A (zh) 动态语言中的类型推断
CN114816364A (zh) 基于Swagger动态生成范本文件的方法、装置及应用
CN114791808A (zh) 一种数据流图生成方法及装置
Lester et al. Information flow analysis for a dynamically typed language with staged metaprogramming
US20150293752A1 (en) Unrestricted, Fully-Source-Preserving, Concurrent, Wait-Free, Synchronization-Free, Fully-Error-Handling Frontend With Inline Schedule Of Tasks And Constant-Space Buffers
Thomasson Haskell High Performance Programming
JP2009080681A (ja) プログラム構造解析方法及び装置
Lavorato et al. LL (k) optimization of a network protocol parser generator.
CN1428721A (zh) 基于语义的机器翻译系统及方法

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
CB02 Change of applicant information

Address after: Room 1101-1103, No. 433, Songhu Road, Yangpu District, Shanghai

Applicant after: Shanghai wanwansheng Environmental Protection Technology Group Co.,Ltd.

Address before: Room 1101-1103, No. 433, Songhu Road, Yangpu District, Shanghai

Applicant before: SHANGHAI YUEYI NETWORK INFORMATION TECHNOLOGY Co.,Ltd.

CB02 Change of applicant information