unit SemanticUnit;
interface
uses
Hash, LexemArrType;
function CheckSemantic( var L: LexemArr; var N: Integer ) : LexemArr;
function IsNum( c: char ) : Boolean ;
function IsSymbol( c: char ) : Boolean ;
function CheckNumber( s: string ) : Boolean ;
function CheckID( s: string ) : Boolean ;
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 если лексема начинается с символа
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 ] : = L[ i, 1 ] ;
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 ] : = 'SemanticERROR' ; // Иначе ошибка
N : = 0 ;
Exit;
end ;
end ;
end ;
end ;
end .
dW5pdCBTZW1hbnRpY1VuaXQ7CgppbnRlcmZhY2UKCnVzZXMKICBIYXNoLCBMZXhlbUFyclR5cGU7CgpmdW5jdGlvbiBDaGVja1NlbWFudGljKHZhciBMOiBMZXhlbUFycjsgdmFyIE46IEludGVnZXIpOiBMZXhlbUFycjsKZnVuY3Rpb24gSXNOdW0oYzogY2hhcik6IEJvb2xlYW47CmZ1bmN0aW9uIElzU3ltYm9sKGM6IGNoYXIpOiBCb29sZWFuOwpmdW5jdGlvbiBDaGVja051bWJlcihzOiBzdHJpbmcpOiBCb29sZWFuOwpmdW5jdGlvbiBDaGVja0lEKHM6IHN0cmluZyk6IEJvb2xlYW47CgppbXBsZW1lbnRhdGlvbgooCiAvLyDQktGB0L/QvtC80L7Qs9Cw0YLQtdC70YzQvdGL0LUg0YTRg9C90LrRhtC40Lgg0J/RgNC+0LLQtdGA0LrQsCDQvdCwINC/0YDQuNC90LDQtNC70LXQttC90L7RgdGC0Ywg0Log0YbQuNGE0YDQtSDQuNC70Lgg0YHQuNC80LLQvtC70YNcXAoKZnVuY3Rpb24gSXNOdW0oYzogY2hhcik6IEJvb2xlYW47CmJlZ2luCiAgUmVzdWx0IDo9IFRydWU7CiAgaWYgKGMgPiAnOScpIG9yIChjIDwgJzEnKSB0aGVuCiAgICBSZXN1bHQgOj0gRmFsc2U7CQplbmQ7CgpmdW5jdGlvbiBJc1N5bWJvbChjOiBjaGFyKTogQm9vbGVhbjsvLyDQktGL0LTQsNGB0YIgVHJ1ZSwg0LXRgdC70Lgg0YHQuNC80LLQvtC7CmJlZ2luCiAgcmVzdWx0IDo9IFRydWU7CiAgaWYgKGMgPiAneicpIG9yIChjIDwgJ2EnKSB0aGVuCiAgICByZXN1bHQgOj0gRmFsc2U7CmVuZDsKCiAvLyDQktGB0L/QvtC80L7Qs9Cw0YLQtdC70YzQvdGL0LUg0LzQvtC00YPQu9C4INCf0YDQvtCy0LXRgNC60LAg0L/RgNC40L3QsNC00LvQtdC20L3QvtGB0YLQuCDQuiDRh9C40YHQu9GDINC40LvQuCDQuNC00LXQvdGC0LjRhNC40LrQsNGC0L7RgNGDIFxcCmZ1bmN0aW9uIENoZWNrTnVtYmVyKHM6IFN0cmluZyk6IEJvb2xlYW47CnZhcgogIGk6IEludGVnZXI7CmJlZ2luCiAgUmVzdWx0IDo9IFRydWU7CiAgZm9yIGkgOj0gMSB0byBMZW5ndGgocykgRG8KICAgIGlmIG5vdCBJc051bShzW2ldKSB0aGVuIGJlZ2luCiAgICAgIFJlc3VsdCA6PSBGYWxzZTsKICAgICAgYnJlYWs7CiAgICBlbmQ7CmVuZDsKCmZ1bmN0aW9uIENoZWNrSUQoczogc3RyaW5nKTogQm9vbGVhbjsvLyDQktGL0LTQsNGB0YIgVFJVRSDQtdGB0LvQuCDQu9C10LrRgdC10LzQsCDQvdCw0YfQuNC90LDQtdGC0YHRjyDRgSDRgdC40LzQstC+0LvQsApiZWdpbgogIFJlc3VsdCA6PSBUcnVlOwogIGlmIG5vdCBJc1N5bWJvbChzWzFdKSB0aGVuIGJlZ2luCiAgICBSZXN1bHQgOj0gRmFsc2U7CiAgICBleGl0OwogIGVuZDsKZW5kOwoKIC8vINCe0YHQvdC+0LLQvdC+0Lkg0LzQvtC00YPQu9GMINCx0LjQsdC70LjQvtGC0LXQutC4LiDQn9GA0L7QstC10YDQutCwINGB0LjQvdGC0LDQutGB0LjRgdCwINCy0YvRgNCw0LbQtdC90LjRjyBcXAoKZnVuY3Rpb24gQ2hlY2tTZW1hbnRpYyh2YXIgTDogTGV4ZW1BcnI7IHZhciBOOiBJbnRlZ2VyKTogTGV4ZW1BcnI7CnZhcgogIGk6IEludGVnZXI7CiAgdDogdGV4dDsKYmVnaW4KICBpZiBOID0gMCB0aGVuIEV4aXQ7IC8vINCSINGB0LvRg9GH0LDQtSDQvtGI0LjQsdC60Lgg0LLRi9GF0L7QtNC40Lwg0LjQtyDRhNGD0L3QutGG0LjQuAogIGFzc2lnbih0LCAnSGFzaDRMZXhlbXMudHh0Jyk7CiAgZm9yIGkgOj0gMSB0byBOIGRvIAogIGJlZ2luCiAgICBSZXN1bHRbaSwgMV0gOj0gTFtpLCAxXTsKICAgIFJlc2V0KHQpOwogICAgUmVzdWx0W2ksIDJdIDo9IEhhc2hGaW5kKExbaSwgMV0sIHQpOwogICAgQ2xvc2UodCk7CiAgICBpZiAoTFtpLCAyXSkgPSAnRVJST1InIHRoZW4KICAgIGJlZ2luCiAgICAgIFJlc3VsdFtpLCAxXSA6PSBMW2ksIDFdOwogICAgICBpZiBDaGVja0lEKExbaSwgMV0pIHRoZW4gUmVzdWx0W2ksIDJdIDo9ICdJRCcgZWxzZSAvLyDQn9GA0L7QstC10YDQutCwINC90LAg0L/RgNC40L3QsNC00LvQtdC20L3QvtGB0YLRjCDQuiBJRAogICAgICBpZiBDaGVja051bWJlcihMW2ksIDFdKSB0aGVuIFJlc3VsdFtpLCAyXSA6PSAnTlVNQkVSJyBlbHNlIC8vINCf0YDQvtCy0LXRgNC60LAg0L3QsCDQv9GA0LjQvdCw0LTQu9C10LbQvdC+0YHRgtGMINC6INGH0LjRgdC70YMKICAgICAgYmVnaW4KICAgICAgICBSZXN1bHRbaSwgMl0gOj0gJ1NlbWFudGljRVJST1InOyAvLyDQmNC90LDRh9C1INC+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