Re[13]: Разбор грамматики C++
От: mefrill Россия  
Дата: 22.12.04 12:01
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>mefrill,


>> VD>цитата из спецификации C# 2.0:

>> VD>

>> VD>9.2.3 Grammar ambiguities
>> VD>The productions for simple-name (§14.5.2) and member-access (§14.5.4) can give rise to ambiguities in the
>> VD>grammar for expressions. <...>


>> <...>


ПК>Согласен с вводной частью относительно квалификации языков по Хомскому и прочими общими положениями.


>> Относительно проблемы, которую описали Вы, эта конструкция, очевидно, не может быть выражена с помощью КС грамматики. Необходимо определить в грамматике также и способ образования идентификаторов, который в компиляторах выражается на метаязыке в понятии "тип".


ПК>Для описанных правил разрешения неоднозначностей в C# "смысл" идентификаторов никакого значения не имеет, они "работают" исключительно на основании синтаксиса рассматриваемой конструкции. В частности, например, вне зависимости от того, как были определены идентификаторы F, G, A и B ранее, выражение:

ПК>
ПК>F(G<A, B>(7));
ПК>

ПК>в соответствии с описанными правилами, будет всегда распознано как вызов F с одним аргументом, являющимся вызовом generic метода с двумя аргументами-типами (A и B), плюс одним "обычным" аргументом (7).

ПК>А раз знания о "смысле" идентификаторов не требуется, то и тезис о способе образования идентификаторов, процитированный чуть выше, насколько я вижу, к вопросу Влада не относится.


ПК>В процитированном фрагменте стандарта C# я не увидел ничего, что не может быть описано с помощью КС-грамматики, хотя, конечно, получившаяся грамматика будет изрядно громоздкой.


Вот здесь, видимо, я уже ошибся. Из приведенного фрагмента стандарта я понял, что проблема заключается в том, как интерпретировать фрагмент


F(G<A, B>(7));


И главная трудность состоит в том, что без знания типа объекта, представленного в тексте программы именем G, мы не можем правильно провести интерпретацию данного фрагмента. Если тип G это имя некоторого объекта, то понятно, что G < A это операция меньше, примененная к двум объектам с именами G и A. Если же, G это имя параметрического типа, то к нему, очевидно, такую операцию применить нельзя. Поэтому, вводя в граматику нетерминалы Generic_Type и Identifier, а также и способы их объявления мы вполне можем эту неоднозначность в грамматике преодолеть. Что-то типа:

typename--> Generic_Type '<' Identifier, Identifier '>'
expr --> typename '(' Identifier ')' | Identifier '<' Identifier | expr, expr | ...


Ничего другого я и не имел ввиду. Но, вероятно, я неверно понял вопрос?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.