Жетоны и грамматика - PullRequest
0 голосов
/ 06 мая 2018

Чтение через программирование: принципы и практика использования 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. Я понимаю, что нам нужно установить правило для этой программы, чтобы она оценивала *, / и () перед + и -. Но как вышеперечисленное дерево достигает этого?

...