我希望使用Java以如下格式读取数据。
[scenario]
id=my_first_scenario
next_scenario=null
name=_"My First Scenario."
map_data="{~add-ons/my_first_campaign/maps/my_first_map.map}"
turns=30
[side]
side=1
controller=human
team_name="good"
user_team_name= _ "My Team"
id=MyLeader
name= _ "My Leader's Name"
type="Elvish Ranger"
unrenameable=yes
canrecruit=yes
recruit="Elvish Fighter, Elvish Archer, Elvish Shaman"
gold=100
[/side]
[side]
side=2
controller=ai
team_name="bad"
user_team_name= _ "Bad Guys"
id="EnemyLeader"
name= _ "My Villain"
type= "Orcish Warrior"
unrenameable=yes
canrecruit=yes
recruit="Orcish Grunt, Orcish Archer, Orcish Assassin, Wolf Rider"
gold=100
[/side]
[/scenario]我想要开发一个API,它可以以通用的方式读取这样的内容,例如,有像getChildren、getAttributes这样的方法。我想知道是否有支持这类任务的库。
以下是我想出的,
对于任何感兴趣的人来说,这种标记语言是在一个名为为卫斯诺思而战的游戏中使用的,它是在c++中使用的。我想使用Java解析这些数据。
发布于 2016-10-25 06:31:31
游戏是开源软件,所以您应该下载源代码,找到解析源代码的代码,或者将其从C++移植到Java,或者以某种方式将C++组件添加到项目中。后者可能更好,因为如果它们更改或扩展标记语言,它将使您能够轻松地合并来自游戏的更新。
这很可能比尝试编写自己的解析器容易得多。这看起来像是一种非常复杂的定制标记语言,基于它们的文档。
此外,它可能是值得联系游戏的开发团队,并获得一些反馈,你的想法。这可能是他们感兴趣的事情,或者他们可能至少有一些关于如何继续下去的建议。
假设您只想捕获type=[value]的所有情况。看起来很简单,对吧?很遗憾,我不会。用户可以定义如下宏:
#define OOPS_YOUR_CODE_BROKE X
[unit]
type=X
[/unit]
#enddef
{OOPS_YOUR_CODE_BROKE 23}这相当于:
[unit]
type=23
[/unit]因此,即使是最简单的捕获也需要理解整个语法,如果您希望它完全正确的话。
发布于 2016-10-25 06:24:46
我只需要编写自己的解析器,因为实际上只有两(3)种可能的情况是由一行中的第一个非空白字符标识的:
也只使用原始文本解析。使用正则表达式将花费很少的收益,海事组织。
发布于 2016-10-25 11:12:45
这种格式类似于YAML。考虑使用正则表达式和标准的YAML解析器转换为YAML。您需要对可翻译的文本进行编码,该文本由下划线和ID表示(非引用文本文本)。
https://softwareengineering.stackexchange.com/questions/334520
复制相似问题