Чтение через программирование: принципы и практика использования C ++. В главе 6 создавали калькулятор и использовали токены для идентификации каждого символа уравнения один за другим. Затем мы используем грамматику, чтобы установить правила для каждого элемента (я верю?). Теперь оба из них я не понимаю правильно. Он перебирает часть этого текста без должного объяснения и предполагает, что вы просто «понимаете», что происходит. Или я что-то упустил.
токены:
Так я понимаю, что мы "раскололись" или токенизировали? каждый элемент, чтобы они могли быть оценены отдельно. Но я не понимаю, как они создаются?
Вот их пример:
class Token {
public:
char kind;
double value;
};
Итак, из того, что я понимаю. Мы создаем класс с именем Token. Мы делаем это публичным. Затем внутри этого класса мы определяем 2 переменные вида и значения. Затем мы инициализируем переменные ниже?
Token t; // t is a Token
t.kind = '+'; // t represents a +
Token t2; // t2 is another Token
t2.kind = '8'; // we use the digit 8 as the “kind” for numbers
t2.value = 3.14;
Так что мой вопрос к токенам: Почему значения '+', '8' и 3.14? Могут ли они быть чем-то или есть причина их 8? а почему значение 3.14? Может ли t.kind быть '-' или '*' и т. Д.?
Грамматика:
Итак, теперь я узнал, что грамматика может быть определена любой терминологией, которую я хочу, но чтение следующей грамматики не имеет смысла для меня.
// a simple expression grammar:
Expression:
Term
Expression "+" Term // addition
Expression "–" Term // subtraction
Term:
Primary
Term "*" Primary // multiplication
Term "/" Primary // division
Term "%" Primary // remainder (modulo)
Primary:
Number
"(" Expression ")" // grouping
Number:
floating-point-literal
Может ли кто-нибудь придумать пример поменьше. Я не понимаю, как он получил вышеуказанную грамматику из 45 + 11,5 / 7. Я понимаю, что нам нужно установить правило для этой программы, чтобы она оценивала *, / и () перед + и -. Но как вышеперечисленное дерево достигает этого?