如何区分运算符和数字
How to differentiate between operators and numbers
我正在创建一种简单的查询语言来为股市事件生成信号。
例如
//Get notified when the RSI(14) falls below 25
bnbCache.onCondition("rsi(14) < 25", (args) => console.log(args))
//Get notified when the SMA(7) crosses the SMA(25)
bnbCache.onCondition("last(sma(7) > sma(25)) AND (sma(7) < sma(25))", (args) => console.log(args))
//Get notified when the SMA(14) drops 2 within the last 15m candle.
bnbCache.onCondition("change(period, sma(14)) < -2", (res, interval, condition) => {
if (interval === '15m')
logger.warning`Condition '${condition}' matched for interval ${interval} ${res}`;
});
(最有可能众所周知的)问题是我需要从操作 4-2
中消除数字 -2
的歧义。词法分析在第一种情况下应该 return 一个 number 类型的标记,在后者中应该是三个 [number, sub, number] 类型的标记。这个问题最直接的解决方案是什么?
最直接和最常见的解决方案是让词法分析器生成一个 sub
标记(尽管我将它重命名为 minus)
for -
无论哪种方式并让解析器解析number minus number
作为减法,minus number
作为负数。
不要将此作为词法分析的一部分 - 将 -
解析为一个标记,将整数解析为另一个标记。
解析器将决定它是一元运算符(意思是否定)还是二元运算符(意思是减法)。
我正在创建一种简单的查询语言来为股市事件生成信号。
例如
//Get notified when the RSI(14) falls below 25
bnbCache.onCondition("rsi(14) < 25", (args) => console.log(args))
//Get notified when the SMA(7) crosses the SMA(25)
bnbCache.onCondition("last(sma(7) > sma(25)) AND (sma(7) < sma(25))", (args) => console.log(args))
//Get notified when the SMA(14) drops 2 within the last 15m candle.
bnbCache.onCondition("change(period, sma(14)) < -2", (res, interval, condition) => {
if (interval === '15m')
logger.warning`Condition '${condition}' matched for interval ${interval} ${res}`;
});
(最有可能众所周知的)问题是我需要从操作 4-2
中消除数字 -2
的歧义。词法分析在第一种情况下应该 return 一个 number 类型的标记,在后者中应该是三个 [number, sub, number] 类型的标记。这个问题最直接的解决方案是什么?
最直接和最常见的解决方案是让词法分析器生成一个 sub
标记(尽管我将它重命名为 minus)
for -
无论哪种方式并让解析器解析number minus number
作为减法,minus number
作为负数。
不要将此作为词法分析的一部分 - 将 -
解析为一个标记,将整数解析为另一个标记。
解析器将决定它是一元运算符(意思是否定)还是二元运算符(意思是减法)。