parser.ts 736 B

123456789101112131415161718192021222324252627282930
  1. import type {
  2. Token,
  3. TokenList,
  4. } from 'sentry/components/metrics/equationInput/syntax/types';
  5. import grammar from './equation.pegjs';
  6. type TokenTree = Array<Token | TokenTree>;
  7. export function parseFormula(formula: string): TokenList {
  8. const tree = grammar.parse(formula) as TokenTree;
  9. return (
  10. treeToList(tree)
  11. // Remove empty (optional) tokens
  12. .filter(Boolean)
  13. );
  14. }
  15. export function joinTokens(tokens: TokenList): string {
  16. return tokens.map(token => token.content).join('');
  17. }
  18. function treeToList(tree: TokenTree): TokenList {
  19. return tree.reduce<TokenList>((acc, token) => {
  20. if (Array.isArray(token)) {
  21. return acc.concat(treeToList(token));
  22. }
  23. return acc.concat(token);
  24. }, []);
  25. }