Баг в компиляторе или...
От: nikov США http://www.linkedin.com/in/nikov
Дата: 22.01.07 12:47
Оценка:
static int? Foo(object x, object y)
{
    return x as int? & y as int?;
}
Re: Баг в компиляторе или...
От: ApsPro Россия  
Дата: 22.01.07 13:12
Оценка:
Здравствуйте, nikov, Вы писали:

N>
N>static int? Foo(object x, object y)
N>{
N>    return x as int? & y as int?;
N>}
N>


Возможно, но IMHO так будет понятнее:

static int? Foo(object x, object y)
{
    return (x as int?) & (y as int?);
}


а главное компилируемее
Если нам не помогут, мы тоже никого не пощадим...
Re[2]: Баг в компиляторе или...
От: nikov США http://www.linkedin.com/in/nikov
Дата: 22.01.07 13:28
Оценка:
Здравствуйте, ApsPro, Вы писали:

AP>Возможно, но IMHO так будет понятнее:

AP>а главное компилируемее

Ну это само собой. Вопрос в том, почему первый вариант не компилируется. И должен ли компилироваться?
Вот например, РеШарпер не считает его за ошибку.
Re: Баг в компиляторе или...
От: Алексей.  
Дата: 23.01.07 07:20
Оценка: 10 (1)
Здравствуйте, nikov, Вы писали:

N>
N>static int? Foo(object x, object y)
N>{
N>    return x as int? & y as int?;
N>}
N>


Разрешение данной неоднозначности никак не специфицировано в стандарте. Так что поведение может быть любым. Проблема разрешения данной неоднозначности уже всплывала на rsdn. В ходе дискусии так ни к чему и не пришли.
Re: Баг в компиляторе или...
От: Алексей.  
Дата: 23.01.07 07:31
Оценка:
Здравствуйте, nikov, Вы писали:

N>
N>static int? Foo(object x, object y)
N>{
N>    return x as int? & y as int?;
N>}
N>


Вот еще занимательный пример неоднозначности (проблема кочующего ':'):

void f()
{
int a = 0;
int b = a is int? + a is int? + a : a;
}
Re[2]: Баг в компиляторе или...
От: nikov США http://www.linkedin.com/in/nikov
Дата: 23.01.07 07:41
Оценка:
Здравствуйте, Алексей., Вы писали:

А>Вот еще занимательный пример неоднозначности (проблема кочующего ':'):


Здесь, пожалуй, действительно неоднозначность...
Re[2]: Баг в компиляторе или...
От: nikov США http://www.linkedin.com/in/nikov
Дата: 23.01.07 07:51
Оценка:
Здравствуйте, Алексей., Вы писали:

А>Разрешение данной неоднозначности никак не специфицировано в стандарте. Так что поведение может быть любым. Проблема разрешения данной неоднозначности уже всплывала на rsdn. В ходе дискусии так ни к чему и не пришли.


Интересно, существует ли механизм эскалации проблемы к разработчикам языка?
Re[3]: Баг в компиляторе или...
От: Алексей.  
Дата: 23.01.07 07:58
Оценка:
Здравствуйте, nikov, Вы писали:

N>Интересно, существует ли механизм эскалации проблемы к разработчикам языка?


Чего не знаю того не знаю. 4-я версия стандарта не внесла ясность в этот вопрос.
Re[2]: Баг в компиляторе или...
От: nikov США http://www.linkedin.com/in/nikov
Дата: 23.01.07 09:04
Оценка:
Здравствуйте, Алексей., Вы писали:

А>Разрешение данной неоднозначности никак не специфицировано в стандарте. Так что поведение может быть любым. Проблема разрешения данной неоднозначности уже всплывала на rsdn. В ходе дискусии так ни к чему и не пришли.


Но все-таки, если рассматривать именно тот код, который я привел в начале, возникает ряд вопросов.
Вопрос 1: Почему в safe-контексте компилятор пытается разобрать '&' как одноместный оператор?
Вопрос 2: Допустим, что в начале компилятор пытается разобрать '?' как часть тернарного оператора. Почему он не возвращается и не разбирает его по-другому (как nullable-sign), поcле того, как он не находит двоеточия?


Для сравнения, следующий код успешно компилируется:

static int? Foo(object x, object y)
{
    return x as int? | y as int?;
}
Re[3]: Баг в компиляторе или...
От: dshe  
Дата: 23.01.07 09:25
Оценка:
Здравствуйте, nikov, Вы писали:

N>Здравствуйте, Алексей., Вы писали:


А>>Разрешение данной неоднозначности никак не специфицировано в стандарте. Так что поведение может быть любым. Проблема разрешения данной неоднозначности уже всплывала на rsdn. В ходе дискусии так ни к чему и не пришли.


N>Но все-таки, если рассматривать именно тот код, который я привел в начале, возникает ряд вопросов.

N>Вопрос 1: Почему в safe-контексте компилятор пытается разобрать & как одноместный оператор?
N>Вопрос 2: Допустим, что в начале компилятор пытается разобрать ? как часть тернарного оператора. Почему он не возвращается и не разбирает его по-другому (как nullable-sign), поле того, как он не находит двоеточия?

