当前位置: 首页 > 编程语言 > C#

在C#- .Net中解析Lua数据结构的最简单方法分享

时间:2023-04-10 16:06:59 C#

C#学习教程:在C#/.Net中解析Lua数据结构的最简单方法结构?这类似于JSON解码,除了Lua而不是javascript。在这一点上,我似乎需要自己编写,但希望已经有一些东西了。亚历山大说的。毕竟,实验室是Lua的家。具体来说,LuaInterface可以允许在你的应用程序中嵌入一个Lua解释器,这样你就可以使用Lua自己的解析器来读取数据。这类似于将Lua嵌入到C/C++应用程序中以用作配置/数据文件语言。LuaCLR项目在某些方面也可能是富有成效的,但可能不那么成熟。感谢你们俩,我使用LuaInterface找到了我要找的东西这是Lua想要读取的数据结构(“c:sample.lua”):TestValues={NumbericOneMillionth=1e-006,NumbericOnehalf=0.5,NumbericOne=1,AString="astring"}以下是一些使用LuaInterface读取Lua数据结构的示例代码:Lualua=newLua();varresult=lua.DoFile("C:\sample.lua");foreach(lua.GetTable("TestValues")中的DictionaryEntry成员){Console.WriteLine("({0}){1}={2}",member.Value.GetType().ToString(),member.Key,会员价值);以下是示例代码写入控制台的内容:(System.String)AString=astring(System.Double)NumbericOneMillionth=1E-06(System.Double)NumbericOnehalf=0.5(System.Double)NumbericOne=1forTofigure为了了解如何使用该库,我在Reflector中打开了LuaInterface.dll并搜索了成员函数。LsonLib可以解析Lua数据结构,操作它们并将结果序列化回Lua文本。全面披露:我是作者。它是纯C#并且没有依赖项。假设:MY_VAR={"Foo",["Bar"]="Baz"}ANOTHER={235,nil}基本用法:vard=LsonVars.Parse(File.ReadAllText(somefile));d["MY_VAR"][1].GetString()//返回"Foo"d["MY_VAR"]["Bar"].GetString()//返回"Baz"d["MY_VAR"][2]//throwsd["ANOTHER"][1].GetString()//throws因为它是一个intd["ANOTHER"][1].GetInt()//返回235d["ANOTHER"][2]//返回nulld["ANOTHER"][1].GetStringLenient()//返回"235"d["ANOTHER"][1]="blah";//现在{"blah",nil}d["ANOTHER"].Remove(2);//现在{"blah"}File.WriteAllText(somefile,LsonVars.ToString(d));//保存更改(它实际上是我们内部使用的JSON库的一个相当简单的端口,因此它具有更多的功能并且可能会留下一些JSON痕迹)您可能(或可能不会)在Lablua项目中找到您需要的东西。无论如何,请不要犹豫,在Lua邮件列表上提问。我还没有看到这个,现在保存一个链接:http://www.youpvp.com/blog/post/LuaParse-C-parser-for-World-of-Warcraft-saved-variable-files。ASPX不幸的是,LuaInterface仅打包为在x86上运行,因此我正在寻找其他选项。这是出处:以上是C#学习教程:C#/.Net解析Lua数据结构的最简单方法。—/**DenisBekman2009*www.youpvp.com/blog--*此代码已根据CreativeCommonsAttribution3.0美国许可获得许可。*要查看此许可证的副本,请访问http://creativecommons.org/licenses/by/3.0/us/*/使用System.Collections.Generic;使用System.Linq;使用System.Xml.Linq;使用System.IO;使用System.Text.RegularExpressions;系统网;命名空间YouPVP{公共类LuaParse{Listtoks=newList();公共字符串ID{得到;放;}publicLuaObjectVal{得到;放;}publicvoidParse(strings){stringqs=string.Format("({0}[^{0}]*{0})",""");string[]z=Regex.Split(s,qs+@"|(=)|(,)|([)|(])|({)|(})|(--[^nr]*)");foreach(z中的字符串tok){if(tok.Trim().Length!=0&&!tok.StartsWith("--")){toks.Add(tok.Trim());}}Assign();}protectedvoidAssign(){if(!IsLiteral)通过wnewException("期望标识符");ID=GetToken();如果(!IsToken("="))抛出新异常("expect'='");下一个令牌();Val=RVal();}protectedLuaObjectRVal(){if(IsToken("{"))returnLuaObject();否则如果(IsString)返回GetString();elseif(IsNumber)返回GetNumber();elseif(IsFloat)返回GetFloat();elsethrownewException("expecting'{',astringoranumber");}protectedLuaObjectLuaObject(){字典表=newDictionary();下一个令牌();while(!IsToken("}")){if(IsToken("[")){NextToken();字符串名称=GetString();如果(!IsToken("]"))thrownewException("expecting']'");下一个令牌();如果(!IsToken("="))thrownewException("expecting'='");下一个令牌();table.Add(名称,RVal());}else{table.Add(table.Count.ToString(),RVal());//array}if(!IsToken(","))thrownewException("expecting','");下一个令牌();}NextToken();返回表;}protectedboolIsLiteral{get{returnRegex.IsMatch(toks[0],"^[a-zA-Z]+[0-9a-zA-Z_]*");}}protectedboolIsString{get{returnRegex.IsMatch(toks[0],"^"([^"]*)"");}}protectedboolIsNumber{get{returnRegex.IsMatch(toks[0],@"^d+");}}protectedboolIsFloat{get{returnRegex.IsMatch(toks[0],@"^d*.d+");}}受保护的字符串GetToken(){字符串v=toks[0];toks.RemoveAt(0);返回v;}protectedLuaObjectGetString(){Matchm=Regex.Match(toks[0],"^"([^"]*)"");stringv=m.Groups[1].Captures[0].Value;toks.RemoveAt(0);returnv;}protectedLuaObjectGetNumber(){intv=Convert.ToInt32(toks[0]);toks.RemoveAt(0);returnv;}protectedLuaObjectGetFloat(){doublev=Convert.ToDouble(toks[0]);toks.RemoveAt(0);returnv;}protectedvoidNextToken(){toks.RemoveAt(0);}protectedboolIsToken(strings){返回toks[0]==s;}}publicclassLuaObject:System.Collections.IEnumerable{privateobjectluaobj;publicLuaObject(objecto){luaobj=o;}publicSystem.Collections.IEnumeratorGetEnumerator(){Dictionarydic=luaobjasDictionary;返回dic.GetEnumerator();}publicLuaObjectthis[intix]{get{Dictionarydic=luaobjasDictionary;尝试{返回dic[ix.ToString()];}catch(KeyNotFoundException){返回null;}}}publicLuaObjectthis[stringindex]{get{Dictionarydic=luaobjasDictionary;尝试{返回dic[索引];}catch(KeyNotFoundException){返回null;}}}publicstaticimplicitoperatorstring(LuaObjectm){将m.luaobj作为字符串返回;}publicstaticimplicitoperatorint(LuaObjectm){return(m.luaobjasint???0);}publicstaticimplicitoperatorLuaObject(strings){returnnewLuaObject(s);}publicstaticimplicitoperatorLuaObject(inti){returnnewLuaObject(i);}publicstaticimplicitoperatorLuaObject(doubled){returnnewLuaObject(d);}publicstaticimplicitoperatorLuaObject(Dictionarydic){returnnewLuaObject(dic);}}}本文整理自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如有转载请注明出处: