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

开发一个股票技术指标编辑语言 的编译器,遇到一个 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
    已采纳

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

    打赏 评论
  • jones2000 2019-09-16 11:19

    第1步 是构建AST 抽象语法树
    然后 在执行语法树。 这个可以看下编译原理。

    你可以看下我写的 根据标准的编译原理来写的麦语法

    https://github.com/jones2000/HQChart

    1 打赏 评论
  • Burcy Wen 2019-07-24 21:49

    我提供下我的想法,看是否有帮助,

    数组比较大小,应该有个比较规则,即一种比较算法,封装一个方法,传入两个数组,方法内实现两个数组比较算法,并返回比较结果,如9代表相等

    然后if语句的条件即是该方法的调用的 通过方法返回值进行条件控制

    打赏 评论
  • threenewbee 2019-07-24 23:47

    C#里有SequenceEquals这个方法可以比较数组,除此之外还可以用Zip/TakeWhile来比较。具体要看你做什么。

    打赏 评论

相关推荐 更多相似问题