Возможно, что для того, чтобы это сделать грамматика должна быть контектно-зависимой (или просто шире классов LL(1), LR(1)). В большинстве случаев это непрактично из-за того, что разбор, возможно, потребует больше времени, чем O(n); либо таблицы переходов будут занимать много места; либо еще какие-то технические причины. Даже если машина и в состоянии эффективно обработать сложные грамматики, человек сложный язык может и не распарсить, и это будет чревато ошибками. Так например, на Фортране такое выражение
FOR I=1,12

означало начало цикла FOR с счетчиком I от 1 до 12. А вот такое
FOR I=1.12

присваивание переменной FORI значния 1.12

Похдод Do What I Mean часто оказывается "медвежьей услугой".
--
Дмитро
Re[4]: Баг в компиляторе или...
От: nikov США http://www.linkedin.com/in/nikov
Дата: 23.01.07 09:47
Оценка:
Здравствуйте, dshe, Вы писали:

D>Возможно, что для того, чтобы это сделать грамматика должна быть контектно-зависимой (или просто шире классов LL(1), LR(1)). В большинстве случаев это непрактично


D>Похдод Do What I Mean часто оказывается "медвежьей услугой".


Вопрос не в том, является ли существующая реализация эффективной или рациональной, а в том, является ли она правильной (то есть согласующейся со стандартом).
Re[3]: Баг в компиляторе или...
От: Алексей.  
Дата: 23.01.07 10:51
Оценка:
Здравствуйте, nikov, Вы писали:

N>Вопрос 1: Почему в safe-контексте компилятор пытается разобрать '&' как одноместный оператор?


При разборе грамматики никакого safe-контекста нет. Это контекст на уровне семантики, но не грамматики.

N>Вопрос 2: Допустим, что в начале компилятор пытается разобрать '?' как часть тернарного оператора. Почему он не возвращается и не разбирает его по-другому (как nullable-sign), поcле того, как он не находит двоеточия?


Так реализован компилятор от Microsoft. По-моему он, после просмотра следующего за ? токена, в случае потенциальной неоднозначности, для совместимости с С#1.0, интерпретирует ? как оператор условного выражения.

N>
Для сравнения, следующий код успешно компилируется:


N>
N>static int? Foo(object x, object y)
N>{
N>    return x as int? | y as int?;
N>}
N>


В данном случае не возникает неоднозначности. Оператор | бинарный, следовательно знак ? может быть только частью nullable-типа.
Re[4]: Баг в компиляторе или...
От: nikov США http://www.linkedin.com/in/nikov
Дата: 23.01.07 20:31
Оценка:
Здравствуйте, Алексей., Вы писали:

N>>Вопрос 1: Почему в safe-контексте компилятор пытается разобрать '&' как одноместный оператор?


А>При разборе грамматики никакого safe-контекста нет. Это контекст на уровне семантики, но не грамматики.


С этим трудно согласиться. В спецификации (Ecma-334, ISO/IEC 23270) утверждается так:

27.1 Unsafe contexts
The unsafe features of C# are available only in unsafe contexts. An unsafe context is introduced by
including an unsafe modifier in the declaration of a type or member, or by employing an unsafe-statement:
<skipped>
The associated grammar extensions are shown below. For brevity, ellipses (...) are used to represent
productions that appear in preceding clauses.
<skipped>
27.2 Pointer types
In an unsafe context, a type (§11) can be a pointer-type as well as a value-type, a reference-type, or a type parameter.

type:
   value-type
   reference-type
   type-parameter
   pointer-type



То есть unsafe-контекст вносит расширения именно в грамматику. Хотя, разумеется, они имеют и семантическое значение.
Я уверен, что вне unsafe-контекста не должно быть даже попыток разбирать соответствующие синтаксические продукции.

N>>Вопрос 2: Допустим, что в начале компилятор пытается разобрать '?' как часть тернарного оператора. Почему он не возвращается и не разбирает его по-другому (как nullable-sign), поcле того, как он не находит двоеточия?


А>Так реализован компилятор от Microsoft.


ИМХО, это ошибочная реализация.



P.S. Я нашел ту тему. Grammar ambiguities in C# 2.0
Автор: cvetkov
Дата: 04.04.06
RE: Re[2]: Баг в компиляторе или...
От: Аноним  
Дата: 22.01.07 14:31
Оценка:
Здравствуйте, ApsPro, Вы писали:

AP>Возможно, но IMHO так будет понятнее:

AP>а главное компилируемее

Ну это само собой. Вопрос в том, почему первый вариант не компилируется. И должен ли компилироваться?
Вот например, РеШарпер не считает его за ошибку.

C:\…Program.cs(10,35): error CS1003: Syntax error, ':' expected
Судя по сообщению ? распозается как конструкция альтернативного выбора
expression ? expression : expression
Такие неопределенности устраняются скобками. Что и было продемонстрировано





данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Баг в компиляторе или...
От: Аноним  
Дата: 23.01.07 07:45
Оценка:
Если не сложно — поясните, пожалуйста, что есть "int?" ?
[[url=http://suneta.ineta.ru/]South Ural .NET Aliance[/url]] [[url=http://www.smartsoftline.ru/]SmartSoftLine[/url]] [[url=http://blogs.gotdotnet.ru/personal/sergun]Мой блог[/url]]


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