junli110 2019-07-24 17:13 采纳率: 100%
浏览 354
已采纳

开发一个股票技术指标编辑语言 的编译器,遇到一个 array (数组) 做为 if 语句 条件的情况实现不了

开发一个股票技术指标编辑语言 的编译器,遇到一个 array (数组) 做为 if 语句 条件的情况实现不了
语法都参考 tradingview 的 Pine script
Pine script

//@version=3
study("For Loop tutorial - Example 5")

//volume = [10,20,10]
//open = [1,2,3]
//close =[2,3,1]

total_volume = volume - volume  //total_volume=[0,0,0] 

for i = 0 to 2
    if close >= open  // close >= open =[true,true,false]
        continue
    total_volume := total_volume + volume

plot(total_volume, style=histogram)  //total_volume=[0,0,30]

我尝试了下面的实现 但是有很多不足,所以请教大神。


public class IfElseNode : Node
    {
        private Node exp;
        private Node expX;
        private Node expY;
        public IfElseNode(Node expinput, Node expxinput, Node expyinput)
        {
            exp = expinput;
            expX = expxinput;
            expY = expyinput;
        }

        public Object eval(SymbolTable symbols)
        {
            SymbolTable table1 = new SymbolTable(symbols);
            SymbolTable table2 = new SymbolTable(symbols);

            return ((Value)exp.eval(symbols)).Iff(expX.eval(table1), expY.eval(table2));

        }
    }
public Value Iff(Value x, Value y)
        {
            if (this.type == "bool") return Convert.ToBoolean(value) ? x : y;

            if (this.type == "array")
            {

                 var convert = new ConvertMap();
                var reusltList = new List<Value>();

                var arrayY = convert.ConvertArray(y); 

                var arrayX = convert.ConvertArray(x);

                for (int i = 0; i < ((List<Value>)value).Count; i++)
                {
                    var item =((List<Value>)value)[i];

                    var xItem = ((List<Value>)arrayX.value)[i];
                    var yItem = ((List<Value>)arrayY.value)[i];

                    if (Convert.ToBoolean(item.value))
                    {
                        reusltList.Add(new Value(xItem.value, xItem.type));

                    }
                    else
                    {
                        reusltList.Add(new Value(yItem.value, yItem.type));
                    }


                }
                return new Value(reusltList, "array");
            }
            return null;
        }

我的问题是 volume ,total_volume,close 和open 都是 数组,如何让 数组和数组比较大小 并作为 if 语句的条件
我已经用Antlr 把代码 编译成 抽象树 并转化 为C#对象,但无法用C#实现 以数组作为 条件的 if 语句 和 if 控制流

可以解决问题可以加分

  • 写回答

4条回答 默认 最新

  • junli110 2019-07-26 20:11
    关注

    找到了,局部变量不过滤,全局变量用 条件过滤就可以了

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