N>static int? Foo(object x, object y)
N>{
N> return x as int? & y as int?;
N>}
N>
Разрешение данной неоднозначности никак не специфицировано в стандарте. Так что поведение может быть любым. Проблема разрешения данной неоднозначности уже всплывала на rsdn. В ходе дискусии так ни к чему и не пришли.
Здравствуйте, Алексей., Вы писали:
А>Разрешение данной неоднозначности никак не специфицировано в стандарте. Так что поведение может быть любым. Проблема разрешения данной неоднозначности уже всплывала на rsdn. В ходе дискусии так ни к чему и не пришли.
Интересно, существует ли механизм эскалации проблемы к разработчикам языка?
Здравствуйте, Алексей., Вы писали:
А>Разрешение данной неоднозначности никак не специфицировано в стандарте. Так что поведение может быть любым. Проблема разрешения данной неоднозначности уже всплывала на rsdn. В ходе дискусии так ни к чему и не пришли.
Но все-таки, если рассматривать именно тот код, который я привел в начале, возникает ряд вопросов. Вопрос 1: Почему в safe-контексте компилятор пытается разобрать '&' как одноместный оператор? Вопрос 2: Допустим, что в начале компилятор пытается разобрать '?' как часть тернарного оператора. Почему он не возвращается и не разбирает его по-другому (как nullable-sign), поcле того, как он не находит двоеточия?
Для сравнения, следующий код успешно компилируется:
static int? Foo(object x, object y)
{
return x as int? | y as int?;
}
Здравствуйте, 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 часто оказывается "медвежьей услугой".
Здравствуйте, dshe, Вы писали:
D>Возможно, что для того, чтобы это сделать грамматика должна быть контектно-зависимой (или просто шире классов LL(1), LR(1)). В большинстве случаев это непрактично
D>Похдод Do What I Mean часто оказывается "медвежьей услугой".
Вопрос не в том, является ли существующая реализация эффективной или рациональной, а в том, является ли она правильной (то есть согласующейся со стандартом).
Здравствуйте, 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-типа.
Здравствуйте, Алексей., Вы писали:
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.
То есть unsafe-контекст вносит расширения именно в грамматику. Хотя, разумеется, они имеют и семантическое значение.
Я уверен, что вне unsafe-контекста не должно быть даже попыток разбирать соответствующие синтаксические продукции.
N>>Вопрос 2: Допустим, что в начале компилятор пытается разобрать '?' как часть тернарного оператора. Почему он не возвращается и не разбирает его по-другому (как nullable-sign), поcле того, как он не находит двоеточия?
А>Так реализован компилятор от Microsoft.
Здравствуйте, ApsPro, Вы писали:
AP>Возможно, но IMHO так будет понятнее: AP>а главное компилируемее
Ну это само собой. Вопрос в том, почему первый вариант не компилируется. И должен ли компилироваться?
Вот например, РеШарпер не считает его за ошибку.
C:\…Program.cs(10,35): error CS1003: Syntax error, ':' expected
Судя по сообщению ? распозается как конструкция альтернативного выбора
expression ? expression : expression
Такие неопределенности устраняются скобками. Что и было продемонстрировано