V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  r1nice  ›  全部回复第 1 页 / 共 1 页
回复总数  4
2023-03-17 17:02:27 +08:00
回复了 r1nice 创建的主题 Kotlin ​ Java /kotlin AST 构建相关,悬赏 200 求解,人已经麻了
@Zakl21 两种输入:json 和字符串,我手敲一个好了
selectMonsterByName(StringConstant("zombie")).getAttribute(AttributeConstant("Dex")).plus(IntParam("test")).divide(Constant(3))
获取名称为 zombie 的僵尸,如果存在就获取其僵尸属性(否则就 throw),返回(他的敏捷数值+输入的,key 为 test 的数值)/3 的数值
在 json 里的表达:

{
name : divide
left:{
name:plus
left:{
name:get_attribute
left:{
name:select_monster_by_name
left:{
name:string_constant
value:"zombie"
}
right:null
}
right:{
name:attribute_constant
value:Dex
}
}
right:{
name:int_param
value:"test"
}
}
right:{
name:int_constant
value:3
}
}
2023-03-17 16:51:30 +08:00
回复了 r1nice 创建的主题 Kotlin ​ Java /kotlin AST 构建相关,悬赏 200 求解,人已经麻了
@wuych 不行,必须要进行序列化和反序列化,做到 ast 的永久化,否则这个系统搞不定任何事
2023-03-17 13:20:29 +08:00
回复了 r1nice 创建的主题 Kotlin ​ Java /kotlin AST 构建相关,悬赏 200 求解,人已经麻了
@liuhan907 需求:让一个游戏的玩家可以通过 json 或者 string 字符串类型的输入,来使用受限制的符号自定义一个 function ,并能将这个 function 序列化和反序列化塞进 mysql 里
不能更换语言的原因纯粹是我这边时间和精力不足以及成本太高,我只会 java 和 kotlin ,而且项目的代码除了 ast 外已经基本搞定了,如果要直接推倒重来成本完全不可接受,只能硬刚
2023-03-16 23:33:05 +08:00
回复了 r1nice 创建的主题 Kotlin ​ Java /kotlin AST 构建相关,悬赏 200 求解,人已经麻了
@iseki 新人,没怎么用过 V2EX ,不清楚怎么 po 代码,这里先放个 github 链接:https://github.com/RiniceSiberia/Co2Dice/tree/master/src/main/java/org/co2dice/mirai/ast

以下是文字版代码

interface AstNode <
O
//输出
> {
val name : String

fun operation(param : Map<String,Any>):O
//这个节点的运算方式,计算这个节点的运算结果

fun vacancy() : Boolean
//用来检查能否被插入一个新节点

abstract fun getChild() : List<AstNode<*>>
//获取所有子节点

fun dfs(find : () -> Boolean) : AstNode<*>? {
if (find()) {
return this
}
for (child in getChild()) {
val result = child.dfs(find)
if (result != null) {
return result
}
}
return null
}

}

abstract class LeafNode<O,V>() : AstNode<O> {
abstract var value : V

override fun vacancy(): Boolean {
return false
}

override fun getChild(): List<AstNode<*>> {
return emptyList()
}
}
abstract class BranchNode<T>() : AstNode<T> {

}

abstract class SingleChildNode<I,O> : BranchNode<O>() {
abstract var child : AstNode<I>

override fun vacancy(): Boolean {
return child !is PlaceholderNode
}

override fun getChild(): List<AstNode<I>> {
return listOf(child)
}

}
abstract class PairChildNode<LI,RI,O> : BranchNode<O>() {
abstract var left : AstNode<LI>
//左节点
abstract var right : AstNode<RI>
//右节点

override fun vacancy(): Boolean {
return (left is PlaceholderNode) || (right is PlaceholderNode)
}
override fun getChild(): List<AstNode<*>> {
return listOfNotNull(left,right)
}
abstract class ListChildNode<I,T>(
var childs: MutableList<AstNode<I>> = mutableListOf()
) : BranchNode<List<T>>() {

override fun getChild(): List<AstNode<I>> {
return childs
}

override fun vacancy(): Boolean {
return true
}

}
abstract class EqualsNode<T>(
override var left : AstNode<T>,
override var right : AstNode<T>,
) : PairChildNode<T, T, Boolean>() {


override fun operation(param : Map<String,Any>) : Boolean{
return left.operation(param) == right.operation(param)
}

override fun toString(): String {
return "=="
}
}
class NumberEqualsNode(
left : AstNode<Int> = NumberPlaceholderNode(),
right : AstNode<Int> = NumberPlaceholderNode(),
) : EqualsNode<Int>(left,right) {
override val name: String = Symbols.NUMBER_EQUALS.name
}
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5425 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 10ms · UTC 07:39 · PVG 15:39 · LAX 23:39 · JFK 02:39
Developed with CodeLauncher
♥ Do have faith in what you're doing.