【Lua篇】静态代码扫描分析(三)语法分析

本文涉及的产品
云解析DNS,个人版 1个月
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: 一、语法分析 通过将词法分析获取的Token流按照目标语言的语法进行解析的过程,例如解析函数声明、函数调用、变量声明、各种语句等。二、Lua语法分析 在写语法分析程序前,先需要了解Lua的语句和语法,然后进行逐个解析。下面简单列举一下Lua的语句:

【Lua篇】静态代码扫描分析(三)语法分析


微信图片_20220424141558.png


一、语法分析


   通过将词法分析获取的Token流按照目标语言的语法进行解析的过程,例如解析函数声明、函数调用、变量声明、各种语句等。


二、Lua语法分析


   在写语法分析程序前,先需要了解Lua的语句和语法,然后进行逐个解析。

下面简单列举一下Lua的语句:


   1. 函数定义


-- 普通的函数声明
function demo1()  
--  <函数体>
end
-- 类方法
function t.demo2(self)
--  <函数体>
end
-- 方法调用中的匿名函数(其实还有很多)
some_method_call(arg1, function() <callback> end)


   2. 函数调用


-- 普通的函数调用
print("Hello Lua")
-- 模块方法
math.random(1,2)
-- 类方法
obj:set_id(xx)


   3. 赋值语句


-- 带local局部变量声明赋值
local a = 1
-- 多变量
local a,b,c = 2,3
-- 全局的变量
g_a = 3
-- 赋值可以是函数、函数调用、表等
g_c,g_b = {}, function() end


   4. 条件分支


-- if条件分支
if a > 1 then
elseif a > 2 then
else 
end


   5. for循环


-- for循环
for i=1,10,2 do
end


   6. for迭代器


-- 迭代包含in pairs 和 in ipairs
for k,v in pairs(tb) do
end


  7. while循环


-- while循环,条件可以很复杂
while a >1 and b > 1 do
end


   8. repeat until 循环


repeat
until a > 1


   上面仅仅简单了进行了举例,实际上项目中的写法是千奇百怪的,因此需要确保包含所有的语法规则。在进行语法解析的时候,首先进行代码块的解析,可以把一个文件看作整个代码块,里面包含各种的语句。然后其实是逐语句解析,先取出一个Token,判断这个Token的类型,然后决定更细规则的解析,就像下面代码列举的过程一样。


  1. 语法解析的入口,调用block解析。


def parse(self):
  self._TokenNum = self.mTokens
  block = self.on_block_parse()
  return block


   2. 对block解析的时候,实际是循环调用逐语句解析,直到匹配到语句块结束标记。


def on_block_parse(self):
  token = self.get_token()
  statements = []
  while token is not None:
    # until,else,elseif,end
    if self.is_end_token(token):
      self.put_token()
      break
    # 语句解析
    statement = self.on_statement_parse(token)
    if not statement:
      break
    statements.append(statement)
    token = self.get_token()
  return Block(statements)


   3. 逐语句解析就是获取Token的类型,并调用对应类型的解析方法。


def on_statement_parse(self, token):
  # 函数
  if token.tokenType == T.FUNCTION:
      return self.on_function_parse(token)
  # for .. in .. do .. end
  elif token.tokenType == T.FOR:
      return self.on_for_parse(token)
  # while .. do .. end
  elif token.tokenType == T.WHILE:
      return self.on_while_parse(token)
  # repeat ... until xx
  elif token.tokenType == T.REPEAT:
      return self.on_repeat_parse(token)
  # if .. elseif ... else .. end
  elif token.tokenType == T.IF:
      return self.on_if_parse(token)
  # do ... end
  elif token.tokenType == T.DO:
      return self.on_do_parse(token)
  # local xx
  elif token.tokenType == T.LOCAL:
      return self.on_local_parse(token)
  # return xxx
  elif token.tokenType == T.RETURN:
      return self.on_return_parse(token)
  else:
      return self.on_expression_parse(token)


   4. 列举一下while循环的解析,其中会调用表达式解析while的条件,调用block解析while的语句体,然后检查是否有end。基本上其他的语句也是按照这样的方式进行分析与解析。  


def on_while_parse(self, token):
  """ while 循环 """
  # while <condition> do
  exp = self.on_expression_parse(self.get_token())
  if not exp:
    self.print_syntax_error(token)
    return None
  next_token = self.get_token()
  if next_token.text != 'do':
    self.print_syntax_error(next_token)
    return 
  body = self.on_block_parse()
  next_token = self.get_token()
  if next_token.text != 'end':
    self.print_syntax_error(next_token)
    return None
  while_statement = LNodeWhile(token.lineno, exp, body)
  return while_statement


三、总结


   通过上面的简单介绍,不知可能上手写一写呢?将所有的语句都解析完成后,接下来就是进行静态代码扫描了。如果是使用C或者C++写的话,完全可以从Lua的源码中提取上面的词法和语法解析内容,而直接进行代码规则扫描检查的编写。


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


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