parser_expression.go 11 KB

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