欢迎点击「算法与编程之美」↑关注我们!

本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章。

欢迎加入团队圈子!与作者面对面!直接点击!

前言

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

一、词法标记类型定义

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

二、词法分析规则

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

三、实现任务

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

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

四、运行流程图

Java|Lexer分析报告

图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<str.length的条件不再满足。循环结束。

offset的初始长度是0,该变量表示拆分好的字符串的总长度。str.length是字符串的原始长度。

substr表示新的字符串,substring() 方法用于提取字符串中介于两个指定下标之间的字符。

Match表示每次将新的字符串用reader()函数,返回新的标记对象。

最后,tokens[]用于存放拆分后的字符串。

push() 方法可向数组的末尾添加一个或多个元素,并返回新的长度。

exports.read = function (str) {

  var offset = 0

  var tokens = []

  var substr

  var match

  while (offset < str.length) {

    

    substr = str.substring(offset)

    match = reader(substr)

   

    offset += match.length

    

    tokens.push(match)

  }

  return tokens

}

END

主  编   |   张祯悦

责  编   |   王   宇

 where2go 团队


   

微信号:算法与编程之美          

Java|Lexer分析报告

长按识别二维码关注我们!

温馨提示:点击页面右下角“写留言”发表评论,期待您的参与!期待您的转发!

相关文章:

  • 2021-09-12
  • 2021-09-07
  • 2022-01-16
  • 2021-06-09
  • 2022-01-07
  • 2021-07-22
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-06-14
  • 2021-12-04
  • 2022-12-23
  • 2021-07-25
  • 2021-09-11
  • 2021-10-13
  • 2021-10-03
相关资源
相似解决方案