java lex,Java|Lexer分析报告

前言Lexer词法分析器,是将原始字符串转换为有意义的标记的过程。

一、词法标记类型定义

通过定义types变量,定义了普通字符串、运算符、关键字、逻辑运算符等类型。

二、词法分析规则

详情参考rules.js分析报告。

三、实现任务

1.将匹配的元素,结尾的空白字符替换为空。

2.将整段字符串拆分成不同的标记类型,并存在到新的数组中。

四、运行流程图

198653645_1_20200808013116803_wm

图1 流程图

五、关键代码展示与解释rules是一个数组,数组里面是单个对象,然后利用utils的some方法将rules数组里的每一项的regex放进去判断是否满足条件。macth是一个正则表达式匹配数组,规范化的数组元素的位置由一个条件判断语句决定,如果rule.idx有结果,则将下标值为idx的规范化,如果没有,则将第一个元素规范化。规范化是将字符串的结束位置的空白字符替换为空。下面的代码是对于repalce的判断,利用了三元运算(?:),必须要前面两个条件都为ture的情况下,才会是选择?后面的语句,其他情况都选择:后面的语句。hasOwnProperty方法是用于判断对象是否包含括号中的属性,有则返回true,没有则返回false。简而言之,只要rule里面没有repalce属性,或者rule的replace属性中没有normallized属性,都执行A的代码。如果都满足条件,则执行新的规范化。return utils.some(rule.regex, function (regex) {

var match = str.match(regex)

var normalized

if (!match) {

return

}

normalized = match[rule.idx || 0].replace(/\s*$/, '')

normalized =

rule.hasOwnProperty('replace') &&

rule.replace.hasOwnProperty(normalized)

? rule.replace[normalized]

: normalized

matched = {

match: normalized,

type: rule.type,

length: match[0].length

}

return true

})原理是利用while循环,不断截取符合条件的代码,再将截取代码存放到新的数组中(tokens[]),再将已经存放的长度减去,直到offset

var offset = 0

var tokens = []

var substr

var match

while (offset 

substr = str.substring(offset)

match = reader(substr)

offset += match.length

tokens.push(match)

}

return tokens

}END

主  编   |   张祯悦

责  编   |   王   宇where2go 团队微信号:算法与编程之美

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值