Зачем использовать целые числа для токенов? - PullRequest
3 голосов
/ 02 марта 2011

Есть ли сейчас веская причина для использования чисел для идентификации токенов?Я слежу за Crafting a Compiler.

Код, который автор представляет здесь:

public class Token {
    public final static int ID = 0, FLTDCL = 1, INTDCL = 2, PRINT = 3,
            ASSIGN = 4, PLUS = 5, MINUS = 6, EOF = 7, INUM = 8, FNUM = 9;

    public final static String[] token2str = new String[] { "id", "fltdcl",
            "intdcl", "print", "assign", "plus", "minus", "$", "inum", "fnum" };

    public final int type;
    public final String val;

    public Token(int type) {
        this(type, "");
    }

    public Token(int type, String val) {
        this.type = type;
        this.val = val;
    }

    public String toString() {
        return "Token type\t" + token2str[type] + "\tval\t" + val;
    }
}

Вместо использования уродливых массивов, не было бы разумнее модифицировать конструкторы так, чтобы они принимали строкидля переменной type вместо целых чисел?Тогда мы могли бы избавиться от

    public final static int ID = 0, FLTDCL = 1, INTDCL = 2, PRINT = 3,
            ASSIGN = 4, PLUS = 5, MINUS = 6, EOF = 7, INUM = 8, FNUM = 9;

или это нужно позже, потому что использование строки вместо этого будет хуже?

1 Ответ

2 голосов
/ 02 марта 2011

Есть несколько преимуществ:

  • Это быстрее, поскольку сравнение двух целых чисел (на вашем среднем скомпилированном языке) занимает всего несколько инструкций, тогда как сравнение строк занимает O ( n ) время, где n - это длина больший токен. Компиляторам нужен этот дополнительный бит скорости .
  • В C, C ++ и Java вы можете switch для int, но не для строки.
  • Неправильный ввод имени токена будет ошибкой во время компиляции, а не трудной для отладки ошибкой времени выполнения.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...