Редактирование: Атрибутные транслирующие грамматики

Перейти к: навигация, поиск

Внимание! Вы не авторизовались на сайте. Ваш IP-адрес будет публично видимым, если вы будете вносить любые правки. Если вы войдёте или создадите учётную запись, правки вместо этого будут связаны с вашим именем пользователя, а также у вас появятся другие преимущества.

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия Ваш текст
Строка 255: Строка 255:
 
==Атрибуты в ANTLR==
 
==Атрибуты в ANTLR==
  
Общедоступный генератор разборщиков ANTLR<ref>[http://www.antlr.org/ ANTLR {{---}} Parser generator]</ref> поддерживает синтаксически управляемое определение.  
+
Общедоступный генератора разборщиков ANTLR<ref>[http://www.antlr.org/ ANTLR {{---}} Parser generator]</ref> поддерживает синтаксически управляемое определение.  
  
Рассмотрим для той же грамматики арифметических выражений с операторами <tex>+,\ *</tex>, скобками и выводом результата выражения пример на ANTLR.
+
Рассмотрим для той же грамматики арифметических выражений с операторами <tex>+,\ *</tex>, скобками и выводом результата выражениая пример на ANTLR.
  
 
  grammar Expression;
 
  grammar Expression;
Строка 265: Строка 265:
  
 
Стартовый нетерминал печатает результат:
 
Стартовый нетерминал печатает результат:
  s : expr { System.out.println($expr.val); };
+
  s : expr { System.out.println($expr.value); };
  
В продукции для нетерминала <code>expr</code> определяется возвращаемое значение (<code>['''int''' val]</code>). Обращение к этому атрибуту имеет вид <code>$expr.value</code>. В фигурных скобках записаны семантические правила.
+
В продукции для нетерминала <code>expr</code> определяется возвращаемое значение (<code>['''int''' value]</code>). Обращение к этому атрибуту имеет вид <code>$expr.value</code>. В фигурных скобках записаны семантические правила.
  
 
Разобранные нетерминалы возвращают результат, вычисленный в поддереве(<code>returns [int val]</code>) как свой синтезируемый атрибут, процесс вычисления которого описан в фигурных скобках <code>{ $val = $exprP.val; }</code>.
 
Разобранные нетерминалы возвращают результат, вычисленный в поддереве(<code>returns [int val]</code>) как свой синтезируемый атрибут, процесс вычисления которого описан в фигурных скобках <code>{ $val = $exprP.val; }</code>.
Строка 278: Строка 278:
  
 
  exprP['''int''' i] '''returns''' ['''int''' val]
 
  exprP['''int''' i] '''returns''' ['''int''' val]
     :                                             { $val = $i; } <font color="green"> // <tex>\varepsilon</tex>-правило</font>
+
     :                                           { $val = $i; } <font color="green"> // <tex>\varepsilon</tex>-правило</font>
     | '+' term expr = exprP[$i + $term.val]        { $val = $expr.val; }
+
     | '+' term e = exprP[$i + $term.val]        { $val = $e.val; }
 
     ;
 
     ;
 
 
 
  term '''returns''' ['''int''' val]
 
  term '''returns''' ['''int''' val]
     : fact termP[$fact.val]    { $val = $termP.val; }
+
     : fact termP[$fact.val]    { $val = $termpP.val; }
 
     ;
 
     ;
  
 
  termP['''int''' i] '''returns''' '''[int''' val]
 
  termP['''int''' i] '''returns''' '''[int''' val]
     :                                             { $val = $i; }
+
     :                                           { $val = $i; }
     | '*' fact expr = termP[$i * $fact.val]        { $val = $expr.val; }
+
     | '*' fact e = termP[$i * $fact.val]        { $val = $e.val; }
 
     ;
 
     ;
  

Пожалуйста, учтите, что любой ваш вклад в проект «Викиконспекты» может быть отредактирован или удалён другими участниками. Если вы не хотите, чтобы кто-либо изменял ваши тексты, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений, или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого (см. Викиконспекты:Авторские права). НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ МАТЕРИАЛЫ!

Чтобы изменить эту страницу, пожалуйста, ответьте на приведённый ниже вопрос (подробнее):

Отменить | Справка по редактированию (в новом окне)

Шаблоны, используемые на этой странице: