【Lua篇】静态代码扫描分析(二)词法分析

简介: 词法分析(英语:lexical analysis)是计算机科学中将字符序列转换为单词(Token)序列的过程。进行词法分析的程序或者函数叫作词法分析器(Lexical analyzer,简称Lexer),也叫扫描器(Scanner)。词法分析器一般以函数的形式存在,供语法分析器调用。

【Lua篇】静态代码扫描分析(二)词法分析


微信图片_20220424140317.png


一、词法分析


   词法分析(英语:lexical analysis)是计算机科学中将字符序列转换为单词(Token)序列的过程。进行词法分析的程序或者函数叫作词法分析器(Lexical analyzer,简称Lexer),也叫扫描器(Scanner)。词法分析器一般以函数的形式存在,供语法分析器调用。


二、Lua词法分析器


   首先需要读取Lua文件中的内容,然后逐字符读取进行判断组合成一个一个的单词。判断单词就需要了解Lua语言中的数据类型,具体如下:


  1.    变量标识符


  1. 单个字符 例如a = 1中的“a”
  2. 多个字符 例如 player
  3. 下划线开头 例如 _key
  4. 字符和数字组合  例如 key123_key23


  1.    数字


  1. 整数 例如 12302021
  2. 小数    例如 3.1415926.41
  3. 十六进制  例如 0x00440XFF1A0xab12
  4. 科学计数法 例如 2e-20.2e+1


  1.    字符串


  1. 双引号 "Hello Lua"
  2. 单引号 'abcd'
  3. 双中括号(多行) [[xxzz]]


  1.    关键字


  1.    本质上可以和标识符合并,然后读取出来后再进行匹配。


  1.    操作符号


  1. 算术运算 +-*/%
  2. 比较运算 ><==>=<=
  3. 赋值运算 “=”
  4. 位运算
  5. 字符串连接符  “..”


  1.    注释


  1. 单行注释  以 “--”开始 到 行末
  2. 多行注释 “--[[” 开始 到 “]]” 结束


   大体了解了Lua语言的组成后,就可以开始编写词法分析程序了,下面展示了部分代码用于说明整个词法分析的过程。


   1) 首先需要写字符的处理方法。get_char 用于从字符流中取出下一个字符;peek_char 返回下一个字符但不从字符流中取出;put_char 将取出的字符放回去。


def get_char(self):
  """ 取出下1个字符 """
  if self._Index + 1 < self._FileSize:
      self._Index += 1
      return self._StreamBuff[self._Index]
  else:
      return None
def peek_char(self):
  """ 获取下1个字符,但不取出 """
  if self._Index + 1 < self._FileSize:
      return self._StreamBuff[self._Index + 1]
  return None
def put_char(self):
  """ 回退获取的字符 """
  if self._Index > -1:
      self._Index -= 1



  2) 识别并组成一个Token单词。循环获取字符,并进行逐个条件判断,最终形成一个单词(Token)。需要注意数字和字符的组合、减号、小数点等的判断。


def parse_read_token(self):
  c = self.get_char()
  token_str = ""
  token_type = TokenType.L_EOF
  while c is not None:
    if c in TokenType.SkipWords:
      c = self.get_char()
      continue
    elif c.isdigit(): # ....
    elif c.isalpha() or c == '_':
    elif c == '.': # ....
    elif c == '\"' or c == "\'": # 字符串
    elif c == '[': # 区分[ 和 [[
    elif c == '{': # ....
    elif c == '(': # ....
    elif c == ']': # ....
    elif c == '}': # ....
    elif c == ')': # ....
    elif c in TokenType.Operators: # ....
    else: # error
    c = self.get_char()
  return Token(token_type, token_str)


  3)循环读取全部的Token直到文件字符数据流结尾。


def parse(self):
  while True:
    token = self.parse_read_token()
    if token.tokenType == TokenType.L_ERROR:
      return False
    elif token.tokenType == TokenType.L_EOF:
      break
    elif token.tokenType != TokenType.L_COMMENT:
      self.mTokens.append(token)
  return True


三、总结


   通过上面的几步就可以完成对Lua文件中的字符流进行分析,然后组成Token流。Token流将会是语法分析的输入内容。以上就是Lua词法分析的内容,写完分析程序后还需要多调试,使用不同风格编写的Lua代码文件进行测试。


欢迎微信搜索"游戏测试开发"关注一起沟通交流。

相关文章
|
6月前
|
C++ 索引 Python
Lua中self 、自索引及其面向对象应用代码示例
Lua中self 、自索引及其面向对象应用代码示例
|
5月前
|
监控 数据处理 开发者
利用Lua代码简化局域网管理软件开发
使用Lua脚本语言可以提升局域网管理软件的开发效率和代码可维护性。示例包括:使用LuaSocket扫描局域网设备;通过动态加载和应用配置文件展示配置管理;利用实时监控功能,当网络流量超过阈值时触发警报;以及通过HTTP POST自动提交监控数据到服务器。Lua的简洁语法和强大功能简化了网络管理和自动化任务。
111 3
|
5月前
|
数据挖掘 Linux 数据处理
探索Linux下的Lua命令:轻量级脚本语言在数据处理和分析中的应用
**探索Linux上的Lua:轻量级脚本语言用于数据处理。Lua通过命令行解释器执行,适用于游戏开发、数据分析及自动化。特点包括小巧、高效、可扩展和动态类型。使用`lua`或`luajit`,配合-e、-l、-i参数执行脚本或互动模式。示例:执行`hello.lua`脚本打印&quot;Hello, Lua!&quot;。最佳实践涉及版本兼容、性能优化、使用C API、测试和文档编写。**
|
5月前
|
JSON 监控 数据格式
使用Lua代码扩展上网行为管理软件的脚本功能
本文介绍了如何使用Lua脚本增强上网行为管理,包括过滤URL、记录用户访问日志、控制带宽和自动提交监控数据到网站。Lua是一种轻量级语言,适合编写扩展脚本。文中提供多个示例代码,如URL过滤器、用户活动日志记录器和带宽控制器,帮助用户根据需求定制网络管理功能。通过这些示例,用户可以快速掌握Lua在上网行为管理中的应用。
174 4
|
6月前
|
存储 监控 数据管理
Lua代码解析:实现上网行为监管软件的自定义规则引擎
在当今数字化时代,网络安全和数据隐私保护备受关注。为了确保网络安全和合规性,许多组织和机构需要监管和管理其员工或用户的上网行为。为了实现这一目标,开发一款高效的上网行为监管软件至关重要。本文将介绍如何使用Lua语言开发一种自定义规则引擎,以实现上网行为监管软件的自定义规则引擎。
226 0
|
JavaScript 前端开发 C++
[√]lua binding模版文件分析
[√]lua binding模版文件分析
79 0
|
网络协议 C语言
Wireshark lua dissector 对TCP消息包合并分析
Wireshark lua dissector 对TCP消息包合并分析
822 0
|
C++
[✔️]unreal插件lua-profiler:分析lua性能
[✔️]unreal插件lua-profiler:分析lua性能
364 0
|
消息中间件 数据采集 Java
Lua集成kafka第三方插件代码介绍|学习笔记
快速学习Lua集成kafka第三方插件代码介绍
Lua集成kafka第三方插件代码介绍|学习笔记