Генератор парсеров Jison, как бороться с типами? - PullRequest
0 голосов
/ 23 февраля 2020

Я сейчас пытаюсь разобрать визуальные основы c и преобразовать их в javascript с помощью jison. У меня есть набор классов узлов, например:

class Base {} // base node that almost every other node extends of

class Literal extends Base {} // NumberLiteral, StringLiteral all those classes extending Literal class

class Value extends Base {
  constructor(base, params) {
    this.base = base;
    this.params = params;
  }
}

Для объявления грамматики я использую вспомогательную функцию:

const grammar = {
  Identifier: [
    o('IDENTIFIER', function () {
      return new IdentifierLiteral($1);
    }),
  ],
  VarDeclaration: [
    o('Identifier AS TYPE', function () {
      return new Value($1, { type: $3 });
    }),
  ],
}

Это мой текущий подход к обработке типов, но в В таких ситуациях, как я узнаю, какого типа это должно быть?

const grammar = {
  Value: [
    o('Literal', function () {
      return new Value($1);
    }),
  ],
};

Так что я считаю, что мой подход не очень хорош. Может быть, мне нужно создать отдельный узел для типа?

class Type extends Base {
  constructor(type) {
    this.type = type;
  }
}

И добавить его к каждому литеральному классу? Или, может быть, есть лучший подход?

...