plurals.jison 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. /* description: Parses end executes mathematical expressions. */
  2. /* lexical grammar */
  3. %lex
  4. %%
  5. \s+ /* skip whitespace */
  6. [0-9]+("."[0-9]+)?\b return 'NUMBER'
  7. "n" return 'n'
  8. "||" return '||'
  9. "&&" return '&&'
  10. "?" return '?'
  11. ":" return ':'
  12. "<=" return '<='
  13. ">=" return '>='
  14. "<" return '<'
  15. ">" return '>'
  16. "!=" return '!='
  17. "==" return '=='
  18. "%" return '%'
  19. "(" return '('
  20. ")" return ')'
  21. <<EOF>> return 'EOF'
  22. . return 'INVALID'
  23. /lex
  24. /* operator associations and precedence */
  25. %right <code> '?' ':'
  26. %left '||'
  27. %left '&&'
  28. %left '<=' '>=' '<' '>' '!=' '=='
  29. %left '%'
  30. %start expressions
  31. %% /* language grammar */
  32. expressions
  33. : e EOF
  34. { return { type : 'GROUP', expr: $1 }; }
  35. ;
  36. e
  37. : e '?' e ':' e
  38. {$$ = { type: 'TERNARY', expr: $1, truthy : $3, falsey: $5 }; }
  39. | e '||' e
  40. {$$ = { type: "OR", left: $1, right: $3 };}
  41. | e '&&' e
  42. {$$ = { type: "AND", left: $1, right: $3 };}
  43. | e '<' e
  44. {$$ = { type: 'LT', left: $1, right: $3 }; }
  45. | e '<=' e
  46. {$$ = { type: 'LTE', left: $1, right: $3 };}
  47. | e '>' e
  48. {$$ = { type: 'GT', left: $1, right: $3 };}
  49. | e '>=' e
  50. {$$ = { type: 'GTE', left: $1, right: $3 };}
  51. | e '!=' e
  52. {$$ = { type: 'NEQ', left: $1, right: $3 };}
  53. | e '==' e
  54. {$$ = { type: 'EQ', left: $1, right: $3 };}
  55. | e '%' e
  56. {$$ = { type: 'MOD', left: $1, right: $3 };}
  57. | '(' e ')'
  58. {$$ = { type: 'GROUP', expr: $2 }; }
  59. | 'n'
  60. {$$ = { type: 'VAR' }; }
  61. | NUMBER
  62. {$$ = { type: 'NUM', val: Number(yytext) }; }
  63. ;