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 java如何提取出pdf里的文字?
  • ¥100 求三轴之间相互配合画圆以及直线的算法
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 自己瞎改改,结果现在又运行不了了
  • ¥15 链式存储应该如何解决