unit SemanticUnit;
interface
uses
Hash, LexemArrType;
function CheckSemantic( var L: LexemArr; var N: Integer ) : LexemArr;
implementation
// Вспомогательные функции Проверка на принадлежность к цифре или символу\\
function IsNum( c: char ) : Boolean ;
begin
Result : = True ;
if ( c > '9' ) or ( c < '1' ) then
Result : = False ;
end ;
function IsSymbol( c: char ) : Boolean ; // Выдаст True, если символ
begin
result : = True ;
if ( c > 'z' ) or ( c < 'a' ) then
result : = False ;
end ;
// Вспомогательные модули Проверка принадлежности к числу или идентификатору \\
function CheckNumber( s: String ) : Boolean ;
var
i: Integer ;
begin
Result : = True ;
for i : = 1 to Length( s) Do
if not IsNum( s[ i] ) then begin
Result : = False ;
break ;
end ;
end ;
function CheckID( s: string ) : Boolean ; // Выдаст TRUE если лексема начинается с символа
var
i: Integer ;
begin
Result : = True ;
if not IsSymbol( s[ 1 ] ) then begin
Result : = False ;
exit;
end ;
end ;
// Основной модуль библиотеки. Проверка синтаксиса выражения \\
function CheckSemantic( var L: LexemArr; var N: Integer ) : LexemArr;
var
i: Integer ;
t: text;
begin
if N = 0 then Exit; // В случае ошибки выходим из функции
assign( t, 'Hash4Lexems.txt' ) ;
for i : = 1 to N do
begin
Result[ i, 1 ] : = L[ i, 1 ] ;
Reset( t) ;
Result[ i, 2 ] : = HashFind( L[ i, 1 ] , t) ;
Close( t) ;
if L[ i, 2 ] = 'ERROR' then
begin
Result[ i, 1 ] : = 'ERROR' ;
if CheckID( L[ i, 1 ] ) then Result[ i, 2 ] : = 'ID' else // Проверка на принадлежность к ID
if CheckNumber( L[ i, 1 ] ) then Result[ i, 2 ] : = 'NUMBER' else // Проверка на принадлежность к числу
begin
Result[ i, 2 ] : = 'ERROR' ; // Иначе ошибка
N : = 0 ;
Exit;
end ;
end ;
end ;
end ;
end .
dW5pdCBTZW1hbnRpY1VuaXQ7CgppbnRlcmZhY2UKCnVzZXMKICBIYXNoLCBMZXhlbUFyclR5cGU7CgpmdW5jdGlvbiBDaGVja1NlbWFudGljKHZhciBMOiBMZXhlbUFycjsgdmFyIE46IEludGVnZXIpOiBMZXhlbUFycjsKCmltcGxlbWVudGF0aW9uCgogLy8g0JLRgdC/0L7QvNC+0LPQsNGC0LXQu9GM0L3Ri9C1INGE0YPQvdC60YbQuNC4INCf0YDQvtCy0LXRgNC60LAg0L3QsCDQv9GA0LjQvdCw0LTQu9C10LbQvdC+0YHRgtGMINC6INGG0LjRhNGA0LUg0LjQu9C4INGB0LjQvNCy0L7Qu9GDXFwKCmZ1bmN0aW9uIElzTnVtKGM6IGNoYXIpOiBCb29sZWFuOwpiZWdpbgogIFJlc3VsdCA6PSBUcnVlOwogIGlmIChjID4gJzknKSBvciAoYyA8ICcxJykgdGhlbgogICAgUmVzdWx0IDo9IEZhbHNlOwkKZW5kOwoKZnVuY3Rpb24gSXNTeW1ib2woYzogY2hhcik6IEJvb2xlYW47Ly8g0JLRi9C00LDRgdGCIFRydWUsINC10YHQu9C4INGB0LjQvNCy0L7QuwpiZWdpbgogIHJlc3VsdCA6PSBUcnVlOwogIGlmIChjID4gJ3onKSBvciAoYyA8ICdhJykgdGhlbgogICAgcmVzdWx0IDo9IEZhbHNlOwplbmQ7CgogLy8g0JLRgdC/0L7QvNC+0LPQsNGC0LXQu9GM0L3Ri9C1INC80L7QtNGD0LvQuCDQn9GA0L7QstC10YDQutCwINC/0YDQuNC90LDQtNC70LXQttC90L7RgdGC0Lgg0Log0YfQuNGB0LvRgyDQuNC70Lgg0LjQtNC10L3RgtC40YTQuNC60LDRgtC+0YDRgyBcXApmdW5jdGlvbiBDaGVja051bWJlcihzOiBTdHJpbmcpOiBCb29sZWFuOwp2YXIKICBpOiBJbnRlZ2VyOwpiZWdpbgogIFJlc3VsdCA6PSBUcnVlOwogIGZvciBpIDo9IDEgdG8gTGVuZ3RoKHMpIERvCiAgICBpZiBub3QgSXNOdW0oc1tpXSkgdGhlbiBiZWdpbgogICAgICBSZXN1bHQgOj0gRmFsc2U7CiAgICAgIGJyZWFrOwogICAgZW5kOwplbmQ7CgpmdW5jdGlvbiBDaGVja0lEKHM6IHN0cmluZyk6IEJvb2xlYW47Ly8g0JLRi9C00LDRgdGCIFRSVUUg0LXRgdC70Lgg0LvQtdC60YHQtdC80LAg0L3QsNGH0LjQvdCw0LXRgtGB0Y8g0YEg0YHQuNC80LLQvtC70LAKdmFyCiAgaTogSW50ZWdlcjsKYmVnaW4KICBSZXN1bHQgOj0gVHJ1ZTsKICBpZiBub3QgSXNTeW1ib2woc1sxXSkgdGhlbiBiZWdpbgogICAgUmVzdWx0IDo9IEZhbHNlOwogICAgZXhpdDsKICBlbmQ7CmVuZDsKCiAvLyDQntGB0L3QvtCy0L3QvtC5INC80L7QtNGD0LvRjCDQsdC40LHQu9C40L7RgtC10LrQuC4g0J/RgNC+0LLQtdGA0LrQsCDRgdC40L3RgtCw0LrRgdC40YHQsCDQstGL0YDQsNC20LXQvdC40Y8gXFwKCmZ1bmN0aW9uIENoZWNrU2VtYW50aWModmFyIEw6IExleGVtQXJyOyB2YXIgTjogSW50ZWdlcik6IExleGVtQXJyOwp2YXIKICBpOiBJbnRlZ2VyOwogIHQ6IHRleHQ7CmJlZ2luCiAgaWYgTiA9IDAgdGhlbiBFeGl0OyAvLyDQkiDRgdC70YPRh9Cw0LUg0L7RiNC40LHQutC4INCy0YvRhdC+0LTQuNC8INC40Lcg0YTRg9C90LrRhtC40LgKICBhc3NpZ24odCwgJ0hhc2g0TGV4ZW1zLnR4dCcpOwogIGZvciBpIDo9IDEgdG8gTiBkbyAKICBiZWdpbgogICAgUmVzdWx0W2ksIDFdIDo9IExbaSwgMV07CiAgICBSZXNldCh0KTsKICAgIFJlc3VsdFtpLCAyXSA6PSBIYXNoRmluZChMW2ksIDFdLCB0KTsKICAgIENsb3NlKHQpOwogICAgaWYgTFtpLCAyXSA9ICdFUlJPUicgdGhlbgogICAgYmVnaW4KICAgICAgUmVzdWx0W2ksIDFdIDo9ICdFUlJPUic7CiAgICAgIGlmIENoZWNrSUQoTFtpLCAxXSkgdGhlbiBSZXN1bHRbaSwgMl0gOj0gJ0lEJyBlbHNlIC8vINCf0YDQvtCy0LXRgNC60LAg0L3QsCDQv9GA0LjQvdCw0LTQu9C10LbQvdC+0YHRgtGMINC6IElECiAgICAgIGlmIENoZWNrTnVtYmVyKExbaSwgMV0pIHRoZW4gUmVzdWx0W2ksIDJdIDo9ICdOVU1CRVInIGVsc2UgLy8g0J/RgNC+0LLQtdGA0LrQsCDQvdCwINC/0YDQuNC90LDQtNC70LXQttC90L7RgdGC0Ywg0Log0YfQuNGB0LvRgwogICAgICBiZWdpbgogICAgICAgIFJlc3VsdFtpLCAyXSA6PSAnRVJST1InOyAvLyDQmNC90LDRh9C1INC+0YjQuNCx0LrQsAogICAgICAgIE4gOj0gMDsKICAgICAgICBFeGl0OwogICAgICBlbmQ7CiAgICBlbmQ7CiAgZW5kOwplbmQ7CgplbmQu
compilation info
Free Pascal Compiler version 2.6.4+dfsg-4 [2014/10/14] for i386
Copyright (c) 1993-2014 by Florian Klaempfl and others
Target OS: Linux for i386
Compiling prog.pas
prog.pas(1,6) Error: Illegal unit name: SemanticUnit
prog.pas(6,3) Fatal: Can't find unit Hash used by SemanticUnit
Fatal: Compilation aborted
Error: /usr/bin/ppc386 returned an error exitcode (normal if you did not specify a source file to be compiled)
stdout