parser_expression.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517
  1. package pongo2
  2. import (
  3. "fmt"
  4. "math"
  5. )
  6. type Expression struct {
  7. // TODO: Add location token?
  8. expr1 IEvaluator
  9. expr2 IEvaluator
  10. opToken *Token
  11. }
  12. type relationalExpression struct {
  13. // TODO: Add location token?
  14. expr1 IEvaluator
  15. expr2 IEvaluator
  16. opToken *Token
  17. }
  18. type simpleExpression struct {
  19. negate bool
  20. negativeSign bool
  21. term1 IEvaluator
  22. term2 IEvaluator
  23. opToken *Token
  24. }
  25. type term struct {
  26. // TODO: Add location token?
  27. factor1 IEvaluator
  28. factor2 IEvaluator
  29. opToken *Token
  30. }
  31. type power struct {
  32. // TODO: Add location token?
  33. power1 IEvaluator
  34. power2 IEvaluator
  35. }
  36. func (expr *Expression) FilterApplied(name string) bool {
  37. return expr.expr1.FilterApplied(name) && (expr.expr2 == nil ||
  38. (expr.expr2 != nil && expr.expr2.FilterApplied(name)))
  39. }
  40. func (expr *relationalExpression) FilterApplied(name string) bool {
  41. return expr.expr1.FilterApplied(name) && (expr.expr2 == nil ||
  42. (expr.expr2 != nil && expr.expr2.FilterApplied(name)))
  43. }
  44. func (expr *simpleExpression) FilterApplied(name string) bool {
  45. return expr.term1.FilterApplied(name) && (expr.term2 == nil ||
  46. (expr.term2 != nil && expr.term2.FilterApplied(name)))
  47. }
  48. func (expr *term) FilterApplied(name string) bool {
  49. return expr.factor1.FilterApplied(name) && (expr.factor2 == nil ||
  50. (expr.factor2 != nil && expr.factor2.FilterApplied(name)))
  51. }
  52. func (expr *power) FilterApplied(name string) bool {
  53. return expr.power1.FilterApplied(name) && (expr.power2 == nil ||
  54. (expr.power2 != nil && expr.power2.FilterApplied(name)))
  55. }
  56. func (expr *Expression) GetPositionToken() *Token {
  57. return expr.expr1.GetPositionToken()
  58. }
  59. func (expr *relationalExpression) GetPositionToken() *Token {
  60. return expr.expr1.GetPositionToken()
  61. }
  62. func (expr *simpleExpression) GetPositionToken() *Token {
  63. return expr.term1.GetPositionToken()
  64. }
  65. func (expr *term) GetPositionToken() *Token {
  66. return expr.factor1.GetPositionToken()
  67. }
  68. func (expr *power) GetPositionToken() *Token {
  69. return expr.power1.GetPositionToken()
  70. }
  71. func (expr *Expression) Execute(ctx *ExecutionContext, writer TemplateWriter) *Error {
  72. value, err := expr.Evaluate(ctx)
  73. if err != nil {
  74. return err
  75. }
  76. writer.WriteString(value.String())
  77. return nil
  78. }
  79. func (expr *relationalExpression) Execute(ctx *ExecutionContext, writer TemplateWriter) *Error {
  80. value, err := expr.Evaluate(ctx)
  81. if err != nil {
  82. return err
  83. }
  84. writer.WriteString(value.String())
  85. return nil
  86. }
  87. func (expr *simpleExpression) Execute(ctx *ExecutionContext, writer TemplateWriter) *Error {
  88. value, err := expr.Evaluate(ctx)
  89. if err != nil {
  90. return err
  91. }
  92. writer.WriteString(value.String())
  93. return nil
  94. }
  95. func (expr *term) Execute(ctx *ExecutionContext, writer TemplateWriter) *Error {
  96. value, err := expr.Evaluate(ctx)
  97. if err != nil {
  98. return err
  99. }
  100. writer.WriteString(value.String())
  101. return nil
  102. }
  103. func (expr *power) Execute(ctx *ExecutionContext, writer TemplateWriter) *Error {
  104. value, err := expr.Evaluate(ctx)
  105. if err != nil {
  106. return err
  107. }
  108. writer.WriteString(value.String())
  109. return nil
  110. }
  111. func (expr *Expression) Evaluate(ctx *ExecutionContext) (*Value, *Error) {
  112. v1, err := expr.expr1.Evaluate(ctx)
  113. if err != nil {
  114. return nil, err
  115. }
  116. if expr.expr2 != nil {
  117. switch expr.opToken.Val {
  118. case "and", "&&":
  119. if !v1.IsTrue() {
  120. return AsValue(false), nil
  121. } else {
  122. v2, err := expr.expr2.Evaluate(ctx)
  123. if err != nil {
  124. return nil, err
  125. }
  126. return AsValue(v2.IsTrue()), nil
  127. }
  128. case "or", "||":
  129. if v1.IsTrue() {
  130. return AsValue(true), nil
  131. } else {
  132. v2, err := expr.expr2.Evaluate(ctx)
  133. if err != nil {
  134. return nil, err
  135. }
  136. return AsValue(v2.IsTrue()), nil
  137. }
  138. default:
  139. return nil, ctx.Error(fmt.Sprintf("unimplemented: %s", expr.opToken.Val), expr.opToken)
  140. }
  141. } else {
  142. return v1, nil
  143. }
  144. }
  145. func (expr *relationalExpression) Evaluate(ctx *ExecutionContext) (*Value, *Error) {
  146. v1, err := expr.expr1.Evaluate(ctx)
  147. if err != nil {
  148. return nil, err
  149. }
  150. if expr.expr2 != nil {
  151. v2, err := expr.expr2.Evaluate(ctx)
  152. if err != nil {
  153. return nil, err
  154. }
  155. switch expr.opToken.Val {
  156. case "<=":
  157. if v1.IsFloat() || v2.IsFloat() {
  158. return AsValue(v1.Float() <= v2.Float()), nil
  159. }
  160. if v1.IsTime() && v2.IsTime() {
  161. tm1, tm2 := v1.Time(), v2.Time()
  162. return AsValue(tm1.Before(tm2) || tm1.Equal(tm2)), nil
  163. }
  164. return AsValue(v1.Integer() <= v2.Integer()), nil
  165. case ">=":
  166. if v1.IsFloat() || v2.IsFloat() {
  167. return AsValue(v1.Float() >= v2.Float()), nil
  168. }
  169. if v1.IsTime() && v2.IsTime() {
  170. tm1, tm2 := v1.Time(), v2.Time()
  171. return AsValue(tm1.After(tm2) || tm1.Equal(tm2)), nil
  172. }
  173. return AsValue(v1.Integer() >= v2.Integer()), nil
  174. case "==":
  175. return AsValue(v1.EqualValueTo(v2)), nil
  176. case ">":
  177. if v1.IsFloat() || v2.IsFloat() {
  178. return AsValue(v1.Float() > v2.Float()), nil
  179. }
  180. if v1.IsTime() && v2.IsTime() {
  181. return AsValue(v1.Time().After(v2.Time())), nil
  182. }
  183. return AsValue(v1.Integer() > v2.Integer()), nil
  184. case "<":
  185. if v1.IsFloat() || v2.IsFloat() {
  186. return AsValue(v1.Float() < v2.Float()), nil
  187. }
  188. if v1.IsTime() && v2.IsTime() {
  189. return AsValue(v1.Time().Before(v2.Time())), nil
  190. }
  191. return AsValue(v1.Integer() < v2.Integer()), nil
  192. case "!=", "<>":
  193. return AsValue(!v1.EqualValueTo(v2)), nil
  194. case "in":
  195. return AsValue(v2.Contains(v1)), nil
  196. default:
  197. return nil, ctx.Error(fmt.Sprintf("unimplemented: %s", expr.opToken.Val), expr.opToken)
  198. }
  199. } else {
  200. return v1, nil
  201. }
  202. }
  203. func (expr *simpleExpression) Evaluate(ctx *ExecutionContext) (*Value, *Error) {
  204. t1, err := expr.term1.Evaluate(ctx)
  205. if err != nil {
  206. return nil, err
  207. }
  208. result := t1
  209. if expr.negate {
  210. result = result.Negate()
  211. }
  212. if expr.negativeSign {
  213. if result.IsNumber() {
  214. switch {
  215. case result.IsFloat():
  216. result = AsValue(-1 * result.Float())
  217. case result.IsInteger():
  218. result = AsValue(-1 * result.Integer())
  219. default:
  220. return nil, ctx.Error("Operation between a number and a non-(float/integer) is not possible", nil)
  221. }
  222. } else {
  223. return nil, ctx.Error("Negative sign on a non-number expression", expr.GetPositionToken())
  224. }
  225. }
  226. if expr.term2 != nil {
  227. t2, err := expr.term2.Evaluate(ctx)
  228. if err != nil {
  229. return nil, err
  230. }
  231. switch expr.opToken.Val {
  232. case "+":
  233. if result.IsFloat() || t2.IsFloat() {
  234. // Result will be a float
  235. return AsValue(result.Float() + t2.Float()), nil
  236. }
  237. // Result will be an integer
  238. return AsValue(result.Integer() + t2.Integer()), nil
  239. case "-":
  240. if result.IsFloat() || t2.IsFloat() {
  241. // Result will be a float
  242. return AsValue(result.Float() - t2.Float()), nil
  243. }
  244. // Result will be an integer
  245. return AsValue(result.Integer() - t2.Integer()), nil
  246. default:
  247. return nil, ctx.Error("Unimplemented", expr.GetPositionToken())
  248. }
  249. }
  250. return result, nil
  251. }
  252. func (expr *term) Evaluate(ctx *ExecutionContext) (*Value, *Error) {
  253. f1, err := expr.factor1.Evaluate(ctx)
  254. if err != nil {
  255. return nil, err
  256. }
  257. if expr.factor2 != nil {
  258. f2, err := expr.factor2.Evaluate(ctx)
  259. if err != nil {
  260. return nil, err
  261. }
  262. switch expr.opToken.Val {
  263. case "*":
  264. if f1.IsFloat() || f2.IsFloat() {
  265. // Result will be float
  266. return AsValue(f1.Float() * f2.Float()), nil
  267. }
  268. // Result will be int
  269. return AsValue(f1.Integer() * f2.Integer()), nil
  270. case "/":
  271. if f1.IsFloat() || f2.IsFloat() {
  272. // Result will be float
  273. return AsValue(f1.Float() / f2.Float()), nil
  274. }
  275. // Result will be int
  276. return AsValue(f1.Integer() / f2.Integer()), nil
  277. case "%":
  278. // Result will be int
  279. return AsValue(f1.Integer() % f2.Integer()), nil
  280. default:
  281. return nil, ctx.Error("unimplemented", expr.opToken)
  282. }
  283. } else {
  284. return f1, nil
  285. }
  286. }
  287. func (expr *power) Evaluate(ctx *ExecutionContext) (*Value, *Error) {
  288. p1, err := expr.power1.Evaluate(ctx)
  289. if err != nil {
  290. return nil, err
  291. }
  292. if expr.power2 != nil {
  293. p2, err := expr.power2.Evaluate(ctx)
  294. if err != nil {
  295. return nil, err
  296. }
  297. return AsValue(math.Pow(p1.Float(), p2.Float())), nil
  298. }
  299. return p1, nil
  300. }
  301. func (p *Parser) parseFactor() (IEvaluator, *Error) {
  302. if p.Match(TokenSymbol, "(") != nil {
  303. expr, err := p.ParseExpression()
  304. if err != nil {
  305. return nil, err
  306. }
  307. if p.Match(TokenSymbol, ")") == nil {
  308. return nil, p.Error("Closing bracket expected after expression", nil)
  309. }
  310. return expr, nil
  311. }
  312. return p.parseVariableOrLiteralWithFilter()
  313. }
  314. func (p *Parser) parsePower() (IEvaluator, *Error) {
  315. pw := new(power)
  316. power1, err := p.parseFactor()
  317. if err != nil {
  318. return nil, err
  319. }
  320. pw.power1 = power1
  321. if p.Match(TokenSymbol, "^") != nil {
  322. power2, err := p.parsePower()
  323. if err != nil {
  324. return nil, err
  325. }
  326. pw.power2 = power2
  327. }
  328. if pw.power2 == nil {
  329. // Shortcut for faster evaluation
  330. return pw.power1, nil
  331. }
  332. return pw, nil
  333. }
  334. func (p *Parser) parseTerm() (IEvaluator, *Error) {
  335. returnTerm := new(term)
  336. factor1, err := p.parsePower()
  337. if err != nil {
  338. return nil, err
  339. }
  340. returnTerm.factor1 = factor1
  341. for p.PeekOne(TokenSymbol, "*", "/", "%") != nil {
  342. if returnTerm.opToken != nil {
  343. // Create new sub-term
  344. returnTerm = &term{
  345. factor1: returnTerm,
  346. }
  347. }
  348. op := p.Current()
  349. p.Consume()
  350. factor2, err := p.parsePower()
  351. if err != nil {
  352. return nil, err
  353. }
  354. returnTerm.opToken = op
  355. returnTerm.factor2 = factor2
  356. }
  357. if returnTerm.opToken == nil {
  358. // Shortcut for faster evaluation
  359. return returnTerm.factor1, nil
  360. }
  361. return returnTerm, nil
  362. }
  363. func (p *Parser) parseSimpleExpression() (IEvaluator, *Error) {
  364. expr := new(simpleExpression)
  365. if sign := p.MatchOne(TokenSymbol, "+", "-"); sign != nil {
  366. if sign.Val == "-" {
  367. expr.negativeSign = true
  368. }
  369. }
  370. if p.Match(TokenSymbol, "!") != nil || p.Match(TokenKeyword, "not") != nil {
  371. expr.negate = true
  372. }
  373. term1, err := p.parseTerm()
  374. if err != nil {
  375. return nil, err
  376. }
  377. expr.term1 = term1
  378. for p.PeekOne(TokenSymbol, "+", "-") != nil {
  379. if expr.opToken != nil {
  380. // New sub expr
  381. expr = &simpleExpression{
  382. term1: expr,
  383. }
  384. }
  385. op := p.Current()
  386. p.Consume()
  387. term2, err := p.parseTerm()
  388. if err != nil {
  389. return nil, err
  390. }
  391. expr.term2 = term2
  392. expr.opToken = op
  393. }
  394. if expr.negate == false && expr.negativeSign == false && expr.term2 == nil {
  395. // Shortcut for faster evaluation
  396. return expr.term1, nil
  397. }
  398. return expr, nil
  399. }
  400. func (p *Parser) parseRelationalExpression() (IEvaluator, *Error) {
  401. expr1, err := p.parseSimpleExpression()
  402. if err != nil {
  403. return nil, err
  404. }
  405. expr := &relationalExpression{
  406. expr1: expr1,
  407. }
  408. if t := p.MatchOne(TokenSymbol, "==", "<=", ">=", "!=", "<>", ">", "<"); t != nil {
  409. expr2, err := p.parseRelationalExpression()
  410. if err != nil {
  411. return nil, err
  412. }
  413. expr.opToken = t
  414. expr.expr2 = expr2
  415. } else if t := p.MatchOne(TokenKeyword, "in"); t != nil {
  416. expr2, err := p.parseSimpleExpression()
  417. if err != nil {
  418. return nil, err
  419. }
  420. expr.opToken = t
  421. expr.expr2 = expr2
  422. }
  423. if expr.expr2 == nil {
  424. // Shortcut for faster evaluation
  425. return expr.expr1, nil
  426. }
  427. return expr, nil
  428. }
  429. func (p *Parser) ParseExpression() (IEvaluator, *Error) {
  430. rexpr1, err := p.parseRelationalExpression()
  431. if err != nil {
  432. return nil, err
  433. }
  434. exp := &Expression{
  435. expr1: rexpr1,
  436. }
  437. if p.PeekOne(TokenSymbol, "&&", "||") != nil || p.PeekOne(TokenKeyword, "and", "or") != nil {
  438. op := p.Current()
  439. p.Consume()
  440. expr2, err := p.ParseExpression()
  441. if err != nil {
  442. return nil, err
  443. }
  444. exp.expr2 = expr2
  445. exp.opToken = op
  446. }
  447. if exp.expr2 == nil {
  448. // Shortcut for faster evaluation
  449. return exp.expr1, nil
  450. }
  451. return exp, nil
  452. }