lua实现语法树的解析器和执行器 5C

match(a, 'www.home.com'),or(not(t),not(key))), lua语言,实现这个语句的解析器和执行器去执行对应的函数调用,match or not为自定义的函数关键字。

2个回答

是实现lua语言还是用Lua语言实现

shihengzhen101
AlbertS 回复lishenglong666: 用table表模拟一个栈呗,将找到的元素不断地压入栈,当发现第一个)时,调用函数将结果压入栈,继续读取内容
一年多之前 回复
lishenglong666
李生龙 你好,是用lua实现,解析and(match(a, 'www.home.com'),or(not(t),not(key))))这种函数的嵌套调用关系
一年多之前 回复

用table表模拟一个栈呗,将找到的元素不断地压入栈,当发现第一个)时,调用函数将结果压入栈,继续读取内容

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
Java9解析器和抽象语法树
Java 9 解析器和抽象语法树
方便的Lua快速执行器
可以快速执行执行目录下main.lua中的lua脚本。 当你想用lua做点什么事情,但是又嫌luaplus太慢的的时候就可以用了。
LUA语言解析器
LUA语言的源代码, 原本是编译成动态库的, 如果需要编程执行程序, 需要将文件 luac.c一起编译, 并且设置编译选项为执行程序.
lua_Console lua解析器
简单lua脚本解析器,可以解析简单的lua脚本命令。
lua库和解析器
lua库和解析器,包括:lua51.all lua51.lib lua.exe luac.exe
Lua解析器mLua.zip
介绍当下多数在java下执行lua脚本的程序都是用了luajava。然而luajava存在一些严重的问题,它会将byte数组和string等同对待,而且它的反射执行效率比较低。为了弥补这些问题,我参考luajava,重写了它的java和jni代码,并以mLua为名重新发布。特点描述和luajava类似的,mLua也有内置的全局lua函数;java对象和lua对象可以通过jni层代码进行交换。但是mLua禁止lua直接操作java对象,如果想在lua中使用java对象,必须使用内置的全局函数实现。mLua区分byte数组和string。在mLua中,java的byte数组对lua端而言,只是一个普通的userdata。在跨语言数据交换的时候,string是被复制的,因此当一个string从lua传递到java后再于lua中修改它,它在java端的对应版本并不会随着改变。将lua端的number传递给java后,会被优先解释为byte类型,否则将依照byte - short - int - long - float - double链条来尝试解释。mLua不对外暴露lua解析器实例,所有的操作都基于MLua实例完成。java端方法描述mLua的java端方法集中在MLua中:方法名称方法解释setBasedir(String)设置lua代码的最外层目录,所有lua代码都应该存放在这个目录或其子目录下pushGlobal(String, Object)设置全局lua的全局变量或函数,可以push普通的Object,或者JavaFunction。后者表示一个lua函数的java实现。只有在start方法执行前,设置的数据才会生效start(String)启动lua解析器,传递的参数表示lua代码的入口文件stop()停止lua解析器并释放资源除此之外,JavaFunction也是使用者可能需要用到的接口。它表示一个lua函数的java实现。其回调方法execute(Object[])方法会传入从lua端输入的数据,并输出一个结果传回lua端。如果方法本身不需要返回数据,则返回null即可。lua端函数描述在mLua下,lua原来的require、print函数已经被改写。requirerequire必须使用设置在java端的basedir为根目录的相对路径引用其他lua脚本:require "dir1/dir2/script1" require "script2"print支持输出一个或多个对象,但是不能将string与java对象作拼接:-- 正确的做法 -- print("hello mLua") print("context: ", getContext()) print("string " .. 111) -- 错误的做法 -- print("context: " .. getContext())通过逗号分隔的对象会在java端以tab号分隔显示操作java对象mLua也采用反射来操作java对象,不过mobTools的ReflectHelper具备缓存功能,理论上会比luajava每次直接反射更快。mLua提供了如下的内置函数:函数名称函数解释import(className)向ReflectHelper类缓存中导入一个类,此函数将返回一个string,用于后续代码从缓存中重新获取导入的类实例import(name, className)向ReflectHelper类缓存中导入一个类,并将此缓存的key设置为指定名称new(className, ...)构造一个java实例,参数className是import函数的返回值,后续参数为java构造方法的输入参数invokeStatic(className, methodName, ...)调用一个java的静态方法invoke(receiver, methodName, ...)调用一个Java的实例方法getStatic(className, fieldName)获取一个java的静态字段setStatic(className, fieldName, value)设置一个java的静态字段get(receiver, fieldName)获取一个java的实例字段set(receiver, fieldName, value)设置一个java的实例字段createProxy(proxyTable, ...)构造一个java接口代理。参数proxyTable是一个lua的table,其中的key必须与java接口类的方法名称相同,key对应的value是一个lua的function,function的参数列表和返回值也必须与java接口相同。proxyTable后的参数是被实现的接口列表名称,皆为string,由import函数返回。此函数将返回一个java接口代理实例,可将此实例传回java端并进行操作,当实例中的接口函数被调用时,mLua会调用proxyTable中的对应funtion代码完成操作例子java端代码public class MainActivity extends Activity {     private MLua lua;     protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         // 构造一个解析器实例         lua = new MLua();         // 设置lua代码存放位置         lua.setBasedir("/sdcard/mLua/LuaTest");         // push全局对象         lua.pushGlobal("getContext", new JavaFunction() {             public Object execute(Object[] args) throws Throwable {                 return getApplication();             }         });         try {             // 启动解析器,设置main.lua为入口代码             lua.start("main");         } catch (Throwable e) {             e.printStackTrace();         }     }     protected void onDestroy() {         // 关闭解析器         lua.stop();         super.onDestroy();     } }lua端代码-- 导入ReflectHelper.ReflectRunnable类,并命名为ReflectRunnable -- import("ReflectRunnable", "com.mob.tools.utils.ReflectHelper$ReflectRunnable") local function main()   -- 演示print和invoke --   print("hello world from mLua")   local context = getContext()   print("current context: ", context)   local packageName = invoke(context, "getPackageName")   print("packageName: ", packageName)   -- 演示java接口代理 --   local luaCode = {     run = function(arg)       print("luaCode.run(), input: ", arg)       return "yoyoyo"     end   }   local proxy = createProxy(luaCode, "ReflectRunnable")   local res = invoke(proxy, "run", packageName)   print("luaCode.run(), output: ", res)   -- 演示数组复制 --   local bArray = new("[B", 16)   for i = 0, 15 do     set(bArray, "[" .. i .. "]", i   1)   end   local bArray2 = new("[B", get(bArray, "length"))   invokeStatic("System", "arraycopy", bArray, 0, bArray2, 0, 16)   for i = 0, 15 do     print("bArray2[" .. i .. "]: ", get(bArray2, "[" .. i .. "]"))   end end main()扩展mLua默认只能从文件系统中加载lua代码,但是如果对MLua的setBasedir方法进行重写,以其他的方式实现SourceLoader,则可以加载任意方式的lua代码,包括assets中的,和加密的。 标签:mLua
用JavaScript实现一门编程语言 3-1 (解析器之抽象语法树)
抽象语法树(AST)正如前面提到的,解析器会建立一个结构来表示程序的语义。AST节点是一个普通的JavaScript对象,它有一个类型属性,指定它是什么类型的节点,以及根据特定类型指定的附加信息。 总览: num{ type: "num", value: NUMBER } str{ type: "str", value: STRING } bool{ type: "bool", value: ...
语法树
scidb::parser::Translator::passGeneralizedJoin scidb::parser::Translator::passGeneralizedJoinOnClause scidb::OperatorLibrary::createLogicalOperator Inferred schema for operator scan
python中嵌入lua解析器
一、引言上一周应该某个特殊需求。需要在服务器端搭建一个lua执行环境。lua本身又是嵌入语言。在语言本身上又一定的局限性。所以我打算把lua嵌入到python/java中。做调研的时候,java的嵌入较为麻烦,出现了各种问题。后来确定用python来作这个环境。这样能用上python 的协程、多线程。这里说说python中嵌入lua的问题。二、环境建立python中又一个扩展叫lupa。这个扩展用于
LuaProject lua源码编译出来的解析器
LuaProjectLuaProjectLuaProjectLuaProject
编译原理语法树的实现
编译原理语法树的实现~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
执行器,现代执行器技术
详细介绍执行器,现代执行器技术,是在电动执行器开发时很好的参考资料
本人转载 在此申明 语法树 c 实现 四则运算语法树
转载的四则运算语法树 转载的四则运算语法树 转载的四则运算语法树 转载的四则运算语法树 转载的四则运算语法树 转载的四则运算语法树 想删除 不知道怎样做 有知道者望回复我
lua 5.2.3 win编译器 解析器 动态和静态库
本资源是通过VS生成的lua 5.2.3版本的编译器、解析器、动态和静态库, 包含文件lua.dll lua.exe luac.exe lua.lib 适合在win系统使用。 搭配的博文地址是:http://blog.csdn.net/u013174689/article/details/38583669
抽象语法树
Microsoft Windows [ 6.1.7601] GNU Bison [2.4.1] 今天在编抽象语法树时遇到一个error: parser.y:21-47:语法错误,非预期的{…} 错误原因是: 在parser.y的语法定义部分,使用了之前没有声明过的非终结符。...
SQL语法树
1. 为什么会出现SQL语法树? 假设有一个SQL语句 select name,age,count(name) as count_name, count(id) as count_id from mytable where id = ? and name = ? 这是一条sql语句,如果你想运行这个语句(下面写伪代码,具体实现肯定不是这样的但是这是人实现的思想) 1.找到数据库表m...
语法树的求解
1.根据输入的表达式建立语法树rn2.对语法树求解,得出表达式的值
编译语法树
编译课的作业,经典的语法树的推导过程源代码,用.NET下的C#写的
eclipse 语法树
eclipse中,可以使用Ast解析java源代码,得到其中的变量,函数等等属性。反过来怎样做才能根据一行代码的行号或内容,取得这行代码属于什么函数?不通过editor.
关于语法树
有谁知道语法树是怎么一会事,到现在还是不懂啊!rn有那位大虾具体的讲一下,最好是举一个具体的例子,谢谢!!!!!!!!!!
执行器的安装
轻量级分布式任务调度框架,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。运行报表、失败处理策略、动态分片、事件触发、完整的阻塞处理策略、路由策略
定时任务执行器
定时任务执行器
执行器技术
执行器介绍、基本电动执行器以及工作原理等。
执行器技术资料
执行器的设计、发展、未来趋势包括计算的毕业设计
【Lua】观察者模式在Lua中的实现
--LUA对于观察者模式的实现 --被观察者表 Subject = {} --类似父类,具体对于lua面向对象编程思想学习看这里: --http://www.jb51.net/article/55724.htm function Subject:new(obj) obj = obj or {} setmetatable(obj, self) --实例化对象指向Subject,这样就以Sub
Lua实现特殊字符过滤.lua
Lua语言实现特殊字符过滤,对于使用Lua开发移动端游戏的童鞋非常常用。代码亲测有效,附使用实例
java实现----sql解析器
更新中!!!!!!首先我们项目要编写一个小型的dbms。所以我负责编写的sql解析的部分。所以本文只是记录我学习和编写sql解析器的过程。-----------------------------------------------------------------------------------------------------------------------------------...
行为型模式之解析器模式实现
一些应用提供了内建(Build-In)的脚本或者宏语言来让用户定义他们能够在系统中进行的操作。 Interpreter模式的目的就是使用一个解释器为用户提供一个一门定义语言的语法表示的解释器,然后通过解释器来解释语言中的句子。
Java实现Json解析器
在开始正文之前,先啰嗦几句昂,说说我的学习过程(大家可以参考来给自己定个小计划),万事开头难,我开始在网上找资料就花了很长时间,而且资料太多,众说纷纭…但是最后找到了一位大牛的,真的写的超级好,超级详细,虽然他是用C语言写的,哈哈~就这样我跟着大牛的文档和代码写了一边C语言的JSON后,对JSON的语法以及实现有了一个初级的了解,然后,我就开始着手写Java版的Json,emmm…在写之前,为了看...
MIME解析器如何实现
MIME解析器如何实现?对MIME解析器的实现要知道哪些知识、文档、协议等!有知道的告一声! 谢谢!
实现一个JSON解析器
JSON JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。 JSON与JS的区别以及和...
java实现JSON解析器
对json数据格式进行词法分析,JSON数据格式一般分为String,Boolean,{,},null,[,],:, , 等,将其分解成为多个Token 对Token进行顺序的语义分析(通过递归实现,可以将Token分为map,array分为数组对象和字典对象) 最后返回object对象,即可完成json数据转为java对象格式 代码实现: https://github.com/yk2945247
[java]实现Brainfuc解析器
利用java实现了Brainfuc语言的解析器
NodeJS之域名解析器实现
之前草草的了解了下Nodejs, 只是大体知道Nodejs类似于一个JavaScript解析器,可以跑JS代码,但是并没有真正去使用Nodejs,且对其理解并不深,所以打算整体学一学Nodejs。 整个学习过程是沿着“Nodejs开发实战详解–黄丹华”这本书来看的,目前学习了Nodejs的模块,分为内建模块和文件模块。并且书中有一个DNS域名解析器的实现,自己动手也做了做,这里想做下整理和总结。
Jframe实现身份证解析器
package idcheck; import java.awt.*; import java.awt.event.*; import java.awt.image.BufferedImage; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.*; import java.i
电动执行器
361电动执行器说明书 361系列电动执行器
191day(执行器)
陈国佳总结《2018年4月20日》【连续191天】 标题:执行器; 内容: 1. 构建一个新的线程是有一定代价的, 因为涉及与操作系统的交互。如果程序中创建了大 量的生命期很短的线程,应该使用线程池( thread pool )。一个线程池中包含许多准备运行的 空闲线程。将Runnable 对象交给线程池, 就会有一个线程调用run 方法。当run 方法退出 时, 线程不会死亡,而是
14.9 执行器
大量生命周期很短的线程,应该使用线程池。另一方面,线程池限定了线程的总数,避免由于产生大量线程而导致性能降低。1 线程池import java.io.*; import java.util.*; import java.util.concurrent.*;/** * @version 1.02 2015-06-21 * @author Cay Horstmann */ public class
Java源码分析执行器
Java源码分析执行器(2009-5-1) 一、功能及模块: 1. 识别java源码的语法结构,生成结点类型为具体源码成份的结点树。 2. 解析Java源码并从指定的方法入口处开始执行,在执行的过程中可以执行外部插入的执行逻辑。类似于AOP,但所截获的目标可以是方法也可以是任意细粒度的代码。 3. 解析Java源码并从指定的方法入口处开始执行,在执行过程中对不合理的代码进行预警。预警功能是我兴趣所在,亦将得到大力加强。 4. 静态处理: ① 对源码进行合法性检查,以保证其符合具体项目中的要求。类似于Java代码缺陷自动分析工具“Findbugs”. ② 执行某些复杂的重构任务,如将数组改为java.util.List,改变方法调用中的参数秩序,如将方法count(int a, String b)改写为count(String b, int a)。 二、术语: 1. 语法树: Java源码的语法树由若干小规模的语法树合并而成。抽象语法树在本质上是图而非树。 2. 匹配树:是一颗严格的树。由匹配引擎参照语法树对源码代码进行识别后生成。 3. 匹配树的JavaBean化: 匹配树描述了源码的静态形式。其bean化过程即对其中不同的源码成分生成相应的JvaBean并在Bean中实现针对性的运行逻辑,并在此基础上实现对Java代码的动态解释执行。(请参见源码包bugsfind.bean.*) 4. 结点类型:典型的结点类型有IfElse, For, DoWhile, Mehtod, Block, Expression(表达式)等等。 5. 有源Bean及无源类, 实际项目中,并非所有类都有源码,需要解决有源系统同无源系统之间的交互问题。……对有源码的类生成相应的有源Bean……在读取源码并步步执行的过程中,当遇见无源类(不存在源码的类)时,需保证有源bean及无源类共享它们所共同操作的数据。  有源Bean有对应的无源对象,这使得无源类可以调用有源Bean。  有源Bean可直接调用无源类, 因为有源Bean的调用细节是透明的,可以针对具体的计算细节采用具体的方法: ①运算符计算,如: a+=2, b!=c+d,...可通过字符串分析来等价实现。 ②系统功能调用,如文件读写,屏幕输出, ...可通过反射机制来行等价实现。 ③数据在不同的数据结构间的转移。如List.toArray(),...可通过反射机制来行等价实现。 三、当前开发状态: 此项目的结构、以及细节已基本成形, 有待于进行全面测试以及进一步在功能上进行扩展。 请参见测试案例 demo.TestCase_all.java, demo.TestCase_typical.java. 通过对以上测试案例及相关测试对象的改写,有助于进一步了解此项目。 反射机制的能力也是有限的,要保证大程序的正确运行,需要对源代码做部分变化,但这样的变化可以做到无损的或者可逆。主要的变化如:对其它包下的非公有的内部类明确生成构造函数, 否则反射机制无法运行其构造函数。 四、测试案例: //java version: jdk1.5.0_04 解压本项目后,点击项目根目录下的批处理文件startDemo.bat 可运行一个简洁的测试案例。 bugsfind.demo和bugsfind.test包下有更详细的测试案例。——运行之前需导入工程到eclipse中,然后修改配置文件bugsfind._config.config.properties,将sourceCodeLocation参数值设为当前工程的源代码根目录路径。 ------------- 若有赐教,请联系: 作者: weilai2@163.com, 电话: 15800633163, 中国上海(浦东), 10:46 2009-5-1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ end
emulate执行器
go-back-n 执行器,用于仿真控制执行,很方便的说
相关热词 c# stream 复制 android c# c#监测窗口句柄 c# md5 引用 c# 判断tabtip 自己写个浏览器程序c# c# 字符串变成整数数组 c#语言编程写出一个方法 c# 转盘抽奖 c#选中treeview