Имплементирано нотирање "тачкасте листе"

This commit is contained in:
Petar Kapriš 2019-02-06 16:44:39 +01:00 committed by Petar Kapriš
parent 44b57a004b
commit 6950d27610
3 changed files with 40 additions and 0 deletions

View file

@ -5,6 +5,7 @@
char *errors[] = char *errors[] =
{ {
"Конс објекат мора бити правилна листа да би могао бити евалуиран", "Конс објекат мора бити правилна листа да би могао бити евалуиран",
"Неправилан конс \".\" оператер",
"Неправилан тип аргумента прослеђен функцији", "Неправилан тип аргумента прослеђен функцији",
"Непознати симбол", "Непознати симбол",
"Објекат није примењив", "Објекат није примењив",

38
read.c
View file

@ -413,6 +413,44 @@ object macroFunction(wchar_t m)
SIGERR(ERR(error)); SIGERR(ERR(error));
} }
int properDotComb = 1, dotPlace = -1, length;
object *dot;
for (length = 0, listCurrent = &result; TYPE(*listCurrent) !=
nilObject; ++length, listCurrent = &CDR(*listCurrent))
{
if (TYPE(CAR(*listCurrent)) == symbolObject &&
!strcmp(SYM(CAR(*listCurrent)), "."))
{
if (dotPlace == -1)
{
dotPlace = length;
dot = listCurrent;
}
else
{
properDotComb = 0;
break;
}
}
}
if (dotPlace != -1)
{
if (dotPlace != length - 2 || dotPlace == 0)
{
properDotComb = 0;
}
}
if (!properDotComb)
{
SIGERR(improperDotNotation);
}
if (dotPlace != -1 && properDotComb)
{
object tmp = copyObject(CAR(CDR(*dot)));
deleteObject(*dot);
*dot = tmp;
}
return result; return result;
break; break;
case L')': case L')':

1
util.h
View file

@ -51,6 +51,7 @@ typedef enum
typedef enum typedef enum
{ {
improperListError, improperListError,
improperDotNotation,
typeError, typeError,
unrecognizedSymbolError, unrecognizedSymbolError,
notApplicableError, notApplicableError,