2013-11-13 2 views
4
#include "stdio.h" 

int main() 
{ 


    int x, y; 

    y=x(5); 
    return 0; 
} 

MSVC 2010 компилятор выдает следующую ошибку:Является ли это семантической ошибкой или синтаксической ошибкой?

Error 1 error C2064: term does not evaluate to a function taking 1 arguments c:\users\ae\documents\visual studio 2010\projects\text\text\text.cpp 13 

2 IntelliSense: expression must have (pointer-to-) function type c:\users\ae\documents\visual studio 2010\projects\text\text\text.cpp 13 

Является ли это семантическая ошибка или ошибка синтаксиса?

+0

Ошибка типа недопустимого операнда - это семантическая ошибка, ошибка синтаксиса - ошибка, которая недопустима в соответствии с синтаксисом языка (правильный формат). 'y = x (5);' каждый токен действителен и может корректно анализировать (поскольку 'x' является допустимым именем функции). но вещь 'x' не является функцией, она' int' жизнеспособна, вы не можете называть ее своего рода недопустимым операндом, поэтому семантическая ошибка .-- ПРИМЕЧАНИЕ: '5 (x)' будет синтаксической ошибкой. –

+0

Также добавлен еще один пример семантической ошибки 'int a [10]; * p; 'then' ++ a' будет семантической ошибкой, но не синтаксисом. Хотя '++ p' действительно. –

+0

Чтобы доказать это, попробуйте это: напишите '#include int main() {int y; y = x (5); return 0;} '(удаляется' x' из объявления), затем скомпилируется с флагом '-c' с gcc, который он компилирует. но попытайтесь связать его с файлом заголовка с объявлением 'x' как переменной int, это вызовет ошибку. Следовательно, 'y = x (5);' синтаксически корректно, а не синтаксическая ошибка. –

ответ

2

Если бы это была синтаксическая ошибка, это было бы так. Это семантическая ошибка. Все дело в значениях идентификаторов вашего кода.

3

Семантический. Было бы логично c синтаксисом, если x была функцией, которая принимала один аргумент - но это всего лишь int.

Было бы синтаксической ошибкой, если вы сделали это:

int x, y; 

y=x((5; 
return 0; 
3

Я бы сказал, что это семантическая ошибка, в частности, ошибка типа. Точная последовательность y = x(5) хорошо сформирована, а часть x(5) анализируется как выражение вызова функции. Ошибка заключается в том, что x не вычисляет указатель на функцию, а скорее int.

+1

Я хотел бы добавить, чтобы знать, что 'x (5)' недействительно, ему нужно ссылаться на таблицу символов /, чтобы узнать тип 'x', который откладывается до семантической фазы, поскольку это невозможно сделать на этапе синтаксического анализа. –

+0

@GrijeshChauhan: ну, есть много способов написать компилятор, поэтому я не хочу предполагать слишком много деталей (например, «фаз»). Я полагаю, что реальный компилятор C++ не использует первый парсер Joey Textbook ... –

+0

Да, но поскольку я знаю, что «C, поскольку формальный язык - это CSL», функция, такая как Declare first, затем использует переменную, делает ее контекстно-зависимой вместо контекста -бесплатно, и поскольку мы не знаем какой-либо эффективной методики синтаксического анализа для CSL, каждый компилятор C будет проверять работу по-прудовому типу в семантической фазе. Поэтому я добавил. –

1

Он очистит пропуск анализа синтаксиса, потому что он просто проверяет наличие там какой-либо синтаксической ошибки или нет. Я имею в виду y=x(5);,

it says that 5 in passed in function x and value returned to y.

, но смысл не назначается при разборе время, что х является целой переменной не процедура. Итак, при семантическом анализе, когда назначены логические значения, он узнает, что это невозможно.

Таким образом, рассматривая это в качестве логической ошибки мы можем сказать, что это семантическая ошибка.

Смежные вопросы