почему нам нужны оба символа Look Ahead и символ Forward в Compiler - PullRequest
1 голос
/ 11 апреля 2019

хорошо, я читал некоторые общие понятия, касающиеся синтаксического анализа в компиляторе ... я наткнулся на look ahead и прочитал ahead symbol я ищу и читаю о них, но я застрял, как зачем нам они оба нужны? был бы благодарен за любое любезное предложение

Символ предпросмотра: когда рассматриваемый узел в дереве разбора предназначен для терминала, а терминал совпадает с символом ожидания, тогда мы продвигаемся как в ввод

читать впереди символа: лексическому анализатору может потребоваться прочитать какой-либо символ прежде чем он сможет принять решение о возвращении токена

Ответы [ 2 ]

3 голосов
/ 12 апреля 2019

Один из них касается синтаксического анализа и относится к следующему токену , который будет создан лексическим сканером.Другой, менее формальный, касается лексического анализа и относится к следующему символу во входном потоке.Должно быть понятно, что есть что.

Обратите внимание, что хотя большинству анализаторов требуется только один токен предпросмотра, лексическому анализу нередко приходится возвращаться назад, что эквивалентно проверке нескольких неиспользованных входных символов.

1 голос
/ 12 апреля 2019

Надеюсь, я правильно понял ваш вопрос.

Рассмотрим С.

У него есть несколько знаков препинания, которые начинаются одинаково:

  • +, ++, +=
  • -, --, -=, ->
  • <, <=, <<, <<=
  • ...

Чтобы выяснить, какой это, когда вы видите первый + или - или <, вам нужно посмотреть вперед на один символ на входе (а затем, возможно, еще один для <<=) .

Подобная вещь может произойти на более высоком уровне:

{
  ident1 ident2;
  ident3;
  ident4:;
}

Здесь ident1, ident3 и ident4 могут начинать объявление, выражение или метку. Вы не можете сказать, какой из них сразу. Вы можете обратиться к своим существующим объявлениям, чтобы узнать, известны ли ident1 или ident3 (как тип или переменная / функция / перечисление), но это все еще неоднозначно, потому что может следовать двоеточие, и если это так, это метка, потому что это разрешено использовать один и тот же идентификатор как для метки, так и для типа / переменной / функции / перечисления (эти два пространства имен не пересекаются), например:

{
  typedef int ident1;
  ident1 ident2; // same as int ident2
  int ident3 = 0;
  ident3; // unused expression of value 0
  ident1:; // unused label
  ident2:; // unused label
  ident3:; // unused label
}

Таким образом, вам вполне может понадобиться заглянуть в будущее персонажа или токена (или "непрочитанного"), чтобы справиться с подобными ситуациями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...